☰
Cyclone V FPGA LVDS SerDes直通实战:从IP配置到屏幕驱动
2026/10/6 7:21:02 网站建设 项目流程

1. 项目缘起与整体设计思路

屏幕直通这个需求,最早来自我手上一个工业相机项目。前端是一颗图像传感器,输出LVDS信号,后端要接一块LCD屏做实时预览。中间原本用专用桥接芯片,但芯片交期一拖再拖,价格也翻了几倍,于是我把目光转向了手边现成的Cyclone V开发板。用FPGA做LVDS收发,把图像数据从一端搬到另一端,逻辑上就是"直通",但真正动手才发现,这里面涉及SerDes配置、时钟域处理、数据对齐、时序约束一整套东西,任何一个环节没弄对,屏幕上要么花屏,要么干脆黑屏。

这篇内容就是把我从零调通这套链路的完整过程整理出来。核心目标很明确:在Cyclone V上配置LVDS SerDes IP,接收前端LVDS图像数据,经过必要的格式整理后,再通过LVDS发送出去,驱动屏幕显示。适合已经写过一些Verilog、对FPGA开发流程有基本了解,但没怎么碰过高速SerDes的工程师参考。如果你正在做图像采集、屏幕驱动、多路LVDS桥接这类项目,这套思路可以直接复用。

先说清楚为什么选Cyclone V。这颗芯片在工业领域用量极大,性价比高,而且它的LVDS资源相当扎实——每个I/O bank支持真LVDS差分对,最高速率能到800Mbps以上,配合内部的SerDes硬核,做视频直通绰绰有余。更关键的是,Intel(原Altera)的LVDS SerDes IP成熟稳定,配置界面清晰,文档也全,对新手相对友好。相比之下,有些国产FPGA的SerDes IP文档偏薄,遇到问题不好查,第一次做LVDS的话,Cyclone V是更稳妥的起点。

整体方案我采用的是"接收SerDes + 数据整理 + 发送SerDes"三段式结构。接收端把串行LVDS解成并行像素数据,发送端再把并行数据串出去。中间的数据整理层负责处理位宽转换、时钟域 crossing、以及必要的像素格式调整。这个分层的好处是每一段职责单一,调试时可以分段验证——先确认接收端数据对不对,再确认发送端时序稳不稳,最后联调。如果一上来就把所有逻辑揉在一起,出了问题根本不知道是哪一段的锅。

提示:LVDS直通项目里,最容易被低估的是时钟。接收端恢复出来的时钟和本地系统时钟往往不同源,跨时钟域处理没做好,数据会间歇性错位,表现为屏幕偶尔闪一下或者局部花屏,非常难查。这一点后面会专门展开。

方案选型上还有几个取舍值得说明。第一,用硬核SerDes还是软核逻辑?Cyclone V的LVDS SerDes IP底层调用的是专用硬件,不占通用逻辑资源,速率和稳定性都远好于自己用普通I/O拼出来的收发逻辑,所以毫不犹豫选IP。第二,数据位宽选几位?这取决于前端传感器的输出格式和屏幕的接收要求。我这边前端是4通道LVDS,每通道串行化7位,解串后每通道得到7bit,4通道拼起来是28bit。这个位宽直接决定了后面FIFO和时钟的设计。第三,要不要做帧缓存?如果收发时钟完全同源,理论上可以纯组合逻辑直通,但实际项目中两端时钟总有偏差,加一级异步FIFO做缓冲几乎是必须的,否则一旦有微小频差,累积几帧就会溢出或读空。

2. LVDS SerDes IP核心配置细节拆解

2.1 收发方向与通道数的确定

打开Quartus的IP Catalog,搜索"ALTLVDS",会看到两个IP:ALTLVDS_RX和ALTLVDS_TX。这两个要分别例化,接收和发送是独立的。配置第一步是确定通道数(Number of channels)。我这边前端传感器是4对差分线,所以RX通道数填4;屏幕端也是4对,TX同样填4。这里有个坑:通道数不是随便填的,它必须和你的硬件差分对数量严格对应,填多了IP会占用不存在的引脚,编译报错;填少了数据不全。

