2012年2月28日火曜日

PDP-11 on FPGA勉強会構想

PDP-11 on FPGA勉強会(仮)の構想をゆるゆると固めている。今のところはこんなイメージ。

目標
  • FPGA上で動くPDP-11の動作を理解する。
手段
  • FPGAを実際に動かしながらOpenCoresによるPDP-11のうちCPU部分のソースコード(およそ9,500行)を読んで概要を把握する。
前提知識
  • PDP-11とVHDLの基礎(身につけながらの参加も歓迎)。
  • PDP-11のハンドブックなどドキュメントを理解できる程度の英語力。
開催ポリシー
  • 2012年夏から月1程度、1年間くらい?
  • 基本は東京都内。温泉合宿もやりたい。たまには地方巡業も?
  • 内容は濃厚。参加者にある程度負荷あり。
環境
  • LinuxのXilinx開発環境とghdl(必須)
  • FPGAボード(強く推奨。あると勉強会を256倍楽しめる)。AvnetのMicroboardが標準環境。DigilentのS3board, Nexys2, Nexys3等でもOK
内容
  • 発表パートと実技パートを設ける。
  • 発表者を毎回決めて持ち回り。自己紹介を兼ねて全員LT。
  • 実技パートでは、発表パートの内容をエミュレーターやFPGA上で動かして確かめる、など。

初回メニュー

発表パートその1:
  • PDP-11のシステム概観とFPGAでの実現
  • CPU部分の構成
  • pdp11_lunit.vhd解説
  • 2プロセス法について
実技パート:
  • Xilinxツール概観
  • pdp11_lunitの動作検証
  • pdp11_lunitの波形を見る
発表パートその2:
  • 全員LT
最後に次回内容を決めて解散。
2次会はほどほどに。

LinuxでXilinx ISE

Xilinxのツール類をUbuntuで使って変な工夫をするはめになっているが、そもそもサポート外らしい。一覧によると、サポートされているLinuxは
  • Red Hat Enterprise Linux 4 WS32/64bit
  • Red Hat Enterprise Linux 5 WS32/64bit
  • SUSE Linux Enterprise 11 32/64bit
 なので素直にこのへんで環境を用意するのが最善だろう。なお、リリースノートによると13.3以降では
  • Red Hat Enterprise Linux 6 WS32/64bit
もサポート対象に加わっている模様。

2012年2月25日土曜日

w11aをAvnet Microboardに移植

Avnet Microboard(秋月電子などで安価に入手できるXilinxのSpartan-6搭載のFPGA開発ボード)でOpenCoresのPDP-11が動いた。差分は最新のw11a_V0.55に対するパッチにまとめてある。具体的な動かし方などはOpenCoresのサイトや、アーカイブ中のドキュメントを参照。@magoroku15さんによる解説は非常に参考になる。


動作はUbuntu 10.04上のXilinx ISE 13.4で確認した。(私が買った時点でMicroboardに付属していた)13.2や13.3でも問題なく動作するはず。

MicroboardのオンボードのLEDやスイッチ、ボタンが貧弱であまり役に立たない。とりあえずDIPスイッチを(左から右へ)下上下下と設定しておくのを忘れなければ動くはず。

メインメモリはFPGA内蔵のblock RAMのみ使用しているので、64kbyteしかない。UNIX Version 5はちゃんと動くが、2.11BSDはboot中に例外が発生して停止してしまう。

MicroboardにはLPDDR SDRAMがたっぷり乗っているのでこちらをメインメモリにすれば2.11BSDも動くはず。そのためにはSpartan-6内蔵のメモリコントローラを利用するなど多少手間がかかるので、そのあたりは今後のお楽しみ。

2012年2月5日日曜日

ChipScope Pro Inserter をコマンドラインで使う(2)

ChipScope Pro Inserterを使うと、解析用のロジアナ等の回路を既存のngcに組み込むことができる。command lineからの使い方にはちょっと癖があってドキュメントだけではわかりにくいのでメモ。

まず、inserter -createで記述ファイルの雛形 *.cdcをつくる。この段階では何の情報も入力しない。したがって出力は実質、空。

つぎに、inserter -editで記述ファイルの中身を埋める。ここはGUIが起動する。引数にパーツ番号 -p xc6slx9-csg324-2 等を忘れず指定する必要がある(GUIの編集画面は何故か使えない)。ngdを生成するが、この段階のngdの必要性は謎。

最後に、inserter -insertで実際に回路をngcに追加する。この段階はcommand lineのみで処理できる。

ChipScope等のライセンスが必要となるのはngdbuildをかけるとき(きちんと確認してない)。したがって、inserterはwebpackでも実行可能。

2012年1月31日火曜日

w11でOSを実行する

