目的
Tang-Nano-4Kを購入した。先ずはサンプルソフトの動作確認。
Lチカ、まあこんなモノだろうな。
カメラとHDMI、な、なんだこのショボさは。
Tang-Nano-4Kの性能、活かせてないじゃないか。
◆◆◆ よし、も少し真っ当な画像を表示させよう ◆◆◆
と言っても、それ程の技術も持ってないので、出来る範囲と言うことで。
経緯
購入経緯なんかは前回に書いた。
コスパの良さには驚いたが、サンプルソフトがちと貧弱。
HDMI出力は1280x768、カメラなんて640x480、しかもモノクロだよ。
そこで目標として、下記を掲げる。
◇カメラ画像のカラー化
◇HDMI出力のHD(1920x1080)化
◇カメラの高解像化
実施結果をGithubに上げておいたので、興味あったら見てね。
※カメラはHD化出来なかった、残念。
開発環境
Tang-Nano-4K ※無ければ話にならないな。
GOWIN EDA Education版 ※verilogのコンパイルに必要。
HDMIモニター ※確認には必要だろう。
カメラ画像のカラー化
出来上がってみれば意外と簡単。
元の画像出力はRAW(赤緑青を色毎に8bit)形式に設定されてる。
出力形式をRGB565(つまり赤5bit、緑6bit、青5bitの16bit)形式に変更する。
変更はOV2640_Registers.vを書き換えれば出来るが、データの取り込みを16bit単位にする必要が有る。
カメラからの8bitデータを2byte単位で纏め、クロックも1/2にすればカラー化が完了。
※サンプルソフトの作成年は2019年、手間を省いたと言う事だろう。役には立ったが。
※OV2640の取説は中身が薄い。データ形式などは過去のOV7670等の方が詳細。
HDMI出力のHD(1920x1080)化
HD化はパラメーターの設定変更で出来ると思ったが、其れだけではモニターに弾かれた。
クロックを 74.25MHz -> 148.5MHz に倍化する必要が有る。
しかし、PLLは2個しかなくてどちらも使用中だよ。
そこで、DRAMのクロックを 159MHz -> 148.5MHz に変更。7%低下するがそこは我慢の子。
video_top.vの先頭の`ifdef USE_HD を有効化すればHD表示になります。
※画面はHD化出来たが、デジタルなのにノイズが乗るのは何故だ。
PLLの変更方法
PLLの設定変更に当たり、元の設定が判らないよ。 ※企業なら文書化しているだろうが。
GW1NSR-LV4CのPLL如き、ご承知の方は承知なんだろうが、
パラメーターを弄って結果を確認した所、*PLL*.vへの記載のキモは、
FCLKIN 入力周波数
IDIV_SEL 入力を分周
FBDIV_SEL 分周結果を逓倍(多分feedback)
FCLKIN ÷ IDIV_SEL(+1) × FBDIV_SEL(+1) = 出力周波数だと思う。
元の設定は 27 8 52 なので、27/(8+1)*(52+1)=159MHzの設定だったと判る。
※CLKOUTDはCLKOUTをDYN_SDIV_SELで分周した出力、自由に選べないとは。
カメラの高解像化
これはパラメーターを設定すれば完了するはずだったのだが...、
800x600,1024x768は動作したが、それ以上は表示出来なかった。
OV2640_Registers.v で USE_640,USE_800,USE_1024 の何れかを有効にしてください。
※パラメーターはaraduinoのやつを参考にしました。
※カメラを1280x1024に設定しても、1280個のデータが送られてこない。
設定ミスだとは思うが、何処が間違っているか判らん。
追記
前回は上記迄書いたが、その後多少分かった事が有るので追記する。
Tang-Nano-4Kに搭載のHyperRAM(名前が大げさだと思うがDRAMの商品名らしい)のカタログスペックは、
駆動クロック = 166MHz(200MHzも有るらしい)
DRAM帯域幅 = 166×2=333MB/S
理論効率 = 74%(128Byteバーストアクセス)
理論帯域幅 = 333×0.74=246.42MB/S
使用するには読み書きが必要なのでその半分、123MB/S当たりが実用上限だろう。
表示を1280x720 60fps 3Byte/Pixcelとした場合、166MB/Sなので破綻している。
表示を1280x720 60fps 2Byte/Pixcelとした場合、111MB/Sなので表示可能になる。
勿論、カメラ側からのアクセスは30fps程度なので、これ以上でも利用の可能性はある。
カメラを1280x1024に設定した場合、960ラインを超えるあたりで表示不能になったが、ここで帯域オーバーしたのだろう。
1980×1080(2Byre/Picel)の場合は、帯域が257MB/S必要なので、表示だけで破綻していたわけだ。
※だから、デジタルなのに画面にノイズが乗っていた訳だな。
でも、1Byte/Pixcelにすれば帯域は128MB/Sとなるので、十分表示可能だな。
感想
前回の宿題の回答なのですが、 力及ばす完遂しませんでした。
もう少しは頑張るつもりですが、多分このまま放置だと思います。
※表示が無理な事が判りました。
なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。