FC2カウンター FPGAの部屋 2011年01月28日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

OV9655でSXGAを表示3(表示できた)

色々とビット幅がミスっていたが、(しかし、Verilogはビット幅が間違っていてもエラーがでないものか?)やっとまともにSXGAの画像を表示することができた。ヤッター!
OV9655_9_110128.jpg
(SXGAです。PCLK 48MHz、15fps)

OV9655は現在の設定では?、暗さに弱いようだ。上の画像は照明が暗いので、明るいところではもっと良い画像になった。
OV9655_10_110128.jpg

OV7670のS/N Rate は46dB、Dynamic Range は52dBに対して、
OV9655のS/N Rate は42dB、Dynamic Range は50dB なので、OV9655は画素が多い分、大きさが小さいのだろうか?

ともかく、目的は達成した。やはり、SXGAの方が綺麗だ。後は、RGB各4ビットではビット数が少ないので、買ってあるChrontel のCH7301Cを使って、RGB各8ビットのDVI-Iで出力したい。そのためには、Spartan-3A Starter Kit の拡張ポートの基板を設計して、どこかに作ってもらう必要がある。4層基板で作りたいな?と思っている。

  1. 2011年01月28日 19:02 |
  2. OV9655
  3. | トラックバック:0
  4. | コメント:4

クロックネット同士のTIG制約

OV9655を使用したCMOSカメラ回路をインプリントしていると、タイミングエラーが出てしまった。
OV9655_8_110126.png

この内容を見てみる。下図参照。
UCF_Writing_8_110128.png

VGA_Display_Controller用のクロックとDDR2 SDRAMコントローラのクロックにタイミング違反がある。VGA_Display_Controller用のクロックの違反の中身を見てみる。
UCF_Writing_9_110128.png

Source はDDR2 SDRAMコントローラのinitialize_endで初期化が終わったという信号で、これは初期化が終了したらずーと1になる信号だ。Destination はreset_vga_node1でこの信号を生成するためにinitialize_endを使用している。このようなステーブルな信号では、タイミング違反があっても問題がないので、このパスはタイミングを無視するという制約を付加する。ほかのタイミングエラーも同様な箇所だった。
UCFの書き方3”クロック出力ピンをグループ化して、それ同士のタイミング解析を無視する制約をかけた。今回は、クロックネットをグループ化してタイミング解析を無視する制約をかける。それが下の制約だ。(UCFファイルの一部)

NET "clk_vga" TNM_NET = TMN_CLK_VGA;
NET "clk_ddr2" TNM_NET = TMN_CLK_DDR2;
TIMESPEC TS_CLK_DDR2_to_VGA = FROM "TMN_CLK_DDR2" TO "TMN_CLK_VGA" TIG;
TIMESPEC TS_CLK_VGA_to_DDR2 = FROM "TMN_CLK_VGA" TO "TMN_CLK_DDR2" TIG;


clk_vgaをTMN_CLK_VGAにグループ化、clk_ddr2をTMN_CLK_DDR2にグループ化してして、それぞれのグループ同士のタイミング解析を無視する(TIG制約)。

これでインプリントしてみた。タイミング違反は無くなった。
UCF_Writing_1_110128.png

最後に、先ほどの制約に相当するPCFファイルの一部を下に示す。

PATH TS_CLK_DDR2_to_VGA_path = FROM TIMEGRP "TMN_CLK_DDR2" TO TIMEGRP
"TMN_CLK_VGA";
PATH "TS_CLK_DDR2_to_VGA_path" TIG;
PATH TS_CLK_VGA_to_DDR2_path = FROM TIMEGRP "TMN_CLK_VGA" TO TIMEGRP
"TMN_CLK_DDR2";
PATH "TS_CLK_VGA_to_DDR2_path" TIG;

TIMEGRP TMN_CLK_DDR2 = BEL "reset_ddr2_node1" BEL "reset_ddr2" BEL
"camc_afifo_uf" BEL "vgadc_afifo_of" BEL
"VGAD_Cntrller_inst/cs_rdg_FSM_FFd1" BEL
"VGAD_Cntrller_inst/read_count_1" BEL
"VGAD_Cntrller_inst/read_count_2" BEL
...

TIMEGRP TMN_CLK_VGA = BEL "reset_vga_node1" BEL "reset_vga" BEL
"VGAD_Cntrller_inst/RGBX_0" BEL "VGAD_Cntrller_inst/RGBX_1" BEL
"VGAD_Cntrller_inst/RGBX_3" BEL "VGAD_Cntrller_inst/RGBX_4" BEL
"VGAD_Cntrller_inst/RGBX_5" BEL "VGAD_Cntrller_inst/RGBX_6" BEL
"VGAD_Cntrller_inst/RGBX_9" BEL "VGAD_Cntrller_inst/RGBX_10" BEL
...


(追加)
reset_vga_node1の後ろの回路を追加しておきます。

    //reset_vga の処理
    always @(posedge clk_vga, posedge dcmv_out_reset) begin
        if (dcmv_out_reset) begin
            reset_vga_node1 <= 1'b1;
            reset_vga <= 1'b1;
        end else begin
            reset_vga_node1 <= ~dcm_vga_locked | ~ddr2_initialize_end; 
            reset_vga <= reset_vga_node1;
        end
    end


reset_vga_node1の入力は、DCMのロック信号とDDR2 SDRAMの初期化信号を反転しています。reset_vga_node1でclk_vgaで同期化して、それをもう一度clk_vgaで同期化してVGA_Display_Controller のリセット信号(reset_vga)として使っています。1クロック以上メタステーブル状態にならなければ大丈夫だと思います。
今までのところ問題ないです。
  1. 2011年01月28日 05:14 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:4