首页
学习
活动
专区
圈层
工具
发布

串并转换的几种实现方式,资源占用和速度怎么平衡

说起来,串并转换这玩意儿搞硬件的基本上都会碰到。不管是你在调Serdes接口,还是接LVDS屏,或者做高速ADC采样,串并转换都是绕不开的一环。

最近好几个朋友问我,说项目里到底该用哪种方式来实现串并转换,是直接用移位寄存器,还是上LUT查表,又或者干脆调用官方IP核?今天咱们就来好好聊聊这个话题。

先搞清楚什么是串并转换

串并转换说白了就是两件事:串行转并行(PISO,Parallel-In Serial-Out)并行转串行(SIPO,Serial-In Parallel-Out)。前者是你有一堆数据要发出去,后者是你收到一堆串行数据要拿出来用。

图1: SIPO(串行转并行)基本原理示意

按我的经验,在FPGA里SIPO用得更多一些,毕竟高速串行数据进来,总得变成并行数据才能好好处理。典型的应用场景包括:

Serdes收发器:这是最常见的,28Gbps、32Gbps的Serdes一秒钟能传几十Gb数据• LVDS/DSI屏幕接口:手机屏幕那种RGB数据,一对差分线要传好几个G的数据• 高速ADC/DAC:采样率上去了,数据线太多布线困难,就得靠串行接口• 光纤通信:SRIO、Ethernet这些,背后全是串并转换在干活

方案一:移位寄存器,最简单粗暴

先说最基础的办法——直接用移位寄存器。代码大概长这样:串行数据一个时钟周期进来一位,然后在时钟驱动下往右移,等移够数了,并行数据就出来了。

这种方式的好处就是简单,资源消耗也少。你就占用N个寄存器,N是你要转换的位宽,比如8位转1位就用8个触发器,100MHz时钟轻松跑。

但问题来了——速度受限。你这个时钟频率能跑多快,全看你这个移位寄存器链能跑多快。一般FPGA里,单级寄存器链跑个几百MHz问题不大,但要上到GHz级别,那就难了。

还有个坑就是跨时钟域的问题。串行数据那边可能是高速时钟,你转成并行之后要跟本地逻辑对接,不加握手或者FIFO的话,数据错位是常有的事。

方案二:LUT查表,灵活度拉满

第二种办法是用查找表(LUT)来实现。说白了就是提前把输入和输出的对应关系存好,输入是地址,输出是对应的并行数据。

这种方式的优势是灵活。你可以配置成任意位宽的串并转换,比如3:1、7:1、14:1这种非标准比例, LUT都能搞定。而且LUT本身就能当分布式RAM用,一举两得。

资源占用方面呢,会比纯寄存器多一些,毕竟一个LUT6能存64个bit,但如果你要转的位宽很大,那LUT的消耗就比较可观了。

速度方面倒是还行,LUT的查找延迟比较固定,时序好约束。不过当你的位宽转换比例很高的时候,输入端口会很多,这时候布线的拥塞问题得注意一下。

方案三:IP核,省心但要花钱

第三种就是直接用官方提供的IP核了。Xilinx有ISERDESE2,Intel有altlvds_rx,这些硬核是专门为高速串并转换设计的。

IP核的好处是功能完善:内部有Gearbox可以支持不同的位宽比例,有时钟管理能处理多路相位,还有数据对齐电路防止数据错位。你需要做的就是配置参数,然后连线。

但代价是什么呢?资源占用肯定比手写的多,而且这些IP核是要占专用硬件资源的。以Xilinx的ISERDES为例,每个ISERDESE2能处理1:2到1:8的串并比,如果你要1:16,就得级联两个。

还有一点需要注意:IP核的资源占用不是线性的。你以为用两个1:8的IP就能实现1:16?不对,级联之后时序和资源消耗都会有变化,这个坑不少人踩过。

图2: 三种方案的资源占用与速度对比

横向对比一下

说了这么多,估计你心里还是没底。咱们直接上个表格对比一下:

图3: 串并转换实现方式详细对比

实现方式资源占用速度上限位宽灵活度开发难度适用场景移位寄存器最少中等(~500MHz)固定低低速、对称串并转换LUT查表中等较高(~800MHz)灵活中非标准比例、分布式存储IP核较多最高(GHz级)半固定低高速Serdes、标准化接口

实战选型,我的经验之谈

说了这么多理论,其实实际项目里怎么选型才是关键。按我的经验,给你几个判断标准:

第一,看你的数据率。如果你的串行数据率在1Gbps以下,移位寄存器完全够用,没必要上IP核。如果在1Gbps~10Gbps之间,可以考虑LUT或者简单IP核。到了10Gbps以上,基本上就只能用官方的高速Serdes硬核了。

第二,看你的资源预算。如果你的FPGA资源紧张,比如用了个小封装芯片,那移位寄存器是首选。资源充裕的话,IP核能省很多调试时间。

第三,看你的位宽比例。如果是标准比例比如1:4、1:8,IP核最省心。如果是非标准比例比如3:1、7:1,那得用LUT或者自己写Gearbox。

第四,看你的调试容不容易。说实话,串并转换的调试有时候挺烦人的。数据对不上,是移位错了还是对齐出了问题?IP核有现成的调试接口,查起来方便。自己写的方案,调试就得花更多时间。

图4: 根据数据率选择串并转换方案流程图

几个容易踩的坑

最后说几个我见过的常见问题:

坑一:时钟域没处理好。串行数据那边的时钟和FPGA内部的时钟如果不是同源的,一定要做跨时钟域处理,不然数据错位是必然的。

坑二:Gearbox配置错误。用IP核的时候,Gearbox的延迟周期数要算清楚。配置错了,要么丢数据要么取错数。

坑三:布线拥塞。当你做高比例的串并转换(比如1:64),输入端口会特别多,这时候FPGA的布线资源会很紧张。建议提前做下布局规划。

坑四:电平标准不匹配。有些串行接口有特殊的电平要求,比如Serdes用的CML、LVDS用的LVDS25,这些要和FPGA的IO标准对上,不然信号质量会很差。

总结一下

说了这么多,其实核心就一句话:根据你的实际需求来选,没有最好的方案,只有最适合的方案。

速度要求不高、资源紧张,就用移位寄存器,省心省资源。速度要求高、位宽比例特殊,就上LUT查表。速度要求很高、要做标准化接口,就用官方IP核。

当然,实际项目中往往不会只用一种方式。高速部分用IP核,控制逻辑用移位寄存器,这都很正常。关键是搞清楚每种方式的优缺点,才能在设计时做出合理的决策。

好了,关于串并转换就聊到这儿。如果你还有什么疑问或者想讨论的具体场景,欢迎在评论区留言。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O8jEcEoMI_VMf8QGAmYokDZw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券