FC2カウンター FPGAの部屋 Spartan-6のお勉強3(DCMのインプリメント)

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

FPGAの部屋

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

Spartan-6のお勉強3(DCMのインプリメント)

以前、”キャラクタ・ディスプレイ・コントローラ”を作ったが、これをそのまま、Spartan-6に載せ替えてみようと思う。ISEのバージョンはISE11.5を使用した。
このキャラクタ・ディスプレイ・コントローラ回路は、勝手にキャラクタを書きまくるので、RGBとHSYNC,VSYNCが出力されている。
下に、DCMの含まれているモジュール、dcm_inst.v を下に示す。

// DCM module

`default_nettype none
`timescale 1ns / 1ps

module dcm_inst(clkin, reset, clkout, clkfx, clkdv, locked);
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
    
    wire clkin;
    wire reset;
    wire clkout;
    wire clkfx;
    wire clkdv;
    wire locked;
    
    wire clk_ibuf;
    wire clkfb, clkfx_node;
    wire gnd, clk_node;
    wire clkdv_node, clkdv_bufg;
    
    assign gnd = 1'b0;
    
    IBUFG IBUFG_inst (
        .I(clkin),
        .O(clk_ibuf)
    );
    
    DCM DCM_INST1 (
        .CLKIN(clk_ibuf),
        .CLKFB(clkfb),
        .DSSEN(gnd),
        .PSINCDEC(gnd),
        .PSEN(gnd),
        .PSCLK(gnd),
        .RST(gnd), // リセットごとにDCMのロックが外れないようにgndにしておく
        .CLK0(clk_node),
        .CLK90(),
        .CLK180(),
        .CLK270(),
        .CLK2X(),
        .CLK2X180(),
        .CLKDV(clkdv_node),
        .CLKFX(clkfx_node),
        .CLKFX180(),
        .LOCKED(locked),
        .PSDONE(),
        .STATUS()
    );
    defparam DCM_INST1.CLKIN_PERIOD = 20.0;
    defparam DCM_INST1.DLL_FREQUENCY_MODE = "LOW";
    defparam DCM_INST1.DUTY_CYCLE_CORRECTION = "TRUE";
    defparam DCM_INST1.CLKDV_DIVIDE = 2.0;
    defparam DCM_INST1.PHASE_SHIFT = 0;
    defparam DCM_INST1.CLKOUT_PHASE_SHIFT = "NONE";
    defparam DCM_INST1.STARTUP_WAIT = "FALSE";
    defparam DCM_INST1.FACTORY_JF = 16'hFFFF;
    
    BUFG BUFG_inst(
        .I(clk_node),
        .O(clkfb)
    );
    
    BUFG BUFG_clkfx(
        .I(clkfx_node),
        .O(clkfx)
    );
    
    BUFG BUFG_clkdv(
        .I(clkdv_node),
        .O(clkdv_bufg)
    );
    assign clkout = clkdv_bufg;
    assign clkdv = clkdv_bufg;
endmodule
    


制約(UCF)ファイルは、入出力ピンの制約は外した。ピリオド制約とクロックの遅延値を見るために、1ピンだけセットアップ時間の制約を入れていある。

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;
NET "VGA_BLUE" OFFSET = OUT 20 ns AFTER "clk";


これで、xc6slx45t-3fgg484(Spartan-6の型番) でインプリメントしてみた。インプリメントできたものをFPGA Editorで見てみると、BUFIO2が使用されている。
BUFIO2_1_100406.png
 図1 キャラクタ・ディスプレイ・コントローラのBUFIO2

左のペインの赤い四角がBUFIO2だ。これを拡大してみた。
BUFIO2_2_100406.png
 図2 BUFIO2の拡大図

図2でDVICLKからBUFGにつながっているのがわかる。次にDCMの図を下に示す。
BUFIO2_4_100407.png
 図3 Spartan-6のDCM

DSS_MODEが出来ている。

