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

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

3天内不再提示

SERDES的工作原理及实现细节

倩倩 来源:CSDN 作者:CSDN 2022-09-05 14:30 次阅读

高速串行通信经常需要用到 XILINX FPGA 内部专用的 SERDESE 模块来实现串并转换。LVDS 配合 SERDESE可以充分发挥 FPGA 的高速接口优势。SERDESE 分输入和输出,输入采用 ISERDESE, 输出采用 OSERDESE,OSERDESE 的使用要比 ISERDESE 简单。

本文涉及到一些重要原语概念,包括 idelay 延迟原语,IDELAYCTRL原语, ISERDESE 、OSERDESE。其中很关键一点时使用 idelay 延迟模块以及 ISERDESE 原语中 BITSLIP 功能,实现比特流的时钟对齐,以及数据流的位流顺序对齐。XILINX FPGA 高速通信中经常会用到 idelay模块对信号比特流做细微的时序调整。

参考文档包括:官方手册ug471,xapp585,第三方米联客教程

1、IDELAYCTRL模块

30a7c0c8-2cd8-11ed-ba43-dac502259ad0.png

2、IDELAY模块

30d3a026-2cd8-11ed-ba43-dac502259ad0.png

3、IDELAY模块工作时序

30fb49b4-2cd8-11ed-ba43-dac502259ad0.png

3113a144-2cd8-11ed-ba43-dac502259ad0.png

4、OSERDES模块

3132c92a-2cd8-11ed-ba43-dac502259ad0.png

OSERDES模块数据传输方式支持SDR,DDR两种,数据位宽支持级联以扩展到14比特。

3152b8e8-2cd8-11ed-ba43-dac502259ad0.png

317156c2-2cd8-11ed-ba43-dac502259ad0.png

由上图可知,OSERDES串行输出的数据流与原始并行数据比较,大小端是相反的。

5、ISERDES模块

ISERDESE2 在 SDR 模式下数据转换的位宽可以为 2、 3、 4、 5、 6、 7、 8bit,在 DDR 模式时,数据转换位宽为 4、 6、 8bit, 2 个 ISERDESE2 级联使用, DDR 模式可以支持 10、 14bit。如下图所示通过 2 个 ISERDESE2 级联输出14bit 位宽数据接口。

31993e3a-2cd8-11ed-ba43-dac502259ad0.png

6、Bitslip数据对齐功能

31bb8d00-2cd8-11ed-ba43-dac502259ad0.png

31de5010-2cd8-11ed-ba43-dac502259ad0.png

7、Serdes时钟源设计要求

3200fe4e-2cd8-11ed-ba43-dac502259ad0.png

二、源码解析

1、SDR ISERDESE 时钟恢复

ISERDESE 的作用是和 OSERDESE 相反的过程,但是比 OSERDESE 稍微复杂一些。ISERDESE 代码需要实现自动找到最佳的数据采样点, 自动完成数据对其,其中的加入了 IDELAY 和 BITSLIP 功能的使用,以及一些状态机代码。笔者下面根据 XAPP585 中给出的 demo 源码分析。

1.1使用IDELAY之前,需配置IDELAYCTRL。

322af5f0-2cd8-11ed-ba43-dac502259ad0.png

1.2 计算比特流最大速率参数

官方源码仿真使用的并行时钟为80M,SDR模块采用1_to_7串并转换,则Serdes工作速率为560Mbps,由此可以得到Idelay调节Tap最大的步数。

3247f092-2cd8-11ed-ba43-dac502259ad0.png

设置 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。

1.3 如何实现时钟恢复时,差分时钟信号正负相位对齐

查看源码可知,SERDES工作速率为560Mbps参数,就可以选出 bit_rate_value 为 0557, 所以 bt_val 为 17h。先取出 bt_val 的中间值,即17h 的中间值是 0Bh。把差分时钟n 的延迟时间设定为0Bh,把差分时钟p的初始延迟设定为17h,然后保持差分时钟n 的延迟时间不变,每次调节1个Tape,用于差分时钟p和差分时钟n的反向 进行相位对比,直到二者相位差为零。这个细节就是实现差分时钟信号对齐的核心,看代码时很容易忽略。我在第一遍时就犯了这个错误,导致始终不明白所以然。

