OSERDESE3与ODELAYE3原语

SelectIO 接口

UltraScale 架构的器件 包括三种I/O:高性能(HP), 高密度 (HD),和高量程(HR) I/O banks 。

  • HP I/O banks满足高速存储和片到片接口性能要求,电压最高1.8V。
  • HR I/O banks支持更大范围电压,电压最高3.3V。
  • HD I/O banks支持低速接口。

其中HP I/O bank中使用OSERDES传输速率可以达到1250Mb/s,ODELAYE经常与OSERDES联合使用,实现皮秒级延时。

OSERDESE3

​ OSERDESE3有两种模式:SDR和DDR。SDR模式下将2或4位并行数据串行输出,DDR模式下将4或8位并行数据串行输出。DDR模式下8位并行数据输出时序如下:

时序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBrsGnWc-1674905867324)(./pic/1.png)]

​ 其中CLK时钟频率是CLKDIV的4倍。

例化代码

OSERDESE3 #(
      .DATA_WIDTH(8),                 // 当输入是8bit并行数据是输入8
      .INIT(1'b0),                    // Initialization value of the OSERDES flip-flops
      .IS_CLKDIV_INVERTED(1'b0),      // 设置为1是CLKDIV时钟反向
      .IS_CLK_INVERTED(1'b0),         // 设置为1是CLK时钟反向
      .IS_RST_INVERTED(1'b0),         // 0为高复位,1为低复位
      .SIM_DEVICE("ULTRASCALE_PLUS")  // Set the device version for simulation functionality 
   )
   OSERDESE3_inst2 (
      .OQ(dataout),         // 输出1bit串行数据
      .T_OUT(t_out),   // 输出到IOB的三态控制端
      .CLK(clk),       // 高速时钟,8bit输入时,该时钟频率为CLKDIV的4倍
      .CLKDIV(clkdiv), // 低速时钟
      .D(data),           // 8bit并行数据输入
      .RST(rst),       //异步高复位
      .T(t_en)            //t_en控制t_out            
   ); 

ODELAYE3

ODELAYE3 原语可以对任意输出信号进行延迟。ODELAYE3原语包含512tap的延迟线。

COUNT 模式

该模式不使用IDELAYCTRL模块。延迟tap未标定,不进行温度和电压补偿。

在DELAY_VALUE 中设置taps,范围0-511。

TIME 模式

必须使用IDELAYCTRL模块。对延迟线进行标定,补偿温度和电压。IDELAYCTRL模式使用时钟与ODELAYE3时钟要一致。

属性

DELAY_FORMAT 属性

ODELAYE3原语中tap延迟有UltraScale器件手册中定义。

当DELAY_FORMAT 时TIME时。

  • 通过ODELAYCTRL模块针对电压和温度,对延迟线进行标定。
  • 当使用DELAY_TYPE使用VARIABLE或VAR_LOAD模式时,EN_VTC需要进行控制。当使用FIXED模式时,EN_VTC置1。

当DELAY_FORMAT 时COUNT时。

  • 不进行标定。不需要IDELAYCTRL模块
  • EN_VTC置0。

DELAY_VALUE属性

当DELAY_FORMAT设置成TIME模式时,DELAY_VALUE设置的值单位为ps。该模式下,写入CNTVALUEIN[8:0] 和从CNTVALUEOUT[8:0] 读取的值仍然为tap的数值。所以调整延迟线延迟时需要进行计算。

延迟类型

FIXED 模式

该模式设置固定延迟,不能动态调整。

当DELAY_FORMAT 为TIME时,EN_VTC 拉至高电平 ,进行温度电压补偿。此时DELAY_FORMAT设置值单位为ps。

当DELAY_FORMAT 为COUNT时,EN_VTC 接低电平 ,不进行温度电压补偿。此时DELAY_FORMAT设置值为tap数。

VARIABLE 模式

该模式可以通过CE和INC调整延迟。

当DELAY_FORMAT 为TIME时,调试延迟过程如下:

1、EN_VTC 置0

2、等待至少10个时钟周期

3、CE置1同时INC置1,增加延迟。CE置1同时INC置0,减少延迟。该过程可重复。

4、等待至少10个周期

5、EN_VTC 置1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wupBuKLs-1674905867325)(./pic/2.png)]

当DELAY_FORMAT 为COUNT时,EN_VTC 一直置0,调试延迟过程执行TIME模式1-4。

VAR_LOAD 模式

该模式下可以使用CNTVALUEIN写入tap置,在至少一个周期后将LOAD置1,将CNTVALUEIN写入DELAYE模块,通过CNTVALUEOUT 读取写入置是否正常。每次增加CNTVALUEIN值不要大于8,否则延迟线会发生抖动。该模式下依然可以使用INC增加或减少延迟。

设置流程如下:

1、EN_VTC 置0

2、等待至少10个时钟周期

3、CE置1同时INC置1,增加延迟。CE置1同时INC置0,减少延迟。该过程可重复。

4、设置CNTVALUEIN,至少一个周期后将LOAD置1,读取CNTVALUEOUT,判断设置是否正常。

5、等待至少10个周期

6、EN_VTC 置1

例化代码

  IDELAYCTRL #(
      .SIM_DEVICE("ULTRASCALE") 
   )
   IDELAYCTRL_inst (
      .RDY(ready1),       // 1-bit output: Ready output
      .REFCLK(clk3), // 1-bit input: Reference clock input
      .RST(sys_rst)        // 1-bit input: Active-High reset input.

   );

