NP1003応用例@ FPGA OS(仮称)
発表日 2003年5月3日
FPGA OS(ver0.1)は、FPGAにコマンドラインインタフェースを実装し、各種操作を行うことができる、FPGAのためのOSです。すべての機能がステートマシンでハードコードされており、世界最速のコンソールだと思います。
せっかくRS232CやUSBでFPGAと通信できるのに、アプリがエコーバックや+1した文字を返すだけじゃつまらないという方にも、おすすめです。
ソースはGPLライセンスの下に、オープンソースで公開しています。
Let's interface to FPGA with command line !!!
FPGA OS(ver0.1)をNP1003に実装した場合、すぐに次のことができるようになります。
- USBシリアル(仮想COMポート)を通じたコマンドラインインターフェース
- ブロックRAMの内容をメモリダンプ
- ブロックRAMの内容をメモリ書き換え
- FPGAのI/Oへデータを出力
- FPGAのI/Oからデータを入力
- ヘルプ機能
仮想COMポートでFPGA OSを操作するときは、手頃なターミナルソフトで使用します。下のイメージでは、Teratermを使用しています。
FPGA OSには、次のコマンドがあります。各コマンドは大文字小文字のどちらでも受け付けます。
コマンド | 引数 | 動作 |
d | なし | メモリの内容をダンプする |
m | アドレス(16進,000〜1FF) データ(16進) | メモリの内容を変更する |
o | データ(16進) | 指定されたポートにデータを出力する |
i | なし | 指定されたポートからデータを入力する |
v | なし | バージョン情報を表示する |
h | なし | オンラインヘルプを表示する |
ダンプコマンド
ダンプコマンドは、メモリ(ブロックRAM バンク0)の内容をダンプします。前の図にメモリダンプの際の表示があります。図で3桁の16進数字はダンプするアドレスで、いっぱい並んでいる2桁の数字はメモリの内容です。
本コマンドは、引数はとることができません。ブロックRAM0の000〜1F0を必ずダンプします。
メモリモディファイコマンド
メモリモディファイコマンドは、メモリ(ブロックRAM バンク0)の内容を変更します。「m」の後に000〜1FFまでのアドレスを3桁の16進で入力し、その後に書き込む値を2桁の16進で入力します。スペースは不要です。もし、文法が間違っている場合はエラーを表示し、書き換えは行われません。
例) m1235a … メモリ0x123番地に0x5aを書き込む
出力コマンド
出力コマンドは、指定されたポートからデータを出力します。「o」の後に1桁もしくは2桁の16進で入力します。スペースは不要です。もし、文法が間違っている場合はエラーを表示し、出力は行われません。
なお、「指定されたポート」とはデフォルトではUSER[19:12]に割り当てられています。このポートにLEDの配線を行えば、仮想COMポートからLEDを光らせることができます。
なお、データを16進1桁で指定した場合は、データは下4ビットに出力されます。上4ビットはゼロクリアされます。
例1) o51 … USER[19:12]に0x51を出力する。
例2) o2 … USER[15:12]に0x2を出力し、USER[19:16]に0を出力する。
入力コマンド
入力コマンドは、指定されたポートからデータを入力します。引数はありません。
なお、「指定されたポート」とはデフォルトではUSER[35:28]に割り当てられています。このポートにスイッチ等をつなげば、仮想COMポートからその状態を読むことができます。なお、表示は16進です。
例1) o51 … USER[19:12]に0x51を出力する。
例2) o2 … USER[15:12]に0x2を出力し、USER[19:16]に0を出力する。
バージョン表示コマンド
バージョン表示コマンドは、FPGA OSのバージョンを表示します。引数はありません。
ヘルプ表示コマンド
バージョン表示コマンドは、簡単なヘルプを表示します。引数はありません。
VHDLソースの一部を次の表に載せます。出力するI/Oポート、入力するI/Oポートを変更したい場合は、その該当する部分を変更してください。ソースコードの全部は、このページの最後に載せています。
begin
-- ****************************************
-- MODIFY HERE TO CUSTOMIZE I/O
InputData <= USER(35 downto 28);
USER(27 downto 20) <= (others=>'0');
USER(19 downto 12) <= OutputData;
USER(11 downto 6) <= (others=>'0');
USER(5 downto 0) <= GStateL;
CLK <= CLK0;
-- ****************************************
|
※USER[5:0]をGStateL(インタプリタステートマシン)の状態を出力するように割り当てていますが、これは外さないでください。論理合成がうまくできなくなることがあります。原因は究明中です。
それ以上のカスタマイズは、バージョン0.2が出るのを待ってください。
普通は、一度FPGAが動き出してしまったら、中がどうなっているかなんて、わかりません。適当な信号を出力させ、オシロやロジアナで見たり、シミュレーションとにらめっこしてますね。
もし、FPGAではなくてCPUのデバッグなら、モニタプログラムの上で走らせたり、レジスタの値を操作したり、いろいろなデバッグ環境が整っていますよね。でも今まで、FPGAにはそんなものはありませんでした。
FPGA OSを使えば、FPGAの内部回路にコンソール経由でアクセスできるようになるため、動き出したFPGAの、レジスタを書き換えたり、各部の状態を知ることは簡単にできてしまいます。さらに、ブロックRAMの内容だって書き換えられます。
まだまだおもちゃ程度なので、ブロックRAMの内容を書き換えて、コマンドプロンプトやヘルプメッセージの内容が書き換わるのを見て遊んだり、LEDを光らせたりして楽しむことしかできませんが、動いているFPGAの各部を外部PCから自由に操作できるというのが最大の特徴です。
今後の方針
目下の目標は、拡張を容易にすることと、回路サイズを小さくすることです。FPGA OS(ver0.1)はXC2S30のスライスを99%も使用してしまいます。最適化オプションを調整すれば70%くらいまで圧縮することができますが、機能を保ちつつもっともっと回路規模を減らすのが目標です。
ちなみに、メモリ書き換え機能や入力機能を省けば、最適化オプションを調整しなくても60%くらいまで削減できています。
なお、USBの部分をRS232Cに置き換えれば、ヒューマンデータさんの各種SpartanIIボードや、モルフィー企画さんのVirtex300Eボードにも載ると思います。それは後ほど・・・
配布条件はGPLです。
- VHDLソース fpgaos01.vhd ・・・メインのソースコード
- UCFファイル fpgaos01.ucf ・・・ピン配置とブロックRAMの初期値
- WebPACKプロジェクトファイル fpgaos.npl
上のソースから最終的に出来上るファイルは、次のMCSファイルです。
- MCSファイル fpgaos01.mcs ・・・コンフィグROMに書き込むファイル
USBのデバイスドライバとして、FTDI社の仮想COMポートドライバが必要です。FTDI社のページから無料でダウンロードできます。
http://www.ftdichip.com/FTWinDriver.htm
VCPドライバの、R8062115.zipというファイルをダウンロードして、インストールしてください。私のPCでは、NP1003がCOM4として認識されました。
また、仮想COMポートドライバ以外にも、D2XXといわれる「ダイレクト」ドライバがあります。これを用いてもインタフェースできますが、通信アプリケーションを自分で作成する必要があります。
http://www.ftdichip.com/FTD2XXDriver.htm
D2XXドライバのD10504.zipというファイルをダウンロードしてインストールしてください。このデバイスドライバは、どちらかというと自分でアプリケーションを作る人向けです。
これら2つのドライバは同時にはインストールできません。片方を使うときには、もう片方をアンインストールしてください。
|