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位并行数据输出时序如下:

时序

其中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

当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类似。如下图所示:

工程代码

关注公众号硬码农二毛哥,回复6,回去双向操作代码,代码中使用OSERDESE3、IDELAYE3、ISERDESE3和ODELAYE3原语。

最新文章

最新文章