いままでずーっと,Verilog RTLでほげふが,というタイトル付けていたのですが,つい先ほど,これは間違いで,Verilog HDLと記述するのが正しい,ということに気づきましたwwwwwwwwwwwwwwww いや,勿論後者が正しいことは昔から知っていましたし,なんか変だなーと思ってはいたのですが,あんまし気にせずタイトルコピペしていましたwwwwwwwww なんかもう色々と失格な感じで穴があったら入りたいとはまさにこのことですwwwwwwwww ええと,いいわけすると,RTLレベルで書いているんだぜ,ビヘイビアじゃなくてよ,ということを主張したかったのですが,まず単語からちゃんと確認しようぜ俺w
こんだけ超弩級の失敗をやらかした後だと,色々説得力が皆無になってもうほんとどうしようか,と思い悩んでしまいますが,過去は忘れて未来をみることとします.皆も過去は忘れてねw
さて,やっぱりLCDに絵をだしたい,ということで,LCDコントローラを作ることにしました.まずは,LCDの仕様の確認です.Nios II Embedded Evaluation Kit, Cyclone III Edition (NEEK) の仕様書の中,LCD Multimedia HSMC Reference Manualを確認したところ,NEEKに載ってあるLCDは,TD043MTEA1とやらであることが判明しました.このLCDの仕様は前述のリファレンスマニュアルには一切掲載されていないので,ぐぐって仕様書をゲットしました.ただ,ゲットしたのは良いのですが,どうも仕様書に書かれていないことが多いように見受けられます.HSYNCとかVSYNCとかの信号のタイミングチャートは記述されているので,最低限の信号は出せるのですが,なにやら存在するシリアルインタフェースの仕様やコマンドの類が一切ないのは一体どういうことよw とりあえずはシリアルインタフェースは放置しておき,必要に応じて付属のサンプル回路を覗いて確認することにします.
さて,このLCDですが,800x480の解像度があり,仕様書通りだとリフレッシュレートは約60Hzに見受けられます.RGB入力で,それぞれ8bitが割り当てられるため,1ピクセルを表現するためには24bitのデータが必要です.HSYNCとVSYNC的な信号により同期させる,まぁどっかでみたよーな信号体系なので,それほど制御は難しくはなさそうです.
LCDのざっくりした仕様がわかったので,各種バジェットを考えてみましょう.データ転送量は,1秒あたり800 x 480 x 3byte x 60fpsです.すなわち,69.1MByteの転送量が必要です.また,1フレームあたりのデータサイズは,1.15MByteです.一方,NEEKには,合計約70KByte程度のM9Kと,1MByteの外付けSRAM @ 32bitがあります.DDR-SDRAMはコントローラを作る能力が私にはないので存在自体を除外しますw
上記より,全ピクセルデータを無圧縮RGB形式で持つことは,そもそもリソース上不可能であることがわかります.また,SRAMの帯域は,SRAMコントローラを50MHzで合成させた場合には200MByte/secとなります.フレームへの書き出しと読み込みが発生することを考えると,最低でも69.1MByte/secの2倍,約140MByte/secのデータ転送が必要です.上限に対し7割はなかなか厳しい値ですので,やっぱり無圧縮RGB形式で持つことは無理です.
というわけで,フレームデータのサイズを小さく,データ転送帯域を狭くしなければなりません.そのために,以下のパラメータを少なくすることにしました.
- フレームサイズ
- 1ピクセルあたりのデータ量
- フレームレート
3番はデータ転送帯域だけに効いてくるのに対し,1番と2番は両方に効いてきます.ので,まずは1番と2番の対処を行うことにします.
まず,2番.YUV420フォーマットによる間引きが有効です.これは,人間の眼球の構成に依存した間引き手法です.人間の眼球には,明るさを感知する細胞は多く,色を感知する細胞は少なく存在しています.ので,ピクセルデータを明るさと色の情報に分け,色の情報は明るさの情報の半分で済ませましょう,という考え方に基づく間引きです.YUV420においては,明るさを示すYは1pixelあたり1byteの情報を与えるのに対し,色の情報(色差)を示すCbとCrはそれぞれ4pixelで1byteの情報を共有します.ので,1pixelあたりの色の情報は0.5byteです.これに対応することにより,RGB3byteに比べ情報量は半分になります.
2番だけではデータ量が半減しただけなので,まだ容量的に,ダブルバッファを持つには足りません.ので,フレームサイズもへらしましょう.ここはわかりやすく,縦半分,横半分の,合計1/4のピクセル数にします.
これらにより,データ転送量は,1秒あたり400 x 240 x 1.5byte x 60fpsになりました.すなわち,8.64MByteの転送量が必要です.また,1フレームあたりのデータサイズは,144kByteです.ダブルバッファで2フレーム分の領域を確保しても,288kByteで,SRAMの1/3しか使いません.また,データ転送帯域も10%程度と,まぁそれなりに現実的な感じとなります.
で,間引いたからには,表示するときに補完しなければいけません.YUVからRGBは,固定係数をかけて足せば良いだけなので,特に問題ないでしょう.固定小数点演算をする必要があるので,精度が問題ですが,それはまぁ適当にトライアンドエラーでざっくり決めちゃいます.フレームサイズは,てきとうにバイリニアで拡大してやれば良いかな.
また,フレームレートですが,LCDに送るクロック周波数を落とせば自然とフレームレートが落ちる気がするのですが,それでLCD自体がちゃんと動作するかは謎です.後で試してみよう.15fpsとかでもそれなりに見えるはず.これくらいなら,SDから直接データ読んで表示する,とかでも動きそうな予感.
一方で,15fpsの時の画像1バイトあたりの処理サイクルバジェットは,80MHzでPuzzleBoxコアを動かしたとしても,40cycle程度です.つまり,最大でも1バイトあたり40回しかリダクションできません.結論として,全然処理性能が足りない,ということになりますwwwww church数をmachine integerに変換するだけでも最大255cycleかかってしまうので,もう論外ですw やはり,machine integerの計算を組み込まないとダメだな...
最近のコメント