每个通道的串行化因子(Deserialization factor)是另一个关键参数。它表示一个串行位流被解成多少位并行数据。常见取值是7、8、10。为什么会有7这种奇怪的数字?因为很多视频接口的位宽就是7bit每通道,比如某些LVDS屏的RGB666格式,每个颜色6位加1位控制,正好7位。我这边前端输出就是7位,所以RX的deserialization factor设为7,TX的serialization factor也设为7,两端保持一致。如果这里填错,解出来的数据位序会完全乱掉,屏幕上显示的就是彩色雪花。

时钟方面,IP需要一个高速串行时钟(fast clock)和一个低速并行时钟(slow clock)。以我这边为例,串行速率是490Mbps,deserialization factor是7,那么并行时钟就是490/7=70MHz。这个70MHz就是解串后数据的同步时钟。IP配置界面里会让你指定这两个时钟的关系,通常fast clock是slow clock的整数倍,倍数就是deserialization factor。这个关系必须算准,否则IP内部PLL锁不住。

2.2 时钟资源与PLL的绑定

Cyclone V的LVDS SerDes必须绑定到特定的PLL上,不是随便哪个PLL都能驱动。每个I/O bank旁边有专用的LVDS PLL,配置IP时Quartus会自动提示可用的PLL。我建议在配置前先看一下引脚规划,确认你的差分对落在哪个bank,然后用那个bank对应的PLL。如果PLL选错,编译能过,但下载后SerDes不工作,示波器量差分线没有任何波形。

具体操作上,在ALTLVDS_RX的配置向导里,有一个"Clock"页面,会让你选择"Use dedicated SERDES circuitry"还是"Use LVDS PLL"。这里必须选dedicated,因为只有专用电路才能跑到那么高的速率。然后指定参考时钟频率,我这边板子上给LVDS PLL的参考时钟是50MHz,IP内部会倍频到490MHz作为串行时钟。这个50MHz必须和实际晶振一致,填错了PLL输出频率就偏,接收端采样点会漂移。

注意:Cyclone V不同速度等级(C6、C7、C8)支持的LVDS最高速率不同。C8是最慢的,做高速LVDS要特别留意。我手上这块是C6,跑490Mbps很轻松,但如果你用的是C8,建议先查数据手册确认余量。

2.3 数据对齐与字对齐模式

LVDS接收最头疼的问题是字对齐(word alignment)。串行数据流进来,FPGA怎么知道哪一位是一个字的开头?ALTLVDS_RX提供了几种对齐模式:手动对齐、自动对齐、以及基于训练序列的对齐。我这边前端传感器没有专门的训练序列,所以用的是手动对齐配合bitslip信号。

bitslip是一个很巧妙的设计。当发现解出来的数据错位时,拉高bitslip一个周期,IP会把解串窗口滑动一位,相当于把数据流整体挪一格。反复拉bitslip,直到数据对齐。实际操作中,我会在接收端加一个简单的对齐检测逻辑:比如前端数据里有个固定的同步头(我这边是每行开头的几个固定字节),检测到这个同步头就认为对齐了,否则继续发bitslip。这个逻辑用状态机实现,几十行Verilog就够。

如果前端有训练序列,那用自动对齐更省事,IP内部会自动搜索训练模式并对齐。但要注意,自动对齐需要配置训练序列的长度和内容,配错了会一直对齐失败。我个人的经验是,能用训练序列就用,省去手写对齐逻辑;没有的话,手动bitslip也不复杂,关键是同步头的选择要足够独特,避免在正常数据里误触发。

2.4 发送端的预加重与驱动强度

TX端的配置相对简单,但有两个参数影响信号质量:预加重(pre-emphasis)和驱动强度(VOD)。预加重是在信号跳变时额外加一点过冲,补偿传输线的高频衰减。如果屏幕离FPGA比较远(超过10厘米),或者走的是普通排线而非阻抗匹配的差分线,建议把预加重打开,档位选中等。驱动强度则决定差分摆幅,标准LVDS是350mV,如果接收端灵敏度低,可以适当调高。

