2
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-01

目的

 Tang-Nano-4Kを、パソコン風味のBASICマシンとして動かすことを画策しているのだけど。
 それにはパソコンに頼らない、独立した表示が必要だな。 折角HDMI端子付いてんだから。
  ◆◆◆ よし、Tang-Nano-4Kでグラフィックディスプレィ表示だ ◆◆◆
 別に、キャラクタ表示だけでも良かったのだけど。
bas_disp.jpg

経緯

 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での使用例を参照されたし。
tt_grph.jpg

参考

 動作させたプログラムを下記にUPしておく、多少は参考になるかな。
 Tang-Nano-4Kグラフィックディスプレィハード構成
 Tang-Nano-4Kグラフィックディスプレィソフト構成

感想

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

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1