本文转载自:硬码农二毛哥的微信公众号
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原语。