2014年11月23日日曜日

XilinxのFPGAをSerialSlaveModeで書き込み(コンフィギュレーション)する。

FPGAのコンフィグあれこれ
を参考にした。

高価な書き込み装置が無くても、この辺りの仕組みを理解してしまえば、
自作の書き込み装置でFPGAに書き込みできるようになる。

重要なのは、自分で理解して、好き勝手にできる事だろう。

ここで問題になるのが、ISEの吐き出すFPGAに書き込むファイル、
つまり、「XXXX.bit」ファイル、あるいはBitstreamファイルの構造が良く分からない事だ。



これについて、ネットで資料を探すと、

http://www.fpga-faq.com/FAQ_Pages/0026_Tell_me_about_bit_files.htm
H8(PIC,AVR)などから SpartanII をコンフィグする手順
CMorford_Thesis.pdf
xapp452.pdf

この辺りを参考にすれば、それほど難しくない事が分かる。

むしろ問題なのは、PC ⇔ マイコン の通信かもしれない。が、それは、また今度。
EZ-USBFX2などは多少面倒だが、RS232Cで良ければ、シリアル通信(RS232C)関連
辺りが参考になるかもしれない。


[Begin_Bitstream]は、必ず「FF FF FF FF AA 99 55 66」で始まる。
実は、BitStreamファイルを一々解析しなくても、FPGA側では、
「FF FF FF FF AA 99 55 66」を合図として、
コンフィグ用のデータの開始位置と判断するので、
良く分からなくても、取りあえずシリアルで、
全てのデータを流してやればなんとなくコンフィギュレーションは上手く行ってしまう。



しかし、なんとなくでは納得が行かなかったので、一応BitStreamファイルを解析してみる。
「.bit」ファイルの構造は上記のURLの通りなので、あとは実際のファイルを解析するコードを書けばいい。
すると、大体以下のようになる。
(全体のコードの一部を抜粋しているので、多少の違和感は勘弁していただきたい。)

プログラムを書くとき、char型について、「signed char」か「unsigned char」かで、
動作が変わってくるので、そのあたりに注意して欲しい。

BitStream_HeaderReader関数。
実際にファイルを解析する部分。


上記の
BitStream_HeaderReader関数の使い方。

Tokenがa,b,c,dの場合、関数から受け取るデータはただの文字列なので、
printfでdos窓に表示させる。
eの場合は、関数から帰って来たデータを、
今回はこの後EZ-USBに送信してFPGAに書き込むことになるのだが、
それはまた別の話。EZ-USB ⇔ PC間でのデータのやり取りは、
オプティマイズのサイトが参考にしてコードを書いた。

FirmwareOfFPGAの部分には
"C:\\Xilinx_ISE\\Project\\test_led.bit"
のような感じで、bitstreamファイルのディレクトリを指定する。



結局、
BitStream_HeaderReader関数
でeを指定した場合にFPGAへの書き込みデータ、
の開始位置からのデータが取得できる。

ここでは、
Begin_Bitstream
にデータがバッファされる事になるので、
これを(私の場合はEZ-USBに送信して、)FPGAに書き込めばいい。

ここで注意する必要があるのは、
MSBfirstで書き込むのか、LSBfirstで書き込むのかという問題だ。
FPGAはどちらの仕様になっているのか?

結論を言えば……(あとで調べてどっちか書いておく。)


EZ-USB側のコード、と言うべきか……マイコン側のコードについては、
難しく考える必要は無く、単に受信したデータをif文だがfor文だかでIOポートから出力させればokです。
クロックと信号の位置が多少ずれても、FPGA側ではそこそこ高速な受信スピードで動作でする(何処かに資料があったはずなのだが……)ので、普通に受信できます。
(もちろん合ってるに越した事は無いし、程度問題はあるでしょうけれど。)
例えばSHマイコンとかならコンペアマッチタイマを使ってpwmを……など、
そこまでする必要性は全くありません。
余程高速に動作させなければいけない理由でも無ければ、無駄な努力です。


ハード的なメモ
http://the-united-front.blogspot.jp/2014/09/httpwww.html

0 件のコメント:

コメントを投稿