FPGA上のPDP-11には各種デバイスは載っていない。実際にOSを実行する際には、PC上でハードディスクやシリアルによるコンソール接続をエミュレートするサーバーを動かして、FPGAと通信してデバイスの機能を提供する。その際、rlinkという専用の通信経路を使う。rlinkはPDP-11を動作させるためのインフラなので、PDP-11にとっては見えない。実際のFPGAボードではrlinkの入出力はおもにシリアル経由のUSBを利用する。

エミュレーターの場合は事情がすこし異なる。エミュレーター内の状態の変化を取り出すには、専用のインターフェースが必要である。w11aで提供されているghdlの場合、rlinkへの入出力部分はVHDLの記述をC言語で拡張したインターフェースによりnamed pipe経由で通信する。こういった拡張はエミュレーター依存であることに注意。

XilinxのISimなら実際のハードウェアに近いエミュレーションが可能なのだが、現在提供されていない。ISimはtclスクリプトによるコントロールが可能なので、これを使ってインターフェースを作ればいいはず。

ChipScope Pro Inserter をコマンドラインで使う(1)

XilinxのFPGAをJTAG経由で解析できるChipScope Proは、統合環境のISEだけでなくコマンドラインからも利用できる。詳しくはXilinxのドキュメントUG029であるChipScope Pro Software and Coresに詳しい記述がある。以下は、その際の注意書きである。

inserterを使う場合、Ubuntu 10.04では妙ちくりんなエラーが出た。

$ inserter
/opt/Xilinx/13.3/ISE_DS/ISE/bin/lin/unwrapped/cs_common.sh: 76: XIL_DIRS[0]=/opt/Xilinx/13.3/ISE_DS/ISE/: not found
/opt/Xilinx/13.3/ISE_DS/ISE/bin/lin/unwrapped/cs_common.sh: 76: count++: not found
/opt/Xilinx/13.3/ISE_DS/ISE/bin/lin/unwrapped/cs_common.sh: 152: Syntax error: Bad for loop variable
このcs_common.shというのは環境設定か何かをしているshell scriptで、先頭が#!/bin/shとなっているにもかかわらず、拡張文法を使っているのでshはエラーになる。bashなら処理できそうなので先頭を書き換えてみたが、症状は変わらない。どこかで/bin/shを決め打ちで呼んでいるようだ。したがって、/bin/shを/bin/bashに入れ替えるなどの対策が必要となる。


2012年1月4日水曜日

LinuxからAvnet Spartan-6 LX9 MicroBoardをプログラミングする

Avnet Spartan-6 LX9 MicroBoardのでかいほうのUSBの口にはAtmelのマイコンがぶらさがっていて、Digilentのfirmwareが乗っている。つまり、DigilentのUSB-jtagデバイスに見える。

これを操作するためのコマンドやライブラリーのたぐいは
/opt/Xilinx/13.4/ISE_DS/ISE/bin/lin/digilent/
に移動して(「13.4」はインストールしてあるISEのバージョン番号に置き換える)
./install_digilent.sh
を実行するとインストールできる(本来はISEのインストール時にインストールされるのかもしれないが未確認)。

Digilentから公開されている新しいファイルなどの情報は以下。
http://lighttomorrow.wordpress.com/2011/12/18/how-to-install-digilent-cable-driver-for-xilinx-design-suite-on-ubuntu-11-10/

bitstream(.bit)をMicroBoardに流し込むには、バッチファイルを作って、impactに渡す。

impact -batch foobar.impact

foobar.impactの中身はこんな感じ。

setMode -bscan
setCable -port auto
identify
assignfile -p 1 -file foobar.bit
program -p 1
quit

この時点ではfpgaのRAMに書かれているだけなので、リセットや電源を切ると忘れてしまう。

フラッシュROMイメージ.mcsの生成には以下のようなバッチファイルを使う。

setMode -pff
setPreference -pref StartupClock:Auto_Correction
setSubmode -pffspi
addDesign -version 0 -name "0"
addDeviceChain -index 0
addDevice -spi N25Q128 -p 1 -file foobar.bit
generate -format mcs -generic -spi -fillvalue FF -output foobar.mcs
quit

フラッシュROMイメージ.mcsの書き込みには以下のようなバッチファイルを使う。

setMode -bs
setCable -port auto
Identify -inferir
attachflash -position 1 -spi N25Q128
assignfiletoattachedflash -position 1 -file foobar.mcs
Program -p 1 -dataWidth 1 -spionly -e -v -loadfpga
quit
といってもimpcatを使ったROMイメージの書き込みはものすごく遅い。WindowsであればDigilentのSerial Flash Utilityを使ったほうがお手軽のようだ。そのへんのまとめが発売元の掲示板にあって参考になる。