引言:本文我們介紹下Xilinx SelectIO資源內(nèi)部IDELAYE2資源應(yīng)用。IDELAYE2原句配合IDELAYCTRL原句主要用于在信號(hào)通過引腳進(jìn)入芯片內(nèi)部之前,進(jìn)行延時(shí)調(diào)節(jié),一般高速端口信號(hào)由于走線延時(shí)等原因,需要通過IDELAYE2原語對數(shù)據(jù)做微調(diào),實(shí)現(xiàn)時(shí)鐘與數(shù)據(jù)的源同步時(shí)序要求。
1. IDELAYE2在SelectIO中的位置
7系列FPGA SelectIO中HR Bank和HP bank中都有IDELAYE2模塊,其在SelectIO路徑位置如下圖所示。
圖1:7系列FPGA HP Bank I/O Tile
圖2:7系列FPGA HR Bank I/O tile
2. IDELAYE2延遲特性
Kintex-7器件DC and AC 開關(guān)特性手冊中介紹了IDELAY延遲分辨率及最大工作時(shí)鐘,如下表所示。
表1:IDELAY延遲分辨率及最大工作時(shí)鐘
根據(jù)上圖延遲分辨率,例如當(dāng)參考時(shí)鐘為200MHz時(shí),根據(jù)公式計(jì)算:
平均抽頭延遲單位為Tidelayresoluion=1/(32×2×200MHz)≈78ps。
需要說明的一點(diǎn)是:當(dāng)抽頭系數(shù)Tap=0時(shí),輸入和輸出延遲時(shí)間并非為0ps,而是600ps;當(dāng)抽頭系數(shù)Tap=1~31時(shí),TapDelayTime=600ps+Tidelayresoluion*Tap。
3. IDELAYE2原句
在Vivado Language Templates中搜索IDELAY,在Verilog目錄中根據(jù)工程器件家族Kintex-7選擇IDELAYE2原句模板,如下圖所示。
圖3:IDELAYE2原句模板
(* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYE2 #(
.CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(0), // Input delay tap setting (0-31)
.PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
.DATAOUT(DATAOUT), // 1-bit output: Delayed data output
.C(C), // 1-bit input: Clock input
.CE(CE), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(CINVCTRL), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(CNTVALUEIN), // 5-bit input: Counter value input
.DATAIN(DATAIN), // 1-bit input: Internal delay data input
.IDATAIN(IDATAIN), // 1-bit input: Data input from the I/O
.INC(INC), // 1-bit input: Increment / Decrement tap delay input
.LD(LD), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(LDPIPEEN), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(REGRST) // 1-bit input: Active-high reset tap-delay input
);
IDATAIN為延時(shí)前的輸入信號(hào),DATAOUT為延時(shí)后的輸出信號(hào)。REFCLK_FREQUENCY參數(shù)為IDELAYCTRL原語的參考時(shí)鐘頻率,一般為200Mhz,最大頻率范圍根據(jù)器件手冊確定。IDELAY_VALUE參數(shù)用來設(shè)置延時(shí)的tap數(shù),范圍為1~31,每個(gè)tap數(shù)的延時(shí)時(shí)間和參考時(shí)鐘頻率有關(guān)。
4. IDELAYCTRL原句
IDELAYE2或者ODELAYE2原句例化時(shí),IDELAYCTRL原句也必須例化。IDELAYCTRL通過參考時(shí)鐘REFCLK來校準(zhǔn)IDELAY2每個(gè)tap的延時(shí)值,減少處理、電壓和溫度的影響。該模塊使用REFCLK時(shí)鐘精細(xì)校準(zhǔn)。
(* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYCTRL IDELAYCTRL_inst (
.RDY(RDY), // 1-bit output: Ready output
.REFCLK(REFCLK), // 1-bit input: Reference clock input
.RST(RST) // 1-bit input: Active high reset input
);
5. IDELAYE2原句工程源碼與仿真測試
5.1 開發(fā)環(huán)境
硬件平臺(tái):XC7Z035FFG676-2
軟件環(huán)境:Vivado 2017.4
仿真軟件:Vivado Simulator
5.2 軟件代碼
IDELAYE2工程源碼:
module IDELAYE2_Test(
input clk_in_50M, //時(shí)鐘
input rst_n, //復(fù)位
input ld,
input ce,
input inc,
input [4:0] tap_value_in, //設(shè)置延遲抽頭系數(shù)
???input?data_in_from_pins,??????//輸入Pins數(shù)據(jù)
output [4:0] tap_value_out,
output delay_ctrl_rdy, //IDELAYCTRL 延遲校準(zhǔn)ready信號(hào)
???output?data_in_from_pins_delay?//輸出Pins延遲數(shù)據(jù)
);
wire pll_locked;
wire clk_200M;
wire clk_50M;
wire REFCLK;
wire RST;
//IDELAYCTRL 時(shí)鐘及復(fù)位
assign REFCLK = clk_200M;
assign RST = pll_locked ? ~rst_n : 1'b1; //復(fù)位DELAYCTRL原句
// ======== 例化PLL時(shí)鐘 ========
clk_wiz_0 pll0
(
// Clock out ports
.clk_out1(clk_200M), // output clk_out1
.clk_out2(clk_50M), // output clk_out2
// Status and control signals
.locked(pll_locked), // output locked
// Clock in ports
.clk_in1(clk_in_50M)); // input clk_in1
// ======== 例化 IDELAYCTRL 和 IDELAYE2 ========
(* IODELAY_GROUP = "IODELAY_Test_IO" *) // 指定關(guān)聯(lián)的IDELAY/ODELAY和IDELAYCTRL的組名
IDELAYCTRL IDELAYCTRL_inst (
.RDY(delay_ctrl_rdy), // 1-bit output: Ready output
.REFCLK(REFCLK), // 1-bit input: Reference clock input
.RST(RST) // 1-bit input: Active high reset input
);
(* IODELAY_GROUP = "IODELAY_Test_IO" *) //指定關(guān)聯(lián)的IDELAY/ODELAY和IDELAYCTRL的組名
IDELAYE2 #(
.CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式選擇
.IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延遲Tap
.PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).時(shí)鐘常量
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT(tap_value_out), // 5-bit output: Counter value output
.DATAOUT(data_in_from_pins_delay), // 1-bit output: Delayed data output
.C(clk_50M), // 1-bit input: Clock input,該時(shí)鐘用于驅(qū)動(dòng)IDELAYE2內(nèi)部控制信號(hào)
.CE(ce), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(tap_value_in), // 5-bit input: Counter value input
.DATAIN(1'b0), // 1-bit input: Internal delay data input
.IDATAIN(data_in_from_pins), // 1-bit input: Data input from the I/O
.INC(inc), // 1-bit input: Increment / Decrement tap delay input
.LD(ld), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(1'b0), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(RST) // 1-bit input: Active-high reset tap-delay input
);
IDELAYE2 Testbench部分源碼:
initial begin
//1. 測試IDELAYE2模式為"FIXED"--------.IDELAY_TYPE("FIXED")
#10000 data_in_from_pins = 1'b1; //輸入脈沖
#20 data_in_from_pins = 1'b0;
//2.測試IDELAYE2模式為"VARIABLE"--------.IDELAY_TYPE("VARIABLE")
#200 ld = 1'b1; //控制信號(hào)
#50 ld = 1'b0;
#20 //"VARIABLE"模式下,使能ce和inc,Tap=Current Value + 1
ce = 1'b1;
inc = 1'b1;
#40
ce = 1'b0;
inc = 1'b0;
#20 data_in_from_pins = 1'b1; //輸入數(shù)據(jù)
#20 data_in_from_pins = 1'b0;
//3.測試IDELAYE2模式為"VAR_LOAD"--------.IDELAY_TYPE("VAR_LOAD")
#20 tap_value_in = 5'd5; //控制信號(hào)
#100 ld = 1'b1; //"VARIABLE"模式下,使能ld,Tap= CNTVALUEIN值
#50 ld = 1'b0;
#20 data_in_from_pins = 1'b1; //輸入數(shù)據(jù)
#20 data_in_from_pins = 1'b0;
#20 //“VAR_LOAD”模式下,使能ce和inc,Tap=Current Value + 1
ce = 1'b1;
inc = 1'b1;
#40
ce = 1'b0;
inc = 1'b0;
#20 data_in_from_pins = 1'b1; //輸入數(shù)據(jù)
???????#20?data_in_from_pins?=?1'b0;???????????????????????????????
end??????????????????????????????????????
5.3 仿真結(jié)果
1. IDELAY_TYPE="FIXED"時(shí),仿真結(jié)果如下圖所示。
圖4:IDELAY_TYPE="FIXED"仿真結(jié)果
.IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式選擇
.IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延遲Tap
如圖所示,當(dāng)IDELAY_TYPE="FIXED"時(shí):
data_in_from_pins_delay信號(hào)延遲:TapDelayTime=600ps+78ps*9=1302ps2. IDELAY_TYPE="VARIABLE"時(shí),仿真結(jié)果如下圖所示。
圖5:IDELAY_TYPE="VARIABLE"仿真結(jié)果
.IDELAY_TYPE("VARIABLE"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式選擇
.IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延遲Tap
如圖所示,當(dāng)IDELAY_TYPE="VARIABLE"時(shí),控制信號(hào)正向觸發(fā)一次,Tap值=Current Value + 1,如圖tap_value_out = 10,故:
data_in_from_pins_delay信號(hào)延遲:TapDelayTime=600ps+78ps*10=1380ps3. IDELAY_TYPE="VAR_LOAD"時(shí),使能LD信號(hào),仿真結(jié)果如下圖所示。
圖6:IDELAY_TYPE="VAR_LOAD"仿真結(jié)果
.IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式選擇
.IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延遲Tap
如圖所示,當(dāng)IDELAY_TYPE="VAR_LOAD"時(shí),使能ld,Tap= CNTVALUEIN(tap_valude_in)值,如圖tap_value_out = 5,故:
data_in_from_pins_delay信號(hào)延遲:TapDelayTime=600ps+78ps*5=990ps4. IDELAY_TYPE="VAR_LOAD"時(shí),使能CE和INC信號(hào),仿真結(jié)果如下圖所示。
圖7:IDELAY_TYPE="VAR_LOAD"仿真結(jié)果
.IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式選擇
.IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延遲Tap
如圖所示,當(dāng)IDELAY_TYPE="VAR_LOAD"時(shí),使能ce和inc,Tap= Current Value + 1=6,如圖tap_value_out = 6,故:
data_in_from_pins_delay信號(hào)延遲:TapDelayTime=600ps+78ps*6=1068ps.