目的
Tang-Nano-4Kを、パソコン風味のBASICマシンとして動かすことを画策しているのだけど。
それにはパソコンに頼らない、独立した表示が必要だな。 折角HDMI端子付いてんだから。
◆◆◆ よし、Tang-Nano-4Kでグラフィックディスプレィ表示だ ◆◆◆
別に、キャラクタ表示だけでも良かったのだけど。
経緯
BASICマシン化は、Tang-Nano-4Kだけで(出来ればハード追加無しで)、パソコンに繋がずとも動く事が目的。
ソフトは「豊四季TinyBASIC」を利用して、周辺ハードをTang-Nano-4Kで固める作戦。
キャラクタ表示でも良かったが、FPGA側で構成すると貴重なBSRAMが4KB程度必要になる。
そこでキャラクタージェネレーターはMCU側に持たせることに。BRAMの消費は抑えられたが、描画速度が...。
※速度は往年の8ビットマシン並みです。
グラフィックディスプレィの構成
1.解像度を1280x760、画面を640x360とし、縦横2倍に拡大して表示。
※解像度を640x480に設定したら手持ちのディスプレィに表示されず。(クロック設定なんかの誤りかも)
※画面が1280x760だとDRAMの帯域オーパしそうだし、なにしろ字が小さくて見えない。
2.serial_clk(HDMI用)は360MHzに設定。HDMIの規格から外れているので、写らないモニタが有るかも。
※後でUSBを使う予定なので、12MHzクロックを確保の為。
※memory_clkの148.5MHzはFULL_HDMI動作試験の名残、159MHzのままで問題無かっただろう。(多分)
3.画面の1ドットの画素は2Byte(RGB565)、キャラクターは8x8ドットとする。
4.DRAM(画像バッファ)アクセス時の、バースト長は32Byteに設定。
DRAMアクセスは、16,32,64,128Byteのバーストアクセスが選択可能だが、設計時にIPでの設定で選択する仕様。
バースト長を長くすると、キャラクタ表示などで無駄なR/Wが必要になるので折衷案として選択。
※バースト長可変(バースト中に中止)はDRAMとしては可能な筈だが、IPが対応していない、残念だ。
IPの制御信号に割り込もうとしたがコンパイル出来ない。自前でやるにはイニシャライズ方法が不明。
5.DRAMからの画像データの読出しは、水平一ライン単位でHS(水平信号)に同期して行い、バッファリング。
残りの時間(2/3位)がMCUからのアクセスに利用可能。
6.MCUとFPGAのインターフェースは8Bitパラレルの、プログラム転送。
※これが諸悪の根源とにかく遅い、共有RAM等を使うべきだが複雑そうなので手を付けず。
7.キャラクター表示は、MCU側で横一ライン(8bit)のCGROMデータを送り、FPGAで16Byteの画像データに展開。
※当初はフルグラフィックにしていたが、一文字表示毎に256Byte転送は余りに遅かった。
8.キャラクタ表示も含め、グラフィック処理の一部(pset,pget,scroll)をFPGA側で処理。
※早くはなったが、LUTの残りが心もとない。
BSRAMの割り当て検討
Tang-Nano-4KはBSRAM(スタティックRAM)を20KB搭載している。
※チップサイズに影響するのだろうが、他社(lx9とか)並みに64KB位は欲しい所。
といっても、Analyzer Oscilloscopeが使えなくなるのは困るってのが本音。
Educationライセンスは扱い易いが、20KBで頑張るのはちと厳しいかな。
今回のロジックでは、表示ラインバッファに2KB、MCUワークに8KBを割り当てている。
※残り10KBでAnalyzer Oscilloscopeを使った。之が動かないと、動作がサッパリ判らないからね。
32bitデータを表示させると、トリガが効かなる時が有るが、之はタイミング不足なのだろうか。
MCUワークには8KB割り当てているが、GMD(コンパイラ)のサンプルは16KBの設定となっている。
この為メモリ不足、重複使用してもエラーとならないので要注意。
※mon+basicで約7KB、残り1KBがスタックで有る事をMAPで確認している。
BASICの拡張
豊四季TinyBASICに、次のグラフィックコマンドを追加している。
※モニター側も拡張しているので、動作が確認できる。
PSET xx,yy,ptn 座標xx,yyにptn色で1ドット表示する。
PGET xx,yy 座標xx,yyの色データを取得
PAINT xx,yy,ptn 座標xx,yyを基点に周囲を塗りつぶす。
LINE x1,y1,x2,y2,ptn 座標x1,y1からx2,y2にptn色の線を引く。
CIRCLE xx,yy,rr,ptn 座標xx,yyを中心に半径rrでptn色の円を描く
GOXY xx,yy キャラクター座標xx,yyにカーソルを進める。GOXY -1,-1の場合は画面を消去。
GOXY xx,yy,fc,bc 座標を移動させ、文字の表示色/背景色をfc/bcに設定する。
3D(風味)グラフ表示をやりたかったので、配列を拡張している。
通常の配列は@(xx)と指定するが、@@(xx)と指定する事により、最大512個の配列を使える。
但し、PAINT用のバッファを兼用しているので、PAINTを行うと書き換えられるので使用には注意。
※vramdisp.cの後ろに記載の、BASICでの使用例を参照されたし。
参考
動作させたプログラムを下記にUPしておく、多少は参考になるかな。
Tang-Nano-4Kグラフィックディスプレィハード構成
Tang-Nano-4Kグラフィックディスプレィソフト構成
感想
ディスプレィの制御は出来た。後はキーボードを繋げて独立BASICマシンとして完成させるぞ。
しかし、この程度の構成で既にLUTを80%程度使っており、入りきらない可能性が出て来た。
この回路規模でこの数値は普通なのかな、其れともロジックの組み方が甘いのか、どうだろうね。
まあ、やっつけ仕事で最適化されていない事は確実なんだけど。
なんて考えていたら、SipeedではTang-Nano-9Kなんてのを売り出している。
LUT 8640, BSRAM 468K(58.5KB?)なので、之がLX9対抗馬か。
お値段もさほど上がって無いような、Educationで使えるのなら乗り換えるかな。
なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。