LVDS接口总结--(5)IDELAY3仿真

仿真参考资料如下:

 https://zhuanlan.zhihu.com/p/386057087

`timescale 1 ns/1 ps
module tb_idelay3_ctrl();
    parameter	REF_CLK		=  2.5        ;  // 400MHz
    parameter	DIN_CLK	    =  3.3        ;  // 300MHz

    reg			                ref_clk     ;
    reg			                clk_din     ;
    reg			                rst     ;
    wire                        din     ;
    reg   [8 : 0]               cntvaluein;
    wire  [8 : 0]               cntalueout  ;
    wire                        rdy         ;
    wire                        dout        ;
    reg   [15 : 0]              test_pattern = 16'h0c55;
    reg   [3 : 0]               data_cnt = 4'h0;
    
    initial begin
        rst = 1;
        ref_clk = 0;
        clk_din = 0;
        #500;
        rst = 0;

    end
    
always #(REF_CLK/2)  ref_clk = ~ref_clk;
always #(DIN_CLK/2)  clk_din = ~clk_din;




    always @(posedge clk_din or posedge rst)begin
        if(rst)
              data_cnt <= 4'd0;
        else
              data_cnt <= data_cnt +1'd1;
        end
	

    assign	din = test_pattern[data_cnt];


    always @(posedge clk_din or posedge rst)begin
        if(rst)
              cntvaluein <= 9'd0;
        else if(data_cnt == 4'd15)
              cntvaluein <= cntvaluein +1'd1;
        else;
        end
    
     idelay3_ctrl  u_idelay_ctrl (
        .ref_clk    ( ref_clk       ),
        .rst        ( rst           ),
        .din        ( din           ),
        .cntvaluein ( cntvaluein    ),
        .cntalueout ( cntalueout    ),
        .rdy        ( rdy           ),
        .dout       ( dout          )
    );   
    		
endmodule

module idelay3_ctrl(
    input									ref_clk		    ,
    input									rst		    ,
    input				            	    din		    ,
    input       [8 : 0]                     cntvaluein  ,

    output      [8 : 0]                     cntalueout  ,
    output                                  rdy         ,
    output  	                            dout	     
    );

    
    
			
			
    
  IDELAYCTRL #(
      .SIM_DEVICE("ULTRASCALE")  // Set the device version for simulation functionality (ULTRASCALE)
   ) inst_IDELAYCTRL (
			.RDY(rdy), 					// 1-bit output: Ready output
			.REFCLK(ref_clk), 	// 1-bit input: Reference clock input
			.RST(rst) 		// 1-bit input: Active high reset input
			);	
			
			
   IDELAYE3 #(
      .CASCADE("NONE"),               // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
      .DELAY_FORMAT("TIME"),          // Units of the DELAY_VALUE (COUNT, TIME)
      .DELAY_SRC("IDATAIN"),          // Delay input (DATAIN, IDATAIN)
      .DELAY_TYPE("VAR_LOAD"),           // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
      .DELAY_VALUE(0),                // Input delay value setting
      .IS_CLK_INVERTED(1'b0),         // Optional inversion for CLK
      .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
      .REFCLK_FREQUENCY(400.0),       // IDELAYCTRL clock input frequency in MHz (200.0-800.0)
      .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version for simulation functionality (ULTRASCALE,
                                      // ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
      .UPDATE_MODE("ASYNC")           // Determines whe     n updates to the delay will take effect (ASYNC, MANUAL,SYNC)
   )
   IDELAYE3_inst (
      .CASC_OUT(),       // 1-bit output: Cascade delay output to ODELAY input cascade
      .CNTVALUEOUT(cntalueout), // 9-bit output: Counter value output
      .DATAOUT(dout),         // 1-bit output: Delayed data output
      .CASC_IN(1'd0),         // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT
      .CASC_RETURN(1'd0), // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT
      .CE(1'b0),                    // 1-bit input: Active-High enable increment/decrement input
      .CLK(ref_clk),                 // 1-bit input: Clock input
      .CNTVALUEIN(cntvaluein[8:0]),   // 9-bit input: Counter value input
      .DATAIN(),           // 1-bit input: Data input from the logic
      .EN_VTC(!rdy),           // 1-bit input: Keep delay constant over VT
      .IDATAIN(din),         // 1-bit input: Data input from the IOBUF
      .INC(1'b0),                // 1-bit input: Increment / Decrement tap delay input
      .LOAD(1'b1),               // 1-bit input: Load DELAY_VALUE input
      .RST(1'b0)                  // 1-bit input: Asynchronous Reset to the DELAY_VALUE
   );

endmodule

delay tap =0

127ps

delay tap =1

131ps

delay tap =2

135ps

delay tap =3

139ps

 

delay tap =100

527ps

delay tap =200

927ps

delay tap =219

1003ps

delay tap =468

1999ps

delay tap =511

2171ps

根据上表可知  delay_tap = 127 + 4N  (N的取值为0到511)

根据简单的计算可知,双沿300M数据(对应单沿600M数据),数据持续时间为1.66ns,取到中间需要0.83ns,对应177taps

04-01
<think>好的,用户问到了“idelay3”,我需要先确定这是什么。首先,可能是一个技术术语,或者是某个领域中的工具、软件、硬件模块? 首先,我会回想自己已有的知识。在电子设计自动化(EDA)领域,尤其是FPGA(现场可编程门阵列)设计中,Xilinx(现在是AMD的一部分)的器件中有一些原语用于时序调整,比如IDELAY和ODELAY。IDELAY用于输入延迟,ODELAY用于输出延迟。这些原语帮助调整信号在输入/输出时的延迟,以满足时序要求,特别是在高速接口中,如DDR、LVDS等。 然后,“idelay3”可能指的是Xilinx的第三代IDELAY原语,比如IDELAYE3。Xilinx在不同系列的FPGA中会更新这些原语,比如从7系列到UltraScale和UltraScale+,原语可能会有改进或版本升级。IDELAYE3可能是在较新器件中使用的,提供更精细的延迟控制,或者支持更多的功能,比如更宽的延迟范围、更精确的步进等。 接下来,需要确认IDELAYE3的具体特性和应用场景。比如,延迟的步长、最大延迟值、控制接口(是否通过AXI配置,还是直接使用控制信号)、是否支持动态调整延迟值等。此外,可能涉及到的时钟网络,参考时钟的选择,以及校准机制,比如是否自动校准以应对温度和电压变化的影响。 用户可能是在进行FPGA设计时遇到了时序问题,需要调整输入信号的延迟,因此想了解IDELAY3的使用方法。或者他们可能在阅读文档时遇到了这个术语,需要进一步解释。需要确保回答覆盖这些方面,并提供足够的技术细节,同时保持结构清晰,便于理解。 还需要考虑用户可能的背景。如果是初学者,可能需要更基础的解释,包括IDELAY的作用、为什么需要调整延迟、如何配置IDELAYE3原语等。如果是经验丰富的工程师,可能更关注第三代相比前代的改进、具体参数、使用中的注意事项等。 另外,需要注意Xilinx/AMD的文档结构,指出用户可以参考的具体手册,如UltraScale Architecture Configurable Logic Block User Guide或其他相关资源,以便他们进一步查阅。 最后,检查是否有混淆的可能,比如是否存在其他领域中的“idelay3”,比如软件中的某个库或工具,但根据常见的用法,更可能是在FPGA设计中的原语。因此,回答应集中在Xilinx FPGAIDELAYE3原语上,确保信息准确,并指导用户如何应用和配置它。</think>关于“IDELAY3”(或称为IDELAYE3)的介绍: 1. **基本定义** IDELAYE3是Xilinx(现AMD)UltraScale/UltraScale+系列FPGA中提供的一种输入延迟原语,属于高性能时序调整模块。它通过精确控制信号路径的延迟,帮助解决高速接口(如DDR、千兆以太网)中的时序收敛问题。 2. **核心功能** - **可编程延迟**:支持以精细步长(如UltraScale中为$5 \sim 10\ \text{ps}$)调整信号延迟,最大延迟范围可达$$ \text{MAX_DELAY} = 1250 \times \text{步长} $$ - **动态/静态模式**:支持实时动态调整或固定延迟配置 - **校准机制**:内置校准电路,可自动补偿电压和温度变化(PVT) 3. **关键参数** | 参数 | 典型值/选项 | |---------------|---------------------------| | 延迟分辨率 | 5ps (参考时钟为325MHz时) | | 最大延迟步数 | 1250步 | | 控制接口 | 通过RTL信号或AXI配置 | | 时钟输入 | 需独立参考时钟(REF_CLK) | 4. **应用场景** - **源同步接口**:对齐数据与随路时钟 - **高速ADC/DAC**:补偿PCB走线延迟差异 - **跨时钟域**:调整信号到达时间以满足建立/保持时间 5. **使用流程示例** ```verilog IDELAYE3 #( .CASCADE("NONE"), // 是否级联多个延迟单元 .DELAY_FORMAT("TIME"), // 延迟单位设为时间模式 .DELAY_SRC("IDATAIN"), // 输入信号源 .REFCLK_FREQUENCY(300.0) // 参考时钟频率(MHz) ) idelay_inst ( .CASC_IN(), // 级联输入 .CASC_OUT(), // 级联输出 .CASC_RETURN(), // 级联返回路径 .CE(1&#39;b0), // 动态模式下的使能信号 .CLK(ref_clk), // 参考时钟 .CNTVALUEIN(), // 动态延迟值输入 .DATAIN(1&#39;b0), // 非级联模式数据输入 .IDATAIN(rx_data), // 待延迟信号输入 .INC(1&#39;b0), // 动态模式增量控制 .LOAD(1&#39;b0), // 加载静态延迟值 .CNTVALUEOUT(), // 当前延迟值输出 .DATAOUT(delayed_data) // 延迟后输出 ); ``` 6. **设计注意事项** - **参考时钟稳定性**:需使用专用时钟网络,抖动需小于$$ \frac{\text{步长}}{2} $$ - **信号完整性**:建议在PCB布局时保持延迟调整信号路径对称 - **时序约束**:需在XDC文件中添加`set_input_delay`约束 建议进一步参考以下文档: - 《UltraScale Architecture Configurable Logic Block User Guide》(UG574) - 《SelectIO Resources User Guide》(UG571) 是否需要针对具体应用场景展开说明?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值