Tang-Nano-4Kでグラフィックディスプレィ

#目的
　Tang-Nano-4Kを、パソコン風味のBASICマシンとして動かすことを画策しているのだけど。
　それにはパソコンに頼らない、独立した表示が必要だな。　折角HDMI端子付いてんだから。
　　◆◆◆　よし、Tang-Nano-4Kでグラフィックディスプレィ表示だ　◆◆◆
　別に、キャラクタ表示だけでも良かったのだけど。
![bas_disp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/1456cb00-94f3-e038-0a9f-93992544dd18.jpeg)
#経緯
　BASICマシン化は、Tang-Nano-4Kだけで(出来ればハード追加無しで)、パソコンに繋がずとも動く事が目的。
　ソフトは「[豊四季TinyBASIC](https://vintagechips.wordpress.com/2015/12/06/%E8%B1%8A%E5%9B%9B%E5%AD%A3%E3%82%BF%E3%82%A4%E3%83%8B%E3%83%BCbasic%E7%A2%BA%E5%AE%9A%E7%89%88/)」を利用して、周辺ハードをTang-Nano-4Kで固める作戦。
　キャラクタ表示でも良かったが、FPGA側で構成すると貴重なBSRAMが4KB程度必要になる。
　そこでキャラクタージェネレーターはMCU側に持たせることに。BRAMの消費は抑えられたが、描画速度が...。
　　※速度は往年の8ビットマシン並みです。

#グラフィックディスプレィの構成
　1.解像度を1280x760、画面を640x360とし、縦横２倍に拡大して表示。
　　※解像度を640x480に設定したら手持ちのディスプレィに表示されず。(クロック設定なんかの誤りかも)
　　※画面が1280x760だとDRAMの帯域オーパしそうだし、なにしろ字が小さくて見えない。
　2.serial_clk(HDMI用)は360MHzに設定。HDMIの規格から外れているので、写らないモニタが有るかも。
　　※後でUSBを使う予定なので、12MHzクロックを確保の為。
　　※memory_clkの148.5MHzはFULL_HDMI動作試験の名残、159MHzのままで問題無かっただろう。(多分)
　3.画面の１ドットの画素は2Byte(RGB565)、キャラクターは8x8ドットとする。
　4.DRAM(画像バッファ)アクセス時の、バースト長は32Byteに設定。
　　DRAMアクセスは、16,32,64,128Byteのバーストアクセスが選択可能だが、設計時にIPでの設定で選択する仕様。
　　バースト長を長くすると、キャラクタ表示などで無駄なＲ／Ｗが必要になるので折衷案として選択。
　　　※バースト長可変(バースト中に中止)は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(スタティックＲＡＭ)を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色で１ドット表示する。
　　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での使用例を参照されたし。
![tt_grph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/eeeff988-f816-2ff7-5d92-f05e96b63517.jpeg)

#参考
　動作させたプログラムを下記にUPしておく、多少は参考になるかな。
　[Tang-Nano-4Kグラフィックディスプレィハード構成](https://github.com/hi631/tang-nano-4K/tree/master/dk_video_G)
　[Tang-Nano-4Kグラフィックディスプレィソフト構成](https://github.com/hi631/tang-nano-4K/tree/master/cm3_mon_G)


#感想
　ディスプレィの制御は出来た。後はキーボードを繋げて独立BASICマシンとして完成させるぞ。
　しかし、この程度の構成で既にLUTを80%程度使っており、入りきらない可能性が出て来た。
　この回路規模でこの数値は普通なのかな、其れともロジックの組み方が甘いのか、どうだろうね。
　まあ、やっつけ仕事で最適化されていない事は確実なんだけど。

　なんて考えていたら、SipeedではTang-Nano-9Kなんてのを売り出している。
　LUT 8640, BSRAM 468K(58.5KB?)なので、之がLX9対抗馬か。
　お値段もさほど上がって無いような、Educationで使えるのなら乗り換えるかな。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。