2012年4月20日金曜日

XilinxのUSBケーブルの中身

CPLDやFPGAに設定を書き込む(プログラミングやダウンロードと呼ばれる)にはJTAGインターフェースを使うが、PCには標準的なJTAGインターフェースがない。そこで、何らかの接続インターフェースを経由する必要がある。ちょっと前までは(昔、プリンター接続に使われていた)パラレルポートを使うのが一般的だったが、最近はUSB接続が当たり前になってきた。USB接続のスピーカーやキーボードは標準的なプロトコルが規定されているが、JTAGにはそういったものがなく、メーカーごとに独自のインターフェースを用意している。

Xilinxでは「プラットフォームケーブルUSB」というシリーズのケーブルを販売しており、要するにUSBからJTAGへの変換ケーブルである。WindowsやLinuxにデバイスドライバーをインストールすれば使えるようになるのだが、ちょっと気になったので調べてみたらなかなかおもしろい。

実はこの「プラットフォームケーブルUSB」自身がプログラマブルにできていて、デバイスドライバーが毎回設定を書き込んでいる。しかも、プログラマブルなパートとしてCypress社のEZ-USBシリーズ(8051プロセッサにUSBインターフェースを統合したもの)と、Xilinx社のCPLDであるXC2C256があり、それぞれの設定ファイルを書き込む仕組みになっている。書き込みに使われるのはそれぞれfxloadとimpactである。

CentOS 6.2の場合、Xilinx ISEをインストールしただけだと、設定ファイルの記述をしくじっていてfxloadがうまく動かなかった。/etc/udev/rules.d/xusbdfwu.rulesの"$TEMPNODE"という文字列をすべて小文字に置き換えて"$tempnode"にすると問題なく動くようになる。

プログラマブルということでXilinx謹製の設定ではなく、独自開発で動かそうという猛者もいて、xsvftool-xpcuというツールが公開されている。EZ-USB(8051用のC言語で記述)やCPLD(Verilog HDLで記述)のソースコードを含んでいて、どうやらUSBプロトコルまで独自開発しているようで非常に興味深い。

さらにおもしろいのが、XilinxのテストボードSP601などの設定の仕掛けである。JTAGインターフェースがついておらずUSBしかないので一体どうなっているのかと思ったら、上記の「プラットフォームケーブルUSB」に相当する回路(EZ-USBとCPLD)が基板上に最初から載っていて、そのかわりFPGAのJTAGインターフェースが出ていない。USBでアクセスできるようにしてあるのだから生のJTAGはいらないでしょ、という理屈はもっとも。ところが、無理やり生のJTAG端子を増設する人もいておもしろい。

なお、SP601でxsvftool-xpcuが使えるか、というところまでは未検証。

2012年3月15日木曜日

Avnet MicroboardへのUSB給電

J3(マイクロUSBプラグのほう) を接続しただけでは給電しないので変だと思っていた。Avnetのフォーラムへの投稿によると、4番と5番のピンの配線が逆になっているらしい。「ハンダでつなげると使えるよ」と書いてはあるものの、普通のほうのUSBプラグをつなげれば給電できるのでそこまですることもないか。

2012年3月10日土曜日

シリアルまわりの話


OpenCoresによるPDP-11の実装ではFPGAふくむハードウェア側でPDP-11のすべてを実現するわけではない。FPGAに載るのはPDP-11のCPUと、周辺デバイスとの通信機構である。メインメモリーはFPGA内蔵のものやオンボードのDRAMなど構成により違ってくる。周辺デバイスの機能はLinux側で動くソフトウェアにより実現する。このソフトウェアがFPGAに載っているCPUと通信することによりPDP-11を実現する。通信経路として標準で用意されているのはシリアル接続(UART)で、Avnet Microboardの場合はオンボードのUSB-UART変換をおこなうCP2102が利用できる。ただし、CentOSなどディストリビューションによってはドライバーのバージョンが古く、入れ替えが必要。

DigilentのNexys3はUSB-UART変換としてFT232Rを備えていていまのところトラブルなし。Avnet Microboardの場合も、PMODコネクター経由でFT232Rを接続してこちらを使うようにすると問題なく通信ができる。

このシリアル接続がCPUと周辺機器の間のバスに相当することになる。要するに、ディスクの読み書きなどはすべてこのシリアル接続を経由する。速度の上限はCP2102で941,200baud、FT232Rでは3,000,000baudである。OpenCoresのページにも記載のとおり、ある程度のボリュームの作業をこなそうと思うとかなりの限界に感じられる。

Avnet MicroboardにFPGAの構成情報を高速に書き込めるオプションとしてDigilentのJTAG-HS1がある。Xilinx純正のFPGAの書き込みケーブル(という名前のJTAGインターフェース装置)は数百ドルするのが通例だが、これはたったの50ドルほどで格安。そのドライバーであるDigilent Adeptを見てみたら、FTDIのものがそのまま入っている。その他の情報を総合すると、JTAG-HS1はFT2232HというUSB用インターフェースチップをほとんど素の状態で使っているようだ。

