目录
3.1.1 使用IDELAY之前,需配置IDELAYCTRL
1、实现总框图
2、实现用到的模块
2.1 IDELAYCTRL模块
用于设置输入延迟的分辨率
如果idelay的参考时钟是200MHZ 那么每个延迟节拍是78ps,23*78ps= 1,794 ps = 557 Mb/s.最接近560Mbps.
2.2 IDELAY模块
用于设置输入延迟
2.3 OSERDES模块
用于数据流并转串
OSERDES模块数据传输方式支持SDR,DDR两种,数据位宽支持级联以扩展到14比特。
出的数据流与原始并行数据比较,大小端是相反的。
2.4 ISERDES模块
相当于我们设置delay_value 从23->0 ,相当于移动了一个时钟(557 Mb/s)
用于数据流串转并
ISERDESE2 在 SDR 模式下数据转换的位宽可以为 2、 3、 4、 5、 6、 7、 8bit,在 DDR 模式时,数据转换位宽为 4、 6、 8bit, 2 个 ISERDESE2 级联使用, DDR 模式可以支持 10、 14bit。 如下图所示通过 2 个 ISERDESE2 级联输出14bit 位宽数据接口。
Bitslip 用来实现并行数据的边界对齐。串行输入的 8bit 的数据,经过串并转换后,数据之间可能会错位,这是串并转换无法识别的,因此 Bitslip 就专门用来找到用户需要的并行数据边界。
对于 SDR 模式,Bitslip 使能1次,则数据会左移1次,对于 8bit并行数据,移动8次完成一个循环,可以这样无止境的循环,直到找到用户定义的并行数据。对于 DDR 模式,Bitslip 工作方式不同,Bitslip 使能1次,会右移1次或者左移3次,数据两者交替进行,同样移动 8次完成一个循环。
1)、网络接口类型时钟要求
CLK 和 CLKDIV 必须确保相位相同。
CLK 由 BUFIO 驱动,CLKDIV 由BUFR驱动
CLK由MMCM或 PLL驱动,CLKDIV由同一MMCM或PIL的CLKOUT[0:6]驱动当使用 MMCM 驱动 ISERDESE2 的 CLK 和 CLKDIV 时,不能混用提供 ISERDESE2 的缓冲器类型。例如,如果CLK由BUFG驱动,则 CLKDIV也必须由BUFG驱动。另外,MMCM可以通过BUFIO和BOFR驱助ISERDESE2。
3、实现流程
3.1 SDR ISERDESE 时钟恢复
3.1.1 使用IDELAY之前,需配置IDELAYCTRL
3.1.2 计算比特流最大速率参数
官方源码仿真使用的并行时钟为80M,SDR模块采用1_to_7串并转换,则Serdes工作速率为560Mbps,由此可以得到Idelay调节Tap最大的步数。
设置 bit_rate_value=0560,那么代表了 serdes 的速率是 560Mbps,根据下面代码得出 bt_val=5’h17(bt_val=5’d23)。由上文可知, idelay 的参考时钟是 200MHZ, 那么每个延迟节拍是 78ps,则23*78ps= 1,794 ps = 557 Mb/s.最接近 560Mbps。
相当于我们设置delay_value 从23->0 ,相当于移动了一个时钟(557 Mb/s)
3.1.3 时钟恢复-(差分时钟信号正负相位对齐)
先取出 bt_val 的中间值,即17h 的中间值是 0Bh。把差分时钟n 的延迟时间设定为0Bh,把差分时钟p的初始延迟设定为17h,然后保持差分时钟n 的延迟时间不变,每次调节1个Tape,用于差分时钟p和差分时钟n的反向 进行相位对比,直到二者相位差为零。
① 设置初值
idelay_value_p初始值为init_value,
idelay_value_n初始值为init_value/2
② 搜索状态
idelay_value_p从init_value逐渐减少,等待Clkn_iserdes_data出现跳变(说明跳变位置为时钟的边沿),即捕获到时钟边沿。记录当前的idelay_value_p
③ 设置最终的p的延迟值
根据idelay_value_p计算出target_idelay_value_p(目的是让clk_p与clk_n错开半个高速rx_clk时钟周期,即设置最佳采样点的采样时刻),然后进行对idelay_cm模块进行设置。
3.2 字对齐
Bitslip进行比特流位顺序调节
将~clk_n当成数据,用clk_p的7倍频时钟进行采样
即数据应为:占空比为(4:3,3:4)
无偏差的情况下1111000或者1110000
if (Clkn_iserdes_data != 7'b1100001) begin flag1 <= 1'b1 ; end else begin flag1 <= 1'b0 ; end
if (Clkn_iserdes_data != 7'b1100011) begin flag2 <= 1'b1 ; end else begin flag2 <= 1'b0 ; end
上述代码设置Clkn_iserdes_data只有等于7'b1100001或者7'b1100011时停止bslip使能信号,即clkp与~clkn差半个慢时钟周期