SPARTAN Flash ROM対応

この流れでいけば、次はALTERAのコンフィグレーションROMへのアクセス部分であるが、これについては資料が不足気味だったの後回しにせざるをえない。
GADGET FACTORY社のPapilio Proボードは、それなりに安価で SPRATAN3E に比べて高機能で新しい SPARATAN 6を搭載しており、FT2232Dでコンフィグレーションができるようになっている。
http://papilio.cc/index.php?n=Papilio.Papilio

zftprg6

そこで、このFPGAボードに対応できるよう機能を追加することにした。SPRATAN6の書き込み処理方法は、SPRATAN3Eとほぼ同じであり、チップIDなどの初期パラメータを少し変更するで簡単に対応が可能であった。Papilio Proの コンフィグレーションROM部分は、容量サイズが大きく安価なSPI Flash ROM が使用されており、これへの書き込みルーチンを作成することになった。このSPI Flash ROMへのアクセスは思ったより大変であった。なぜならJTAGからはXILINXのコンフィグレーションROMのようには直接アクセスできないからである。
GADGET FACTORY社のソフトウェア・アーカイブを探すと Papilio 用のコンフィグレーション・ソフトウェアがソース付きでアップロードされていた。これを解析することになるのだが、JTAG<->SPI間のやりとりを記述するだけでなく、それらの処理の前にFPGAチップ自体に処理を中継するプログラムをコンフィギュレーションすることが必要であった。このハードウェア言語で記述されるプログラムは、FPGAチップの種類に応じて複数用意する必要がある。これはVerilog HDLで書き換えて作成しなおした。

Papililo Proに搭載されている Flash ROMの容量は、64Mbitsと大きなサイズであり、その全体を消去するイレースやリードに多くの実行時間がかかることなる。リードについてはアドレス範囲指定して読める機能を今後つけたいと考えている。

ALTERA コンフィグレーションROM 対応

ALTERA社のFPGAのボードには、JTAGのダウンロードポートと、ASDIのダウンロードポートが付いており、コンフィグレーションROMへのアクセスには、ASDIポートを利用するのが一般的である。SRUNNERは、パラレルケーブルをASDIポートに接続してROMにアクセスするためのソフトウェアである。秋月のFT2232DモジュールをASDIポートに接続して、MPSSEによりコンフィグレーションROMアクセスを実現することはできた。しかし、FPGA_BASEにはASDIとは接続されていないので、この方法ではFPGA_BASEボードからコンフィグレーションROMへアクセスするという目的が達成できていない。

zftprg6

Cycloneには、B-SCANと呼ばれるJTAGを通してI/Oポートの状態を取得したり、入出力設定をセットすることができる機能を備えている。そこで、コンフィグレーションROMと接続してるFPGAチップ上のI/O端子をB-SCANを使ってセット/リセットすることでアクセス信号を作りだし、対応することを試してみた。処理部分はASDIのルーチンと同様であるが、B-SCANの部分はかなり面倒な処理になりスピードも遅い。それはB-SCAN処理はすべてのI/Oピンに対して処理するしかなく、特定のピンのみを設定することはできない。1つのI/OピンのON/OFFの制御する操作のためだけでCycloneでは69ピンのセットが必要になり転送するデータ量も膨大になり、とても実用的に使用できないレベルであった。

この時点でお手上げ状態であったが、Quartus II のROMへのコンフィグレーションの動きを調べてみた。すると書き込み処理の前にXILINXのSPI Flash ROMへの書き込み処理と同じようにFPGAへSerial Flash Loaderを組み込みそのハードウェア・プログラムを通して書き込みを行っていることが解った。Serial Flash Loaderは、Quartus IIの MegaWizard Plug-In Managerを使って構築することが可能であるのだが。実際Verilog HDLで書くことは試行錯誤の連続であり、実際に正常に書き込みができるようになるためはテストプログラムを何本も記述する必要があった。書き込み処理部分は、SRUNNERの処理と同様の内容を作成して対応した。書き込み/読み出しはできるのだがそのデータが誤っており、その問題を解決しなければならなかった。そこでプログラム命令およびコンフィギュレーション データを含む ASCII ファイルである.SVFをQuartus IIのコンバート機能を使って生成し、その記述内容を解析することで独特の動作を把握し、今まで作成した処理を大幅に修正することでなんとか問題を解決することができた。
コマンドバージョンは、この段階でほぼ目的を達成したので完成とした。

Windows GUI カバー対応

Windows GUIのカバーを被せることに着手した。
Visual C++ とMFC を駆使してGUI処理を作ることになる。コマンドバージョン部分は、汎用のC++で書かれているが、それに対してMFCは独自のC++の使い方が必要であり、その整合性の調整には苦労する点が多かった。

zftprg7

基本的には、GUI操作により適切なコマンドラインの文字列を生成して、それをコマンドラインバージョンのプログラムに渡す方法で実現した。したがって、GUIの表示には生成されたコマンドを表示するようにするとともに、エディタコントロール部にコマンドを直接入力しての操作も可能としそれの操作履歴も使えるようにした。

ただ、ここでまた問題が発生した。ROM等の長時間のアクセスを行うときすべての処理がコマンドを実行することに費やされ、Windows GUIのプログラムとしては相応しくない。

zftprg8

そこでコマンド処理を優先度の高いThread処理として、コマンド処理の裏でWinodwsのメッセージ処理も行えるように修正した。また、その処理の追加によりコマンドを途中で止めることもできるようになったため、ストップボタンも追加することができた。だたし、ROMのイレース処理は途中で止めると問題が発生するため、止めることはできない。

FPGAコンフィグレーション・プログラム ZFtprg

当初の予定より、かなり作業期間を要したが、ある程度目標の機能を持つプログラムが完成したので、このレベルで公開することにします。
まだ、問題を内包していると考えられます。今の段階では動作テストを行っていただければと思います。動作報告・感想等を

FPGAコメントへお寄せ下さい。FPGAコメント

ZFtprg の連続操作 動画を示します。

ZFtprg Ver.0.12