这两个参数在IP配置界面里是下拉选项,不用自己算。但我的建议是先用默认值,板子跑起来后用示波器看眼图,如果眼图闭合严重再调。盲目调高预加重反而会引入过冲,导致接收端误判。我踩过一次坑:为了"保险"把预加重拉满,结果屏幕上出现规律性的竖条纹,后来调回中等就正常了。

3. 数据通路与Verilog实现要点

3.1 接收端解串与数据拼接

ALTLVDS_RX解出来的数据是按通道分开的。假设4个通道,每个通道输出7bit,那么IP会给出4组7bit数据,外加一个并行时钟。我的处理方式是把这4组数据拼成一个28bit的宽数据,方便后续处理。拼接顺序要和前端传感器的输出顺序对应,这个顺序在传感器的数据手册里会写清楚,通常是通道0对应最低位还是最高位,一定要核对。

// 4通道7bit拼接成28bit wire [6:0] rx_ch0, rx_ch1, rx_ch2, rx_ch3; wire [27:0] rx_data; assign rx_data = {rx_ch3, rx_ch2, rx_ch1, rx_ch0};

拼接本身是一行代码的事,但顺序错了就是灾难。我建议在调试阶段先把每个通道单独接到LED或者SignalTap上,确认每个通道的数据都在跳变,再拼接。如果某个通道一直是0或者一直是1,说明那对差分线没接好或者IP配置里通道数不对。

3.2 跨时钟域FIFO的设计

接收端的并行时钟(我这边70MHz)和发送端的并行时钟(屏幕要求的时钟,可能是65MHz或72MHz)通常不同源。直接跨时钟域传数据,亚稳态是必然的。所以中间必须加异步FIFO。我用的是Quartus自带的FIFO IP,配置成异步时钟模式,写时钟用RX并行时钟,读时钟用TX并行时钟。

FIFO深度怎么定?这取决于两端时钟的频差和帧大小。假设频差是1%,一帧有1024个像素,那么一帧时间内累积的偏差大约是10个像素。为了留余量,FIFO深度至少要是帧像素数的2%到5%。我这边一帧2048像素,FIFO深度设了128,实测很稳。如果频差更大或者帧更长,深度要相应增加。深度不够的表现是屏幕周期性撕裂,因为FIFO写满后数据被丢弃了。

提示:异步FIFO的读写使能要配合好。写端在RX数据有效时拉高wr_en,读端在TX需要数据时拉高rd_en。如果读端读得太快,FIFO会读空,输出旧数据;读得太慢会写满。可以用FIFO的empty和full标志做流控,但视频流通常不能停,所以更稳妥的做法是让读端略慢于写端,保证FIFO始终有数据。

3.3 发送端并串转换与时钟生成

TX端的ALTLVDS_TX接收28bit并行数据,内部自动串化成4路7bit的LVDS输出。这里需要注意的是,TX的并行时钟必须由TX的LVDS PLL生成,不能直接用RX的时钟。因为发送和接收的速率可能不同,即使相同,用同一个PLL驱动两个方向的SerDes也可能有扇出问题。我这边TX单独用一个PLL,参考时钟同样是50MHz,倍频到屏幕要求的串行速率。

发送端的数据来源是FIFO的读端口。读出来的28bit直接接到TX IP的data端口。但要注意,TX IP对数据的时序有要求,通常需要在并行时钟的上升沿稳定。如果FIFO输出有组合逻辑延迟,可能需要在中间加一级寄存器打拍。我一开始没加,SignalTap看数据是对的,但屏幕上偶尔有噪点,后来加了一级寄存器就干净了。

3.4 复位与锁定信号的正确处理

LVDS SerDes IP有多个复位和锁定信号,处理不好会导致IP不工作。RX端有rx_reset和rx_locked,TX端有tx_reset和tx_locked。正确的上电顺序是:先给PLL复位,等PLL锁定;再给SerDes复位,等SerDes锁定;最后才让数据通路开始工作。如果复位顺序乱了,SerDes可能锁不住,或者锁定后数据错位。