32795d6c-2cd8-11ed-ba43-dac502259ad0.png

32a97664-2cd8-11ed-ba43-dac502259ad0.png

1.4 Bitslip进行比特流位顺序调节

32c69870-2cd8-11ed-ba43-dac502259ad0.png

这段代码不复杂,Bitslip的调节原理见上文,也容易理解。

1.5 差分时钟正负信号时序补偿

32e55aee-2cd8-11ed-ba43-dac502259ad0.png

需要把上述代码段看明白就知道补偿原理了。

通过控制每次减 1 个 tap,减少 idelay 延迟,并且通过 ISERDESE 检测时钟的跳变。当第一次跳变发生的时候,代表检测到了时钟的跳变沿,假设这个时候 bt_val=05h,05h<0Bh 所以计算出时钟的 0BH+05H =10H。

如果恢复出的时钟信号不是目标Pattern值 1100001 或者 1100011,就需要用到 Bslip 调整,每次设置 Bslip 调整一次。

330cc2a0-2cd8-11ed-ba43-dac502259ad0.png

仿真结果如上图的箭头所示,接收的 clk_data 是 7bit 时钟数据,通过调整 c_delay_in 值调整 idelay每次减 1 个 tap,直到 clk_data 发生改变,可以看到这个值是 0b 整好是和中间值相等。这个时候状态机 state2 也会进入状态 1,这个时候计算出 c_delay_in_target=0,这个就是我们需要延迟的时间,可以看到需要延迟的时间为 0,这种情况非常理想,如果实际程序跑起来一般不会是 0,之后进入状态 2。在状态 2 中继续调整 c_delay_in 直到和 c_delay_in_target 相等,如下图,可以看到 clk_data=1100001b 是占比3:4 的时钟就恢复出来了。

总结:

本篇文档通过学习米联客的教程,并结合UG471的学习,XAPP585的源码学习,来不断加深SERDES的工作原理及实现细节,并记录一下自己学习过程,仿真有助于理解源码。

审核编辑 :李倩

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

    关注

    9

    文章

    676

    浏览量

    64229
  • 源码
    +关注

    关注

    8

    文章

    571

    浏览量

    28581
  • SerDes
    +关注

    关注

    6

    文章

    176

    浏览量

    34536

原文标题:XAPP585 - Serdes 1_to_7_sdr 解读