図1を見返してみると、BUFIO2の下にBUFIO2FBというバッファがある。BUFIO2FBの入力には、bufg_inst_0/clkfbが接続されている。これは、今までのSpartan-3Aとかでは見ない形だ。どんな意味があるのか、早速、ユーザーズガイドを探してみると、”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の49ページの”図 1-33 : クロック配線遅延と一致する BUFIO2FBバッファ”に図があった。それを下に引用する。
BUFIO2_3_100406.png

ユーザーズガイドによると、”図 1-33 に示すようにBUFIO2FBバッファを使用し、CMT(PLLまたはDCM) リファレンス出力CLKIN とフィードバック CLKFB の間のクロック配線遅延を一致させることができます。”だそうだ。
今までは、DCMのフィードバックと言っても、クロック入力と遅延値が合わない、なんちゃってフィードバックだったが、今度は完璧なフィードバックになったようだ。DCMまでの遅延を0にできるはず。これは嬉しい。。。
CLKDVをFPGA内部クロックとした時のクロックパスの遅延値を下に示す。DCMの分周クロック出力を使用しているので、クロックフィードバックループの外にある。図1-33で言うと、CLKOUTからBUFGを通してクロック配線に行っている。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    N4.I                 Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/IBUFG_inst
                                                       ProtoComp52.IMUX
    BUFIO2_X1Y15.I       net (fanout=1)        2.177   dcm_inst_0/clk_ibuf
    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.170   SP6_BUFIO_INSERT_ML_BUFIO2_0
                                                       SP6_BUFIO_INSERT_ML_BUFIO2_0
    DCM_X0Y1.CLKIN       net (fanout=1)        0.843   dcm_inst_0/DCM_INST1_ML_NEW_DIVCLK
    DCM_X0Y1.CLKDV       Tdmcko_CLKDV         -5.680   dcm_inst_0/DCM_INST1
                                                       dcm_inst_0/DCM_INST1
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/clkdv_node
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/BUFG_clkdv
                                                       dcm_inst_0/BUFG_clkdv
    SLICE_X18Y12.CLK     net (fanout=54)       1.382   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      0.946ns (-4.397ns logic, 5.343ns route)
    


FPGA内部ロジック使用クロックのクロック入力パッドからの遅延は0.946nsecになった。BUFIO2_X1Y15.Iのネットの遅延が大きいが、これはFPGA Editorで見ると配線がぐるぐる廻っている。これでいいのか?

次にdcm_inst.v のコードを下のように変更して、FPGA内部クロックをCLKDVからCLKFBに変更する。これはクロックフィードバックループ内のクロックを使用することになる。

// assign clkdv = clkdv_bufg;
assign clkdv = clkfb;


クロックパスの解析結果を下に示す。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    N4.I                 Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/IBUFG_inst
                                                       ProtoComp48.IMUX
    BUFIO2_X1Y15.I       net (fanout=1)        2.177   dcm_inst_0/clk_ibuf
    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.170   SP6_BUFIO_INSERT_ML_BUFIO2_0
                                                       SP6_BUFIO_INSERT_ML_BUFIO2_0
    DCM_X0Y1.CLKIN       net (fanout=1)        0.843   dcm_inst_0/DCM_INST1_ML_NEW_DIVCLK
    DCM_X0Y1.CLK0        Tdmcko_CLK           -5.694   dcm_inst_0/DCM_INST1
                                                       dcm_inst_0/DCM_INST1
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/clk_node
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/BUFG_inst
                                                       dcm_inst_0/BUFG_inst
    SLICE_X17Y14.CLK     net (fanout=56)       1.383   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      0.933ns (-4.411ns logic, 5.344ns route)
    


以前と同様な結果になった。

DCMのCLKINとCLKFBの間の配線遅延を一致させるというのは、良い試みだと思う。今までは保証がなかった。DCMから遠いBUFGを使ってしまうと、DCMが遅延を合わせきれない恐れもあった。
次はDCM_CLKGENをインプリメントしてみようと思う。
  1. 2010年04月07日 05:18 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/1428-08b27f4e
この記事にトラックバックする(FC2ブログユーザー)