我的做法是用一个简单的状态机控制复位序列。上电后先等PLL的locked信号拉高,延时一段时间(比如1ms)让时钟稳定,然后释放SerDes复位,再等SerDes的locked拉高,最后释放数据通路的复位。这个延时不是必须的,但加了之后稳定性明显提升。另外,rx_locked和tx_locked要接到SignalTap或者LED上,调试时一眼就能看出SerDes有没有工作。

4. 时序约束与引脚分配的实战经验

4.1 差分对的引脚约束

Cyclone V的LVDS引脚不是随便分配的,必须成对且落在支持LVDS的bank上。在Quartus的Pin Planner里,差分对的正端和负端要分别指定,负端通常用_n后缀。比如rx_ch0_p和rx_ch0_n。如果只指定了正端,Quartus会自动分配负端,但可能分到不支持的引脚上,导致编译错误。

更稳妥的做法是在QSF文件里手动写引脚约束。格式是set_location_assignment PIN_XX -to rx_ch0_p,负端同理。写之前要查板子的原理图,确认每对差分线连到FPGA的哪个引脚。我见过有人把差分对分到了普通I/O上,结果编译能过但信号质量极差,因为普通I/O没有LVDS的差分驱动能力。

4.2 时序约束的编写

LVDS SerDes的时序约束主要是对并行时钟和数据的约束。Quartus的TimeQuest里,需要对RX的并行时钟创建时钟约束,周期就是1/70MHz≈14.286ns。然后对RX数据到FIFO的路径做setup和hold约束。如果约束没写,TimeQuest可能报时序违例,但实际跑起来又是对的,这种"假违例"会干扰判断。

我的经验是,先让Quartus自动生成SDC约束,然后在此基础上补充。ALTLVDS IP在生成时会附带一个.sdc文件,里面有时钟和输入输出延迟的约束模板,直接拿来用就行。需要自己加的是跨时钟域路径的false path或者set_max_delay。异步FIFO的读写时钟之间要设false path,因为本来就不需要满足时序关系,设了反而会让工具做无用功。

4.3 板级调试的信号观测

板子回来之后,第一件事不是下载程序看屏幕,而是用示波器量差分线。先量TX端,确认有差分波形,摆幅在350mV左右,共模电压在1.2V左右。如果TX没波形,检查PLL有没有锁,SerDes复位有没有释放。TX正常后再量RX端,RX的波形来自前端传感器,如果传感器没输出,FPGA这边什么都收不到。

SignalTap是调试LVDS的利器。把RX解串后的并行数据、FIFO的读写指针、locked信号都抓进去。触发条件可以设成locked下降沿,这样一旦SerDes失锁就能抓到现场。我调的时候,发现屏幕偶尔黑一下,用SignalTap抓到rx_locked短暂拉低,后来查出来是电源纹波太大导致PLL失锁,加了个滤波电容就好了。

5. 常见问题排查与避坑速查

5.1 屏幕花屏或显示错位

花屏是最常见的现象,原因通常有三个:字对齐没做好、数据拼接顺序错、或者FIFO读写时钟不匹配。排查顺序是先用SignalTap看RX解串后的数据,如果数据本身是乱的,那就是对齐问题,手动发bitslip直到数据稳定。如果RX数据是对的,但屏幕花,那就是拼接顺序或者FIFO的问题。拼接顺序可以对照传感器手册逐位核对,FIFO则检查读写时钟频率是否和预期一致。

还有一种花屏是规律性的斜条纹,这通常是时钟频差导致的。RX和TX的时钟如果有微小偏差,FIFO会周期性溢出或读空,表现为斜条纹缓慢移动。解决方法是让两端时钟同源,或者加大FIFO深度并加入流控。我这边最终是把TX的PLL参考时钟和RX的参考时钟接到同一个晶振上,频差消除,条纹就没了。

5.2 SerDes无法锁定