ODELAYE3 #(
      .CASCADE("NONE"),               // 不适用级联模式
      .DELAY_FORMAT("TIME"),          // (COUNT, TIME)选择TIME模式
      .DELAY_TYPE("VAR_LOAD"),        // (FIXED, VARIABLE, VAR_LOAD)选择VAR_LOAD
      .DELAY_VALUE(10),                // Output delay tap setting
      .IS_CLK_INVERTED(1'b0),         // 设置为1时CLK时钟反向
      .IS_RST_INVERTED(1'b0),         // 设置为1时RST高复位
      .REFCLK_FREQUENCY(200),       //(200.0-800.0)设置参考时钟频率
      .SIM_DEVICE("ULTRASCALE_PLUS"), // 
      .UPDATE_MODE("ASYNC")           // 
   )
   ODELAYE3_inst2 (
      .CASC_OUT(),       // 不使用
      .CNTVALUEOUT(cnt_value_out_test), // 9-bit output: Counter value output
      .DATAOUT(dataout),         // 延迟模块输出
      .CASC_IN(1'b0),         // 
      .CASC_RETURN(1'b0),   //
      .CE(ce),              // 高有效,与INC一起使用
      .CLK(clk),                 // 1-bit input: Clock input
      .CNTVALUEIN(cnt_value),   // 设置tap值
      .EN_VTC(en_vtc),           //TIME模式时变化,COUNT模式时置0
      .INC(inc),                 // 1时增加tap,0减少tap
      .LOAD(load),               // 1有效,导入CNTVALUEIN
      .ODATAIN(dataout),         // 信号输入
      .RST(rst)                  //高复位
   );

双向信号

当对IO进行双向操作时,除了使用OSERDESE3和ODELAYE3原语,还会用到ISERDESE3和IDELAYE3原语,ISERDESE3使用方法与OSERDESE3类似,IDELAYE3使用方法与ODELAYE3类似。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0e6P0Aa-1674905867326)(./pic/3.png)]

工程代码

关注公众号硬码农二毛哥,回复6,回去双向操作代码,代码中使用OSERDESE3、IDELAYE3、ISERDESE3和ODELAYE3原语。
在这里插入图片描述

<think>嗯,用户问的是关于ODDR的输出是否会被输入到OLOGICE3模块进行优化,以及这个过程具体是怎样的。首先,我需要确认用户对FPGA的IO架构是否有基本的了解,比如Xilinx的OLOGICE模块的作用。用户之前的问题是关于ODDR的SAME_EDGE模式如何满足RGMII时序的,现在进一步深入到具体的硬件模块,可能是在实际设计中遇到了问题,或者想更深入理解实现细节。 首先,应该回顾一下Xilinx FPGA中的OLOGICE结构。OLOGICE是IO逻辑的一部分,包含ODDR、OSERDES等组件,负责数据的并串转换和输出时序控制。用户提到的OLOGICE3应该是指7系列或UltraScale系列中的IO逻辑模块。需要解释OLOGICE3模块如何ODDR配合,特别是在时序调整和延迟补偿方面的机制。 接下来,用户可能想知道ODDR的输出如何通过OLOGICE3进行优化。这里的关键点包括时钟路径的对称性、数据路径的延迟匹配,以及可能使用的IODELAY功能。需要详细说明这些组件是如何协同工作的,以确保数据在输出到引脚时时钟边沿对齐,满足RGMII的严格时序要求。 另外,用户可能存在的误区是认为ODDR直接输出数据到引脚,而实际上中间经过OLOGICE3的处理,包括可能的延迟插入和调整。需要澄清这一流程,并解释为何这种设计能够优化时序,特别是如何补偿Tco(时钟到输出的延迟)和时钟树的不对称性。 还要考虑用户可能的应用场景,比如他们可能在设计一个使用RGMII接口的FPGA项目,遇到时序不满足的问题,所以想了解底层机制以便优化设计。因此,回答时不仅要解释理论,还要提供一些实际设计中的建议,比如如何利用Vivado工具进行约束和时序分析,确保OLOGICE3的正确配置。 另外,需要确认是否有必要提到具体的FPGA系列,比如7系列或UltraScale,因为OLOGICE的结构可能有所不同。同时,是否需要提到OSERDES等其他组件,或者专注于ODDROLOGICE3的关系。 最后,用户的问题可能隐含对FPGA内部资源如何协同工作的兴趣,因此需要结构化的回答,分步骤解释数据从ODDR到OLOGICE3的处理流程,以及每个步骤如何优化时序,满足RGMII的要求。</think>您的问题触及了 **FPGA I/O架构的底层硬件优化机制**。ODDR的输出确实会经过 **OLOGICE3模块(以Xilinx 7系列为例)** 的精细调整,最终在物理引脚上实现时钟边沿的严格对齐。以下是具体流程的分步解析: --- ### 一、**OLOGICE3模块的核心功能** OLOGICE3(Output Logic Element)是Xilinx FPGA中 **专用I/O逻辑模块**,位于ODDR和物理引脚之间,负责以下关键操作: 1. **数据路径延迟控制**:通过硬件电路补偿时钟数据的传播延迟差异。 2. **动态相位调整**:支持插入可编程延迟(IODELAY),微调数据输出时序。 3. **时钟网络匹配**:确保时钟信号数据路径的传播延迟对称。 ![OLOGICE3模块结构](https://docs.xilinx.com/r/2021.2-English/ug471_7Series_SelectIO/Images/ug471_5_1_IOB_Output_Logic.jpg) --- ### 二、**ODDROLOGICE3的协同工作流程** 以 **RGMII接口的TX路径** 为例,数据从ODDR到物理引脚的完整路径如下: #### 1. **ODDR输出阶段** - **SAME_EDGE模式行为**: - **上升沿锁存D1/D2** → **上升沿输出D1**,**下降沿输出D2**。 - 此时数据尚未经过物理延迟补偿,直接输出的信号可能 **超前或滞后于时钟边沿**(受Tco影响)。 #### 2. **OLOGICE3的时序优化** - **关键步骤**: - **时钟树延迟匹配**: - FPGA的全局时钟网络(BUFG)将时钟信号分配到ODDR和OLOGICE3时,会通过 **对称布线** 确保时钟路径延迟一致。 - **数据路径补偿**: - OLOGICE3内部通过 **固定硬件延迟电路**(如固定Tco补偿值)或 **IODELAY原语**,主动插入延迟,使数据跳变时钟边沿对齐。 - **输出缓冲控制**: - 通过配置输出驱动强度(Drive Strength)和压摆率(Slew Rate),减少信号在PCB上的上升/下降时间抖动。 #### 3. **物理引脚输出** - 经过OLOGICE3优化后,数据(TXD)和时钟(TXC)信号在引脚处满足: - **上升沿数据(TXD[0])** 在时钟上升沿 **±1ns窗口内稳定**。 - **下降沿数据(TXD[1])** 在时钟下降沿 **±1ns窗口内稳定**。 --- ### 三、**延迟补偿的硬件实现细节** #### 1. **IODELAY的两种模式** - **固定延迟模式**: - 根据FPGA型号预定义延迟值(如7系列的Tap=78ps),通过代码约束直接插入固定延迟。 - 示例代码(Vivado): ```verilog ODELAYE3 #( .DELAY_FORMAT("TIME"), .DELAY_VALUE(200) // 插入200ps延迟 ) u_odelay_txd ( .CASC_RETURN(), .CE(1&#39;b0), .CLK(clk), .CNTVALUEOUT(), .DATAOUT(txd_delayed), // 延迟后的数据 .ODATAIN(txd_raw) // ODDR原始输出 ); ``` - **动态校准模式**: - 通过IDELAYCTRL模块实时校准延迟值,适应电压和温度变化(需外部参考时钟)。 #### 2. **时钟-数据路径的对称性设计** - **时钟树平衡**:FPGA布局布线工具(Vivado)会自动优化时钟路径,确保到达ODDR和OLOGICE3的时钟信号延迟差异极小(通常<10ps)。 - **数据路径匹配**:强制约束数据信号走专用高速路由资源(如HP Bank),减少其他信号的串扰。 --- ### 四、**如何验证时序对齐?** #### 1. **硬件测量** - **示波器观测**:直接测量TXC和TXD信号的边沿对齐情况。 - **眼图测试**:通过高速示波器或BERT(误码率测试仪)验证信号完整性。 #### 2. **工具仿真** - **时序仿真**:在Vivado中生成后仿网表,检查时钟-数据偏移是否在允许范围内。 - **约束检查**: - 需在XDC文件中明确约束输出延迟: ```tcl set_output_delay -clock [get_clocks rgmii_clk] -max 1.0 [get_ports TXD*] set_output_delay -clock [get_clocks rgmii_clk] -min -1.0 [get_ports TXD*] ``` --- ### 五、**设计实践建议** 1. **优先使用SAME_EDGE模式**:避免OPPOSITE_EDGE模式的双沿锁存复杂性。 2. **启用IODELAY校准**:尤其在高温/低压场景下,动态校准模式更可靠。 3. **约束时钟不确定性**:明确指定时钟抖动(Clock Jitter)和延迟差异。 ```tcl set_clock_uncertainty -from [get_clocks rgmii_clk] -to [get_clocks rgmii_clk] 0.1 ``` --- ### 总结:OLOGICE3的优化本质 通过 **硬件级延迟补偿** 和 **时钟-数据路径对称性设计**,OLOGICE3模块将ODDR的“逻辑对齐”转化为“物理对齐”,最终满足RGMII等高速接口的严苛时序要求。这种优化完全依赖FPGA底层架构,无需用户手动干预延迟计算。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬码农二毛哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值