0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Idelay对接收端时序进行补救

冬至配饺子 来源:Bug记录 作者:woodfan 2022-08-20 10:50 次阅读

在高速信号采集的过程中,经常会因为电路设计或者其他原因,原本设计好对应的data_clk与data经过线路传输之后在接收端时序上不能很好的对应,这可能会造成采样数据的错位。

如果用了各种物理电路上的办法都没法解决后,可以尝试使用Idelay(针对Xilinx,Altera应该也有相应的原语)。

Xilinx每个系列可能Idelay的名字会有一些差异,但差异不大,在K7系列下,Idelay的原语叫做Idelay2。

Idelay2原语示例:

(* IODELAY_GROUP = "RX_FRAME" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYE2 #(
.CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC("DATAIN"), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(INIT_VALUE), // Input delay tap setting (0-31)
.PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT(cnt_value), // 5-bit output: Counter value output
.DATAOUT(rx_frame_dly), // 1-bit output: Delayed data output
.C(sys_clk), // 1-bit input: Clock input
.CE(1'b0), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(tap_value), // 5-bit input: Counter value input
.DATAIN(rx_frame), // 1-bit input: Internal delay data input
.IDATAIN(1'b0), // 1-bit input: Data input from the I/O
.INC(1'b0), // 1-bit input: Increment / Decrement tap delay input
.LD(1'b1), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(1'b0), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(1'b0) // 1-bit input: Active-high reset tap-delay input
);

针对其中经常用到的变量,功能如下:

DELAY_SRC常量,这个常量可以选DATAIN或IDATAIN,区别在于IDATAIN的数据输入要求经过BUF产生,常用于BUF的输出信号,Input端口信号;DATAIN只要求FPGA内部逻辑产生的信号就可以。

IDELAY_TYPE,设置IDELAY2的模式;FIXED代表延时值固定,一般用在确定好参数后使用,VARIBLE,VAR_LOAD,VAR_LOAD_PIPE都是动态改变延时值,VARIBLE可以自动增大减小,后两个是根据CINVALUEIN端口动态改变延时值,一般选用VAR_LOAD。

IDELAY_VALUE,是初始化的值,在FIXED模式下,就是固定的延时值

REFCLK_FREQUENCY,指的Idelay的参考时钟的频率,一般选用200M,这个后面会具体讲。

SIGNAL_PATTERN,这个有DATA和CLOCK两个选项,影响Vivado对信号时序分析的路径。

端口中,

CNTVALUEIN是设置延时值,用于手动调试;

CNTVALUEOUT输出当前延时值,便于调试观测;

C是数据时钟,但CE不是时钟使能,而是延时值tap自动增加减少使能,所以我选择拉低;

CINVCTRL,INC,LDPIPEEIN,REGRST不怎么用,全拉低;

在上面的DELAY_SRC选择了哪一个,就在对应的数据端口连接数据,另一个数据端口拉低,比如DELAY_SRC设定为"DATAIN",选择DATAIN端口输入数据,IDATAIN端口拉低;

因为需要手动调节延时值,所以LD拉高,只有LD拉高才能动态载入CNTVALUEIN的延时值

前面说到参考时钟,Idelay之所以延时,CINVALUEIN对应的延时值多少就跟这个地方有关系了,参考时钟不是随便设的,这跟另一个原语IDELAYCTRL有关:

(* IODELAY_GROUP = "RX_FRAME" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYCTRL IDELAYCTRL_inst (
.RDY(idelay_rdy), // 1-bit output: Ready output
.REFCLK(ref_clk), // 1-bit input: Reference clock input
.RST(rst) // 1-bit input: Active high reset input
);


这个原语端口很少,连接对应200M的参考时钟,复位信号,输出一个ready信号;

看起来这个原语并没有什么有用的输出;但其实它的作用是给Idelay2提供了延时的依据;之所以可以精确延时并不是说我们在REFCLK_FREQUENCY填一个200就可以了,而是这个IDELAYCTRL 的作用,通过(* IODELAY_GROUP = "RX_FRAME" *)将IDELAYCTRL 和Idelay2连接起来,"RX_FRAME"类似于组名,可以随意改,同一组的组名要一样。

200MHz 对应1个时钟周期5ns,Idelay将其分为64tap,每个tap延时值大概是78ps,Idelay可调的最大tap为31,也就是延时值控制在0-31tap;

同样,为了减小相同参考时钟下Idelay2与IDELAYCTRL 的FPGA内部走线延时,必须使用IODELAY_GROUP将它们绑定在一起,使用方法参考上面的做法。

注意,IDELAYCTRL 的REFCLK输入时钟一定要经过BUFG输出再接入。

效果:

没加Idelay

pYYBAGMAS0CAYbmZAABKfq5RR0Y851.png

没有加Idelay,并串转换中找不到帧头

加入Idelay

poYBAGMAS0mABuMvAABNQsJyH4I401.png

加了Idelay,找到帧头

总结:

使用方法都在上面,对于多bit信号可以使用generate for 生成块。

调试这个的时候遇到过一个问题,C端口没有连接到正常的时钟,连接到一个根本没有定义的信号,Vivado做好事不留名的直接帮我拉低到地,导致我在VAR_LOAD模式下一直无法正常改变延时值,CNTVALUEOUT与CINVALUEIN不正确,最后打开Schematic看RTL图才找到问题。

这一系列都是Xilinx中SelectIO的内容,包括I/ODDR,I/OBUFDS,下一篇就会讲到ISERDES,并串转换的一种用法,Idelay经常与ISERDES一同出现,解决高速串行通信上的问题。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21331

    浏览量

    593424
  • 串行通信
    +关注

    关注

    4

    文章

    536

    浏览量

    35025
  • 高速信号
    +关注

    关注

    1

    文章

    192

    浏览量

    17629
收藏 人收藏

    评论

    相关推荐

    xilinx FPGA中oddr,idelay的用法详解

    idelay2中按推荐配置,从DATAIN还是从IDATAIN输入区别为是内部延时还是从IO输入,FIXED固定延时,idelay value先输入0,,时钟是200M,其他全部接0。
    的头像 发表于 11-25 14:35 1w次阅读

    时序优化之接收端打拍策略探讨

    这篇文章是探讨对接收进行时序优化(即ready打拍,或称backward打拍)的方式。
    的头像 发表于 12-04 10:20 274次阅读
    <b class='flag-5'>时序</b>优化之<b class='flag-5'>接收</b>端打拍策略探讨

    请问AD7626与FPGA如何对接

    D+/-后如何进行字节对齐? 在自时候总模式下,AD7626要求接收能够动态的选择采样时钟相位,这在FPGA也是无法做到的。 请问有没有比较好的通过FPGA与AD7626对接的方
    发表于 12-22 06:34

    高速电路的时序分析

    正确收发数据,从而使系统不能正常工作。随着系统时钟频率的不断提高和信号边沿不断变陡,系统对时序有更高的要求,一方面留给数据传输的有效读写窗口越来越小,另一方面,传输延时要考虑的因素增多,要想在很短的时间限制里,让数据信号从驱动完整地传送到
    发表于 08-02 22:26

    基于Labview对接收到的TCP数据进行频谱检测

    包含Server和Client,Client端接收到TCP数据后,经过数据转换,在经过FFT处理、边界检测后进行频谱测量
    发表于 06-23 15:22

    如何为设计计算IDELAY_VALUE的值?

    我在sp601板上使用tri-ethernet-mac示例。gmii接收器接口使用IODELAY2原语来延迟接收器侧的输入信号。vhdl代码提到应该根据设计在ucf中更改IDELAY_VALUE。我
    发表于 05-28 06:40

    怎么对接收串口的数据进行处理?

    要编个程序,只要是接收串口的数据,接收串口数据的格式是:AA 73 XX XX XX XX CC 33 C3 3C,后面没有回车。只要是接收到该格式的数据后对XX XX XX XX进行
    发表于 07-31 02:45

    如何将IDELAY与IOBUF一起使用?

    大家好,我正在使用IDELAY原语来实现DDR的DQ和DQS延迟。这是我的代码:IOBUF pad_xb_dq7(.O(bus_data_in_flh [7]),. IO(xb_dq [7
    发表于 06-01 16:57

    请问时钟输入上的Virtex 7 IDELAY会导致占空比失真吗?

    我正在构建一个使用IDELAYS进行训练的DDR总线输入(找到有效的窗口和采样点)。我必须在时钟输入上使用IDELAY,以适当地定位边缘。 PLL不是一个选项,因为时钟停止和启动。我的问题是输入
    发表于 07-15 06:06

    怎样去设计SpaeeWire Codec接收时序

    SpaceWire Codec接收是什么?怎样去设计SpaeeWire Codec接收时序?时钟域可划分为哪几个模块?如何实现多时钟域
    发表于 04-08 07:10

    如何利用STM32对接收的数据进行拆帧组码?

    如何利用STM32对接收的数据进行拆帧组码?
    发表于 12-09 08:00

    对接收一帧含有多个字节的不定长数据接收方式进行讨论

    在使用串口接收其他设备的数据时,应该针对数据的特点,譬如单字节与多字节、数据量大小、速度等,采用不同的接收方式。下面针对接收一帧含有多个字节的不定长数据接收方式
    发表于 12-09 07:16

    微波无线传能系统中,增减接收数量会对接收功率有影响吗?

    假设在一个室内、空旷的微波无线传能系统中,发射的发射功率固定,采用定向发射的方式将微波传送到固定的接收。此时在能量传输的主瓣或者旁瓣中加入与接收
    发表于 09-25 09:37

    新器件需要对接收机体系结构进行硬件比较

    新器件需要对接收机体系结构进行硬件比较
    发表于 05-12 13:44 0次下载
    新器件需要<b class='flag-5'>对接收</b>机体系结构<b class='flag-5'>进行</b>硬件比较

    Idelay时序补救

    在高速信号采集的过程中,经常会因为电路设计或者其他原因,原本设计好对应的data_clk与data经过线路传输之后在接收时序上不能很好的对应,这可能会造成采样数据的错位。
    的头像 发表于 06-16 11:26 1435次阅读
    <b class='flag-5'>Idelay</b>对<b class='flag-5'>时序</b>的<b class='flag-5'>补救</b>