FC2カウンター FPGAの部屋 クロックネット同士のTIG制約
FC2ブログ

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

FPGAの部屋

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

クロックネット同士の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

コメント

TIGについて

釈迦に説法と思いつつ・・・

> ステーブルな信号では、タイミング違反があっても問題がないので

というのはこのブログを読んでいるかもしれない初心者の方にはちょっと紛らわしいかもしれません?

TIG してよいかを判断するには「reset_vga_node1 がメタステーブルになってもその先の回路は大丈夫か?」を考える必要があると思いました。initialize_end が 1 になったタイミングで reset_vga_node1 がメタステーブルになると、それを読む回路間でレーシングが生じます。「初期化後はステーブルである」というのは TIG できるかどうかを判断する条件として弱いのではないでしょうか?
私が何か勘違いしているのかもしれません・・・
  1. 2011/01/28(金) 10:23:38 |
  2. URL |
  3. 武内 #-
  4. [ 編集 ]

武内さん、こんにちは。
記事を追加しておきましたが、いかがでしょうか?
  1. 2011/01/28(金) 11:41:05 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

やはりちゃんと2連のフリップフロップで受けていらっしゃるのですよね。
2連フリップフロップのおかげでタイミング違反してもOKということであればとても分かりやすいです。
お手数をお掛けしてしまいました。ありがとうございました。
  1. 2011/01/28(金) 18:23:14 |
  2. URL |
  3. 武内 #-
  4. [ 編集 ]

武内さん、ありがとうございました。
ブログの記事の質が上がったと思います。
また、何かありましたら、ご指摘よろしくお願いします。
  1. 2011/01/28(金) 18:42:41 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1701-9705702d
この記事にトラックバックする(FC2ブログユーザー)