◆PSM3DのドキュメントINDEX
とりあえず、てっとり早く動かしてみたい方は、こちら
◇はじめに
本ドキュメントの本文や図や表は、RTLやCソースを読む時の参考とお考えください。
ソースの内容と、ドキュメントの内容は、なるべく一致させるよう努力するつもりですが、もし一致しない部分がありましたら、ソースの方が正しいです。
◇PSM3Dのプログラミングモデル
こちら
◇命令セット
32bit固定長です。
筆者にとっての作りやすさを重視してます。 たとえば、レジスタ指定のフィールドは4ビット境界をまたがないとか・・・
こちら
◇プロセッサコアの構成
こんな感じです。
◇プロセッサコアのブロック図
こんな感じです。(でかい図ですみません)
◇FPGAの全体
こんな感じです。
◇周辺も含めたメモリマップ
こちら
◇周辺回路のレジスタ表
こちら
◇VGA-IFに関して補足
2面を合成しながらVGA(640×480)出力します。
◇内部バスのプロトコル
シングル転送しかできないSBUS1と、これをバースト転送できるように拡張したSBUS2があります。
SBUS1
SBUS2(1/2)
SBUS2(2/2)
◇デバッグ機能について
UARTを使って、PCからFPGA内部へアクセスできるようにしてます。
こんな感じです。
dbgUart部の詳細
通信コマンド表
この部分に関しては、汎用性が高いので、いろんな部分に応用できると思います。
このdbgUartを使って、オンチップデバッグ機能(FPGA全体ブロック図中のP3dDbg)をアクセスして、デバッグ機能を実現しています。
P3dDbgのレジスタ表はこれです。
◇DDR-IFについて
6マスタのDDRメモリインターフェースです。
各マスタの優先順位は固定です。
CPU側のクロックと、DDRのクロックが非同期の為、アービタとDDR-IF部の間にFIFOを挟んでます。
このFIFOはライトバッファとしても機能するので、ライト側の性能はそこそこですが、
READ側は、コマンドの行きと、READデータの戻りで非同期FIFOを2回通過するので、レイテンシが大きいです。
このため、キャッシュOFFだとCPUの性能が悲しいほど低下します。
また、VGA-IFでは、この問題を回避する為、READデータの到着を待たずに、連続してREADコマンドを発行することで帯域を確保しています。
DDR-IF部のブロック図はこちら
◇アセンブラ
筆者はボーランドのC++コンパイラでコンパイルして使ってます。
HDLの検証用のプログラムを作る為にと思って作り始めたものを、その場の思いつきで、いきあたりばったりに機能追加しているので、癖が強く、又ソースの方もひどい状態ですが、どうかご容赦ください。
プログラムの記述の仕方ですが、下記のデモプログラムのソース(拡張子が.asm)と、命令セット表などを参考にしてください。
Cコンパイラをただいま作成中ですが、もしCコンパイラを完成させる事が出来たら、アセンブラも全面改定する予定なので、アセンブラの記述の仕方もその時変わるかもです。ご容赦を。。
◇デモプログラム
プロセッサ0で、
全画面クリア → 1bit/ピクセルの画像データを、4bit/ピクセルに展開を繰り返しています。
また、タイマ割込みでスイッチの状態を検査し、なにか変化があったら、画面をスクロールさせます。
プロセッサ1では、
全画面クリア → 4つの頂点を結ぶ6本の線分を描画を繰り返しています。
また、タイマ割込みで、1秒周期で、LED表示をカウントアップしています。
ちなみに、CPUの描画とVGAの表示周期との同期を取ってないので、若干画面がちらつきますが、笑って許して下さい(^^;
◇デバッガ(ICE)
初めてC#を使って書きました。
#defineで定数を定義しようとして、いきなりコケる所からスタートしました。
これが無いとデモソフトが動かせないので公開していますが、はずかしいのでソースはあまりジロジロ見ないでください(汗)
使い方はこちらを参照してください。
◇FPGAのコンパイルの仕方
こちらを参照してください。