JTAGインターフェースは本来、LSIピンの状態を読みだしたり書き込んだりするためのものである。これを拡張して、さまざまな情報のやり取りに使うこともできる。たとえば、上記のシリアル通信をJTAGインターフェース経由で実現すると非常に高速で使い勝手がよさそうだ。というわけでそのうち作ってみたい。

2012年3月3日土曜日

CentOS 6.2にXilinx ISE 13.4をインストールする

CentOSRedHat Enterprise Linux(RHELと略)と中身が実質的に同じ、というのが売りのLinuxディストリビューションである。Xilinx ISEはRHELを公式サポートしているので、CentOSでも問題なく動くはず、ということで最新版の6.2でインストールしてみた。

環境を準備するためにi386用CentOS 6.2のイメージを持ってきてVMware Playerにインストールする。程よい大きさのものということでLive DVD(約1.6G)を選択した。minimalは300M弱と小さくてよいが、ネットワーク設定を手動で行う必要があるなど、簡便とはいいがたい。ディスク容量は30Gbyteにした。VMware toolsのインストールやユーザー設定などは適度にやっておく。

そのままだとデバイスドライバーのインストールのみ失敗する。必要なツールなどをインストールしておこう。
% sudo yum install kernel-devel make gcc

% ln -s /usr/src/kernels/2.6.32-220.4.2.el6.i686 /usr/src/linux
% ln -s /usr/src/kernels/2.6.32-220.4.2.el6.i686 /usr/src/2.6.32-220.el6.i686
Xilinx ISE 13.4のDVDをマウントするか、Xilinxからダウンロードしてきたイメージを展開して、bin/lin/xsetupを実行する。このへんからあとはインストールとライセンスのガイドのとおりでよい。

OpenCoresのPDP-11を動かすためにはさらにパッケージをインストールする必要がある。

% sudo yum install ghdl gcc-c++ boost-devel boost-thread tcl tcl-devel

追記:

Avnet MicroboardのUSB-UARTインターフェースであるCP2102は、CentOS 6.2だとドライバーのバージョンが古いためうまく通信できない。これは簡単なパッチで修正できる(i386用カーネルモジュールパッケージそのソースパッケージを用意しておいた)。

というわけでCentOS 6.2が標準環境 として使えるようになった。

2012年2月29日水曜日

MIGについてまとめ

Avnet Microboard上のSpartan-6での利用を念頭において、MIG(Memory Interface Generator)についてまとめておく。

MIGはCore Generatorの機能の一部。ISE 13.4に乗っているのはMIG 3.9(Core Generatorには固有のバージョンはないようで13.4)。もとはbatch modeでインターフェースを生成できたようだがMIG 3.5以降、削除されている(Memory Interface Solutions User Guide UG086)。したがって、GUIを使わざるを得ない。

Spartan-6には強力なDDRメモリコントローラーが搭載されていて、その使い方はSpartan-6 FPGA Memory Controller User Guide UG388を参照。MIGで生成したインターフェースを使うことが前提になっていて、MIGの使い方はSpartan-6 FPGA Memory InterfaceSolutions User Guide UG416を参照。

Avnet Microboard用に生成してカスタマイズしたインターフェースをAvnetが用意している(MIG Traffic Generator Design (Verilog and VHDL)) 。ただしこれはMIG 3.61で生成したもので、ISE 13.4では合成できなかった。すくなくとも{icon,ila,vio}_coregen.xcoのISEをFoundation_ISEに書きなおす必要がある。Avnet用のカスタマイズはリセットのピン・電圧およびクロックのピン・電圧・周期。さらに、デバッグで取れる信号の追加。MIG 3.9で生成したインターフェースに同様の変更を加えるのは容易だろう(未確認)。

PDP-11 on FPGAに組み込むのは技術的にはそれほど難しくなさそう。ただ、このメモリインターフェースのコードは再配布できないので、利用しやすい形で公開するにはどうすればいいか、といったところで工夫が必要になるだろう。

追記(2012年3月19日):
LEON3のコードもちょうど似たような発想のことをやっていた。regen.cgc  coregen.cgp  mig.prj  mig.xcoの4つのファイルがあればコマンドラインのみでコードを生成できるようだ。この4つのファイル自体はGUIを使って生成する必要がある。

うるさいことを言うと生成したファイルが再配布可能かどうかも議論の余地があるが、Xilinxのクレジットは入ってないし再配布を禁止する文言もみつからなかったのでいいのだろう。

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を使ったほうがお手軽のようだ。そのへんのまとめが発売元の掲示板にあって参考になる。