文章出处:【微信号:Hack电子,微信公众号:Hack电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SERDES的作用 SerDes基础知识详解

    SERDES是英文SERializer(串行器)/DESerializer(解串器)的简称。
    的头像 发表于 01-04 09:04 974次阅读
    <b class='flag-5'>SERDES</b>的作用 <b class='flag-5'>SerDes</b>基础知识详解

    晶振的工作原理

    晶振的工作原理
    的头像 发表于 12-08 17:32 572次阅读
    晶振的<b class='flag-5'>工作原理</b>

    锁存器的工作原理

    锁存器的工作原理  锁存器(latch)是一种用于存储和记忆数字信号的电路。它被广泛用于计算机和数字电子电路中,用于实现内存存储、寄存器和其他计算单元。 锁存器的工作原理是通过反馈电路和放大
    的头像 发表于 12-08 11:18 2543次阅读

    用单片机实现语音提示、报警系统的工作原理

    电子发烧友网站提供《用单片机实现语音提示、报警系统的工作原理.pdf》资料免费下载
    发表于 10-27 11:09 0次下载
    用单片机<b class='flag-5'>实现</b>语音提示、报警系统的<b class='flag-5'>工作原理</b>

    芯片是如何工作的呢?工作原理是什么呢?芯片是如何实现运算的?

    芯片是如何工作的呢?工作原理是什么呢?芯片是如何实现运算的? 芯片是一种集成电路器件,其中包含了很多个晶体管、电容、电阻和其他元件。这些元件互相连接,像一个巨大的电路板一样,被封装在一个微小的硅片
    的头像 发表于 10-25 15:02 5828次阅读

    为什么我们需要SERDESSERDES的优点有哪些?

    尽管设计和验证很复杂,SERDES 已成为 SoC 模块不可或缺的一部分。随着 SERDES IP 模块现已推出,它有助于缓解任何成本、风险和上市时间问题。
    的头像 发表于 10-23 14:44 523次阅读
    为什么我们需要<b class='flag-5'>SERDES</b>?<b class='flag-5'>SERDES</b>的优点有哪些?

    SerDes是怎么设计的?(一)

    到Serial RIO……等等,都是在借助SerDes来提高数据传输的性能。SerDes是非常复杂的数模混合设计,用户手册的内容只是描述了相对粗略的概念以及使用方法,并不能完全解释SerDes是怎么
    的头像 发表于 10-16 14:50 670次阅读
    <b class='flag-5'>SerDes</b>是怎么设计的?(一)

    励磁工作原理

      励磁工作原理是指在电磁设备中通过外加电流或磁场来增强设备中的磁场强度的过程。在电磁设备中,励磁是非常重要的步骤,它能够保证设备正常运行,并实现设备的预期功能。本文将从基本概念、工作原理和应用方面介绍励磁
    的头像 发表于 09-27 11:03 1867次阅读

    欠压保护工作原理 欠压保护是如何实现

    欠压保护工作原理 欠压保护是如何实现的  欠压保护系统作为现代电气设备保护系统中不可或缺的一部分,主要是在电气设备工作时防止电源电压过低,从而保护设备的正常工作。该保护措施基于对欠压现
    的头像 发表于 09-26 16:38 2713次阅读

    serdes串行发送和接收是怎么实现的?serdes就是用56G的ADC和DAC吗?

    对于图1所示TX/RX模拟部分的实现方式,大家是不是一直有这样的疑问: Serdes在将并行data通过DAC串行发出去的时候,或者在接收端通过ADC进行串行data采样的时候,是怎么实现的?比如56G的
    的头像 发表于 09-08 15:59 985次阅读
    <b class='flag-5'>serdes</b>串行发送和接收是怎么<b class='flag-5'>实现</b>的?<b class='flag-5'>serdes</b>就是用56G的ADC和DAC吗?

    基于FPGA芯片的SERDES接口电路设计

    的ASSP 或ASIC 器件。在过去几年中已经看到有内置SERDES 的FPGA 器件系列,但多见于高端FPGA芯片中,而且价格昂贵。 本方案是以CME的低功耗系列FPGA的HR03为平台,实现
    的头像 发表于 07-27 16:10 1881次阅读
    基于FPGA芯片的<b class='flag-5'>SERDES</b>接口电路设计

    什么是SerDesSerDes的应用场景又是什么呢?

    首先我们要了解什么是SerDesSerDes的应用场景又是什么呢?SerDes又有哪些常见的种类?
    的头像 发表于 06-06 17:03 5323次阅读
    什么是<b class='flag-5'>SerDes</b>?<b class='flag-5'>SerDes</b>的应用场景又是什么呢?

    如果不使用FPGA自带的SERDES,可否适用LVDS接口实现其功能?

    如果不使用FPGA自带的SERDES,可否适用LVDS接口实现其功能?
    发表于 05-08 17:37

    可以在运行时切换SerDes协议吗?

    我正在尝试在运行时重新配置 SerDes 通道协议,而且我几乎已经开始工作了。环回 (XGLP) 工作,即 MAC 看到我传输的数据包,但它不能通过 SGMII/XFI 线路将数据包发送到以太网 PHY。 是否可以在运行时更改
    发表于 04-28 08:28

    P2041 Serdes PLL无法正常工作怎么解决?

    。 |---B1PLLCR0 = 0x0000000c。 |---B1PLLCR1 = 0x08000100。 这意味着 Serdes 重置失败。 以下是我的 RCW: 在此之后,我为 SRDES 执行
    发表于 04-24 07:35