概要 機能 使用イメージ 使い方 カスタマイズ 応用例 ダウンロード デバドラ 戻る

NP1003応用例@ FPGA OS(仮称)

発表日 2003年5月3日

FPGA OSとは

 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に実装した場合、すぐに次のことができるようになります。

  1. USBシリアル(仮想COMポート)を通じたコマンドラインインターフェース
  2. ブロックRAMの内容をメモリダンプ
  3. ブロックRAMの内容をメモリ書き換え
  4. FPGAのI/Oへデータを出力
  5. FPGAのI/Oからデータを入力
  6. ヘルプ機能


使用イメージ

 仮想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です。

  1. VHDLソース fpgaos01.vhd ・・・メインのソースコード
  2. UCFファイル fpgaos01.ucf ・・・ピン配置とブロックRAMの初期値
  3. WebPACKプロジェクトファイル fpgaos.npl
 上のソースから最終的に出来上るファイルは、次のMCSファイルです。
  1. MCSファイル fpgaos01.mcs ・・・コンフィグROMに書き込むファイル

PC側の準備

 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つのドライバは同時にはインストールできません。片方を使うときには、もう片方をアンインストールしてください。