DDRレジスタのインスタンシエート

[] [] []


IOブロック内のFFはクロックの立ち上がりと立ち下がりの両エッジで動くDouble Data Rate(DDR)レジスタとして使えるようになっている

1)クロック出力

クロックをFPGAの外部へ出力するときは、直接出力するとクロックバッファからPADまでの配置配線によって遅延が変わってしまうが、出力DDRレジスタを使えば一定の遅延で出力できる。特に、データといっしょにクロックを出力するとき(ソースシンクロナスクロック)に使う。

 

出力DDRレジスタはRTLで書けないのでFPGA固有のプリミティブをインスタンシエートするXilinxではファミリ毎にプリミティブが異なるので少し面倒である。(プリミティブとはFPGAの基本回路モジュールであり、モジュールを上位で呼び出すことをインスタンシエートするという)

/* Virtex-5の出力DDRレジスタ */

ODDR oddr_clk_out

    (.Q(clk_out),.D1(1'b1),.D2(1'b0),.C(clk),.CE(1'b1),.R(1'b0),.S(1'b0));

/* Spartan-3A,3Eの出力DDRレジスタ */

ODDR2 oddr_clk_out

    (.Q(clk_out),.D0(1'b1),.D1(1'b0),.C0(clk),.C1(~clk),.CE(1'b1),.R(1'b0),.S(1'b0));

/* Spartan-3の出力DDRレジスタ */

OFDDRCPE oddr_clk_out

    (.Q(clk_out),.D0(1'b1),.D1(1'b0),.C0(clk),.C1(~clk),.CE(1'b1),.CLR(1'b0),.PRE(1'b0));

/* Stratix,Cycloneファミリの出力DDRレジスタ */

altddio_out oddr_clk_out

    (.dataout(clk_out),.datain_h(1'b1),.datain_l(1'b0)

    ,.inclock(clk),inclocken(1'b1),.oe(1'b1)

    ,.aclr(1'b0),.aset(1'b0),.sclr(1'b0),.sset(1'b0));

2DDR入力

入力DDRレジスタはRTLで書けるが、FPGA固有のプリミティブをインスタンシエートした方が確実かもしれない

/* RTLで書いた入力DDRレジスタ */

(* IOB="TRUE", syn_useioff=1 *) input[15:0] din;

always @(posedge clk) din_pos_reg <= din;

always @(negedge clk) din_neg_reg <= din;

 

/* Virtex-5の入力DDRレジスタ */

IDDR iddr_din

    (.Q1(din_pos_reg),.Q2(din_neg_reg),.D(din),.C(clk),.CE(1'b1),.R(rst),.S(1'b0));

/* Spartan-3A,3Eの入力DDRレジスタ */

IDDR2 iddr_din

   (.Q0(din_pos_reg),.Q1(din_neg_reg),.D(din),.C0(clk),.C1(~clk),.CE(1'b1),.R(rst),.S(1'b0));

/* Stratix,Cycloneファミリの入力DDRレジスタ */

altddio_in iddr_din

    (.dataout_h(din_pos_reg),.dataout_l(din_neg_reg),.datain(din)

    ,.inclock(clk),inclocken(1'b1),.oe(1'b1)

    ,.aclr(rst),.aset(1'b0),.sclr(1'b0),.sset(1'b0));


[] [] []