遅延モジュール(Verilog-HDL / Xilinx)

弊社のXilinx社製FPGAのRTL開発で使用しております遅延モジュールをご紹介いたします。

パイプラインにおける遅延調整の場合、ロジックの変更によって遅延量の変更が都度発生します。
その度にFFを1段追加あるいは削除するというのは、かなりの面倒な作業と思います。
また、外部入力信号や非同期クロック間転送(CDC)の為のダブルFFシンクロナイザも都度記述するのは、煩わしい作業では無いかと思います。

そこで、ビット幅および遅延量をパラメータ化した遅延モジュールを用意しております。
また、入力ピンおよび出力ピンに直結した場合にIOB内蔵のFFを使用するパラメータも用意しております。
リセットについては、弊社では殆どの場合、同期リセットを使用しておりますが、非同期リセットにも対応できるようにパラメータ化しております。

【delay_ff.v】
//% @file
//% @brief delay_ff (for Xilinx FPGA)

//% ディレーフリップフロップ

module delay_ff # (
parameter DATA_WIDTH = 2,//% データ幅
parameter DELAY_TIME = 3,//% 遅延時間
parameter IFF_USE = 0,//% 初段FF = IOB
parameter OFF_USE = 0,//% 最終FF = IOB
parameter ARESET_USE = 0//% 非同期リセット使用
) (
input CLK,        //% クロック
input RESET_N, //% リセット(負論理)
input [DATA_WIDTH-1:0] IN_DATA,//% 入力データ
output [DATA_WIDTH-1:0] OUT_DATA//% 出力データ
);

wire [DATA_WIDTH-1:0] data[DELAY_TIME:0];

assign data[0] = IN_DATA;
assign OUT_DATA = data[DELAY_TIME];

/*! D-FF
*/
generate
genvar i;
for (i = 0; i < DELAY_TIME; i = i + 1) begin : gen_d_ff
d_ff #(
.DATA_WIDTH(DATA_WIDTH),
.IOB_USE((i == 0)? IFF_USE : (i == (DELAY_TIME-1))? OFF_USE : 0),
.ARESET_USE(ARESET_USE)
) u_d_ff (
.CLK(CLK),
.RESET_N(RESET_N),
.IN_DATA(data[i]),
.OUT_DATA(data[i+1])
);
end
endgenerate
endmodule

【d_ff.v】
//% @file
//% @brief d-ff (for Xilinx FPGA)

//% Dタイプフリップフロップ

module d_ff # (
parameter DATA_WIDTH = 1,//% データ幅
parameter IOB_USE = 0,//% IOB使用
parameter ARESET_USE = 0//% 非同期リセット使用
) (
input CLK,        //% クロック
input RESET_N, //% リセット(負論理)
input [DATA_WIDTH-1:0] IN_DATA,//% 入力データ
output [DATA_WIDTH-1:0] OUT_DATA//% 出力データ
);

(* IOB = (IOB_USE)? "TRUE" : "FALSE" *) reg [DATA_WIDTH-1:0] data_reg;

assign OUT_DATA = data_reg;

/*! データレジスタ
*/
generate
if (ARESET_USE) begin
always @(posedge CLK or negedge RESET_N) begin: data_reg_l
if (!RESET_N)
data_reg <= {DATA_WIDTH{1'b0}};
else
data_reg <= IN_DATA;
end
end
else begin
always @(posedge CLK) begin: data_reg_l
if (!RESET_N)
data_reg <= {DATA_WIDTH{1'b0}};
else
data_reg <= IN_DATA;
end
end
endgenerate
endmodule
上記コードをSpartan-6にインプリメントしてみます。

View RTL Schematic
SCH
 

IFF_USE = 0, OFF_USE = 0 の場合
IOB00
 

IFF_USE = 1, OFF_USE = 0 の場合
IOB10
 

IFF_USE = 0, OFF_USE = 1 の場合
IOB01
IOB propertiesのReg(s)欄を確認すると、IFFあるいはOFFが使用されています。

ARESET_USE = 0 (同期リセットの場合)
fdr
FDR : D Flip-Flop with Synchronous Reset

ARESET_USE = 1 (非同期リセットの場合)
fdc
FDC : D Flip-Flop with Asynchronous Clear

タグ


2015年8月31日 | コメントは受け付けていません。|

カテゴリー:技術情報

このページの先頭へ

イメージ画像