DDRレジスタのインスタンシエート
IOブロック内のFFはクロックの立ち上がりと立ち下がりの両エッジで動くDouble Data Rate(DDR)レジスタとして使えるようになっている。
例1)クロック出力
クロックをFPGA外部へ出力するとき、直接出力するとクロックバッファからPADまでの配置配線によって遅延が変わってしまうが、出力DDRレジスタを使えば一定の遅延で出力できる。特に、データといっしょにクロックを出力するとき(ソースシンクロナスクロック)に使う。
出力DDRレジスタはRTLで書けないのでFPGA固有のプリミティブをインスタンシエートする。プリミティブの代わりにIP生成ツールでラッパをかぶせたものを生成してもよい。
/* 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)); |
例2)DDR入力
入力DDRレジスタはRTLで書けるが、FPGA固有のプリミティブをインスタンシエートした方が確実かもしれない。
/* RTLで書いた入力DDRレジスタ */ (* iob="true" *) 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)); |