遅延モジュール(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日 | コメントは受け付けていません。|

カテゴリー:技術情報

ホームページ更新のお知らせ

弊社ホームページにアクセスいただき、誠にありがとうございます。
この度、下記ページの更新を行いました。


今後とも、弊社ホームページをよろしくお願いいたします。

タグ

2015年8月22日 | コメント/トラックバック(0)|

カテゴリー:お知らせ

夏期休業のお知らせ

誠に勝手ながら弊社では、8月8日(土)~8月16日(日)までを夏期休業期間とさせていただきます。
お客様、お取引先様にはご迷惑をお掛けいたしますが、何卒ご了承くださいますよう、お願い申し上げます。

タグ

2015年8月6日 | コメント/トラックバック(0)|

カテゴリー:お知らせ

このページの先頭へ

イメージ画像