rx_locked一直不拉高,说明SerDes没收到有效的串行数据,或者PLL没锁。先确认前端传感器有没有输出,用示波器量差分线。如果有波形但locked不拉高,检查IP配置里的串行速率和实际速率是否一致。速率填错,PLL输出频率不对,自然锁不住。另外,参考时钟的频率也要核对,50MHz的晶振不能填成25MHz。

如果PLL本身就没锁,检查参考时钟有没有送到PLL引脚。有些板子的晶振是给普通I/O的,不是给专用时钟引脚的,这种情况需要手动在QSF里把时钟引脚分配到CLKIN。Cyclone V的专用时钟引脚有特定编号,查引脚手册就能找到。

5.3 数据间歇性错误

数据大部分时候对,偶尔错几个像素,这种问题最难查。常见原因是跨时钟域的亚稳态,或者时序余量不足。先检查异步FIFO的读写指针有没有做格雷码转换,如果没有,指针在跨时钟域时可能采到中间值,导致FIFO误判空满。Quartus的FIFO IP默认会做格雷码转换,但如果是自己写的FIFO,一定要手动加。

另一个原因是时序约束没写全,某些路径的建立时间不够。用TimeQuest跑一遍,看有没有红色的违例路径。如果有,先看是不是跨时钟域路径,是的话设false path;不是的话就要优化逻辑或者加流水线。我遇到过一次,TX数据到IP的路径差0.2ns,加了级寄存器就好了。

5.4 常见问题速查表

现象可能原因排查方法解决措施
屏幕全黑TX无输出或PLL未锁示波器量TX差分线检查PLL参考时钟和复位序列
彩色雪花字对齐失败SignalTap看RX数据手动发bitslip或配置训练序列
规律斜条纹收发时钟频差对比两端时钟频率同源时钟或加大FIFO深度
间歇性噪点跨时钟域亚稳态检查FIFO指针格雷码加格雷码转换或打拍
局部花屏数据拼接顺序错对照手册核对位序调整拼接顺序
SerDes失锁电源纹波或速率配置错量电源纹波和串行速率加滤波电容或修正速率

注意:调试LVDS时,不要一上来就怀疑代码。先量硬件信号,确认差分线有波形、电源干净、时钟稳定,再去查逻辑。我见过太多人代码改了半天,最后发现是排线接触不良。

6. 实操心得与后续扩展方向

这套LVDS直通链路我前后调了大概两周,大部分时间花在字对齐和时钟域处理上。最大的体会是:LVDS本身不难,难的是细节。IP配置界面里的每一个参数都有它的道理,填之前一定要想清楚为什么。比如deserialization factor,它不是随便选的,而是由前端数据格式决定的;PLL的参考时钟频率,必须和板子上的晶振一致。这些细节如果靠猜,调试时间会成倍增加。

另一个心得是善用SignalTap。LVDS是高速信号,示波器只能看波形质量,看不到数据内容。SignalTap能把解串后的并行数据抓出来,对齐没对齐、数据对不对,一目了然。我建议在设计的每个关键节点都留一个SignalTap探针,调试阶段全打开,稳定后再逐个关掉。

后续如果想扩展,有几个方向。一是加入图像处理,比如在直通的基础上做缩放、裁剪或者色彩空间转换,这需要在数据通路里插入处理模块,注意处理好流水线延迟。二是支持多分辨率,通过检测输入时序自动切换TX的配置,这需要动态重配置PLL,Cyclone V支持PLL的动态重配,但逻辑会复杂不少。三是把LVDS换成更高速的接口,比如MIPI或者DisplayPort,思路类似,但SerDes的配置和协议层要重新做。

最后分享一个小技巧:如果手头没有LVDS信号源,可以用FPGA自己产生一个测试图案,通过TX发出去,再用一根线把TX和RX短接,做自环测试。这样可以在没有前端传感器的情况下验证整个收发链路。我一开始就是这么干的,先确认TX和RX都能工作,再接真实传感器,省去了很多来回排查的麻烦。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询