[NEEK]LCD同期ズレを修正
「Implementing an LCD Controller」という資料に書いてある。
このLCDのデータシートをぐぐって見てみると、以下の仕様だ。
<NEEKでは800xRGBx480で使用>
NCLK: 33.2 MHz
Horizontal Valid Data: 800 NCLK
1 Horizontal Line: 1056 NCLK
HSYNC pulse width: Min 1 NCLK
Hsync blanking: 216 NCLK
Hsync front porch: 40 NCLK
DENB Enable Time: 800 NCLK
Vertical Display Area: 480 H
Vertical Period Time: 525 H
VSYNC pulse width: Min 1 H
Vertical blanking: 35 H
Vertical front porch: 10 H
Vertical blanking of DENB: 40 H
NEEKでは50MHz外部クロックはあるが、パネル規定の33.2MHzぴったりは生成出来ない。
しかも、NEEKでは、今回1NCLK(33.2MHz)に対して、基本クロックを100MHz(50MHz x 2逓倍)
にして、100MHz x 3発でRGBを8bitづつ送る使い方。
パネル規定=33.2MHz = 30.12ns
NEEK= 100MHz x 3 = 30ns
という違いがあるので、上記のパネル規定のタイミング設定をすると、定期的に画面が消灯する現象が出た。
ちなみに、計算してみると1frame分の時間の違いは以下。
パネル規定=16.70ms/frame
NEEK=16.63ms/frame
この差を埋めるために、
Hsync blanking: 216 NCLK → 220 NCLK(HSYNC pulse widthを1から5へ)
としたら、画面の定期消灯が無くなった。
[NEEK]DDRコントローラでREAD時ALTDDIO_IN使用
READ時のDQ Rise/Fall受けをどうするかを検討中。
MegaWizardで探すと、ALTDDIO_INとALTDDIO_OUTを使うべきと判断。
WRITEコマンドでは、DDRコントローラのクロックを使用するので、クロックは連続して動いてる。
問題はクロックにDDR SDRAMメモリから来るDQSを使うREAD時。
DDR SDRAMメモリからは、必要分のDQS信号しか送って来ない。
その上、ALTDDIO_INの動きを見ると、
データH側= DQS Riseでラッチし、そのまま出力。
データL側= DQS Fallで一時受け。それを次のDQS Riseで出力。
こうなってた。
これ、データHは良いのだが、データLは、一連のREAD動作の最後に来たデータ
(最後のDQS =Lの時のDQの事)は、次のDQS RiseでやっとALTDDIO_INから出力される。
しかし、DDR SDRAMメモリから次のDQS Riseは来ない。なぜなら必要分のDQSしか来ないから。
次のDQS Riseが来るのは、次の無関係なWRITE or READコマンドで動くDQS Riseの時。
これ使えないのでは?
と思ってたら、invert_input_clocksというパラメータに着目。(上記の動きはOFFの時)
これをONしたら、
データH側= DQS Fallでラッチし、そのまま出力。
データL側= DQS Riseで一時受け。それを次のDQS Fallで出力。
となった。
データHとLが逆になるが、これで最後のDQS Fallの時に、データHもデータLも
ALTDDIO_INから出力されるようになった。
DDR SDRAMメモリから来るDQSを使ってラッチする場合、ALTDDIO_INのinvert_input_clocks=ON
は必須だと理解したが、どうなんだろ?
XilinxのIDDRはすんなり使えたのだが、アルテラでははまってしまった。
[NEEK][MICO32]Micron社DDR SDRAM Verilogモデルvlogエラー
Model Technology ModelSim ALTERA vlog 10.1b Compiler 2012.04 Apr 27 2012
-- Compiling module ddr
** Error: (vlog-2902) 3924256Mb_ddr/ddr.v(1414): A `define was found on the same line as a SystemVerilog `ifdef, `ifndef, `elsif, or `else.
実行コマンドはこれ。
vlog -sv +define+sg5B 3924256Mb_ddr/ddr.v
エラーの指摘行は以下。
`else `define sg75Z
一行にまとめて書くのがダメらしい。
改行して2行にしたらエラー消えた。
`else
`define sg75Z
[NEEK][MICO32]ModelSim Altera Starterはインスタンス数制限?
置き換えてSimulationしてるが、だいぶ遅い。60160ns/minほど。
また、以下のようにサイズ制限を越えた的なMSGも出ていて、これって確かSimulation速度が
制限かかってだいぶ落ちてるはず。
# ** Warning: Design size of 114 instances exceeds ModelSim ALTERA recommended capacity.
# This may because you are loading cell libraries which are not recommended with
# the ModelSim Altera version. Expect performance to be adversely affected.
ここで言ってるのは、「インスタンス数」って事なので、バスの1bit毎に呼び出してたmoduleを
parameter指定で複数bit対応出来るように修正した。
これで例えば16bitデータバスなんかは16個インスタンス呼んでたのが、1個になるし、MSGの
指摘数が114個からある程度減ると思ってた。
しかし、修正前後で指摘数は114個のまま。インスタンス呼び出しの数じゃないのか??
・もしやvlogでコンパイルしたmodule数か? → いえ、実験したが違います。
・altera_mf.vの必要なmoduleだけ限定すれば減る? → いえ、減りませんでした。
・moduleを2種類未使用へ、インスタンス10個削除 → Warningが114から113に減った。
・コンパイルログの「Top level modules」の数は114。でもWarningは113。関係あり?
[NEEK][Mico32]Video Sync Generator設定
エラーが出てしまって、原因わからないので断念。
かと言っても、Qsys生成RTLを使ってるとSimulationが遅過ぎて作業が進まないので、
以前Xilinx ML501でいじってた回路で遊ぶことに。
ちなみに、ModelSim ASEが遅いと思ったが、Qsysで作った回路ほど遅くなく、
元々のXilinx用回路構成で70685ns/分というスピードだった。
主にRAM/FIFOをAltera版に変えて、エラーが消えた時点でVeritakでもやってみたが、
この回路ではModelSim ASEの方が早かった。正確ではないが、ざっと2~3倍くらいの差だったかな。
まずはNEEK LCDへカラーバーでも表示したい。
以前も書いたが、NEEKの時のVideo Sync Generatorは以下。
Qsys:Video Sync Generator
Data Stream Bit Width | 8 |
Beats per Pixel | 3 |
Number of Columns | 800 |
Number of Rows | 480 |
Horizontal Blank Pixels | 216 |
Horizontal Front Porch Pixels | 40 |
Horizontal Sync Pulse Pixels | 1 |
Horizontal Sync Pulse Polarity | 0 |
Vertical Blank Lines | 35 |
Vertical Front Porch Lines | 10 |
Vertical Sync Pulse Lines | 1 |
Vertical Sync Pulse Polarity | 0 |
Total Horizontal Scan Pixels | 1056 |
Total Vertical Scan Lines | 525 |