さて、ビットマップVGAコントローラはOKのようなので、DDR2 SDRAMコントローラを疑うことにした。具体的には、DDR2 SDRAMコントローラから読んでくる値が毎回正しいのかを検証することにした。Chipscope PROがあれば簡単なのだが、家ではライセンスがないので、検証回路を組んで、LEDに表示することにした。
下がBitmap_VGA_Controller.v に組み込んだ検証回路だ。
// テスト回路
always @(posedge clk_vga) begin
if (reset_vga)
start_vram_data <= 16'd0;
else begin
if (h_count==1 && v_count==0 && pixel_afifo_rd_en)
start_vram_data <= vram_data_out;
end
end
always @(posedge clk_vga) begin
if (reset_vga)
diff_start_data <= 1'b0;
else begin
if (h_count==1 && v_count==0 && pixel_afifo_rd_en) begin
if (start_vram_data==vram_data_out)
diff_start_data <= 1'b1;
else
diff_start_data <= 1'b0;
end
end
end
assign start_vram_data_out = start_vram_data[6:0];
検証回路の動作は、h_countは水平カウンタ、v_countは垂直カウンタでそれらが1, 0で、非同期FIFOのリード・イネーブル(pixel_afifo_rd_en)が1の時のデータを1フレーム前と今とで比べて、同じだったらdiff_start_dataを1にする。これはLEDに出力する。LEDは8個あるので、後の7個にはラッチしたデータの下位7ビットを出力する。うまくいけば、diff_start_dataは1のまま、start_vram_data_outは固定された値になるはず。
これでインプリメントして、実機にダウンロード。すると、最初の列の幾つかは流れているものの、その他は流れていない画像が表示された。

最初の方は、流れているので、LEDはかなりちかちかしている。これはデータが安定しないことを示す。diff_start_dataのLEDにもちかちかしている。データがあっている時も有れば、違っている時もあるみたい。
次にh_count==1の部分をh_count==512として、ちょうど真ん中のデータを見るとdiff_start_dataもずっと1のままで、データのLEDも安定した。
理由はわからないが、安定してきたようだ。これからなぜ、安定してきたかを検証してみよう。
まずは、
動いている以前のDDR2 SDRAMのバーストテストのプロジェクトをリファレンスとしてみていく。
DQ0(データバス)の入力の静的タイミングを下の図に示す。

データパスのネットの遅延が0.411nsec でとても良い感じになっている。
つぎに、キャラクタ描画テスト回路(ビットマップVGAコントローラ)のDQ0(データバス)の入力の静的タイミングを下の図に示す。

データパスの遅延は、3.618nsec となっていて、DDR2 SDRAMバーストテストの0.411nsec とはかけ離れてしまっている。これが原因か?
次にFPGA Editor でDQ0(データバス)の配線をチェックしてみよう。まずは、DDR2 SDRAMバーストテストのDQ0(データバス)の配線を示す。

非常に素直に配線されている。
次に、キャラクタ描画テスト回路のDQ0(データバス)の配線をFPGA Editor で見てみよう。下の図に示す。

なんじゃこりゃ―?というような配線になっている。少なくとも原因の1つはこれだ。。。
制約もほとんど違いがないし、なぜなんだろうか?違いがあるとすればTIG制約だな。今、TIG制約を外してやってみたが、Place & Routeでエラー発生。やはり外せない。。。やるとすれば、配線の固定をする必要があるのか?IPでも、そこまでやっているのを見たことはないが、やる必要があるならば、するしかないかな???
上記の事柄について、アドバイスやなにか情報があったら教えて下さい。
- 2010年02月19日 06:08 |
- VGAコントローラ
-
| トラックバック:0
-
| コメント:0