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

[] [] []


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

1クロック出力

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

 

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

/* Xilinxの出力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));

/* 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;

 

/* Xilinxの入力DDRレジスタ */

IDDR iddr_din

    (.Q1(din_pos_reg),.Q2(din_neg_reg),.D(din)

    ,.C(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));


[] [] []