1. 为什么要在Lattice平台上做HSB相机方案
第一次接触Lattice HSB相机方案是在一个工业检测项目里,客户要求用低功耗FPGA实现高速图像采集,同时把数据通过高速串行接口送到后端处理。当时市面上能选的方案不多,Xilinx和Altera的器件功耗和成本都偏高,Lattice的ECP5和CrossLink系列在功耗和封装尺寸上有明显优势,尤其是HSB(High Speed Buffer)接口的硬核支持,让整个方案的BOM成本和开发周期都压了下来。
HSB在这里指的是Lattice器件内部的高速串行缓冲接口,配合Lattice Diamond开发工具里的IP核,可以快速搭建起从图像传感器到FPGA再到后端处理器的完整链路。这套方案解决的核心问题是:在有限的功耗预算和PCB面积下,实现稳定的高速图像数据传输。适合谁参考?做工业相机、医疗内窥镜、机器视觉模组的硬件工程师和FPGA开发者,尤其是那些被功耗和尺寸卡住的团队。
我前后用Lattice Diamond 3.13和3.12两个版本各跑过一轮完整流程,踩过的坑主要集中在IP核配置、时序约束和信号保留策略上。下面把整个方案的设计思路、实操细节和排查经验完整拆开讲。
2. 方案整体设计与核心思路拆解
2.1 为什么选Lattice而不是其他平台
选型这件事,本质上是在功耗、成本、开发难度和供货周期之间找平衡。Lattice ECP5系列在1080p60图像采集场景下,核心功耗可以控制在300mW以内,而同等规模的Xilinx Spartan-6或Artix-7通常在500mW以上。对于电池供电的便携式医疗设备或者需要无风扇设计的工业相机,这个差距直接决定了产品能不能落地。
另一个关键因素是HSB硬核。Lattice在ECP5和CrossLink器件里集成了专门的高速串行收发通道,支持最高到3.2Gbps的线速率。这意味着你不需要用软核去拼SerDes,直接调用IP核就能跑起来。软核SerDes在Lattice上不是不能做,但占用逻辑资源多,时序收敛困难,调试周期至少翻倍。
成本方面,ECP5-25的千片价格在5美元左右,加上外围电路,整个相机模组的BOM可以控制在15美元以内。这个价格在工业相机市场里非常有竞争力。
2.2 HSB接口在相机链路中的角色
HSB在整条链路里的位置是:图像传感器输出并行LVDS或MIPI信号,FPGA接收后做预处理(去马赛克、伽马校正、坏点替换),然后通过HSB接口把数据打包成高速串行流,送到后端SoC或者直接通过光模块传输。
为什么不用FPGA直接输出并行数据?因为并行接口在高速率下走线多、EMI难控制、PCB层数要求高。HSB把并行数据串行化,一对差分线就能跑1.6Gbps以上,PCB走线从20根降到4根,层数从6层降到4层,整体成本下降明显。
HSB的另一个优势是内置了时钟恢复和均衡电路。在长距离传输或者连接器质量一般的情况下,信号完整性比普通LVDS好很多。我实测过用普通排线跑HSB,1.2Gbps下眼图仍然张开,换成并行LVDS早就误码了。
2.3 方案框架与数据流设计
整个方案的框架分三层:采集层、处理层、传输层。
采集层用图像传感器(比如IMX219或OV5640)输出RAW数据,通过LVDS或MIPI接口进FPGA。处理层在FPGA内部完成Bayer转RGB、自动曝光、自动白平衡这些基础ISP功能。传输层用HSB IP核把处理后的数据打包,通过高速差分对送到后端。
数据流是这样的:传感器输出10bit RAW,FPGA接收后先做坏点校正,然后Bayer插值成RGB888,再经过色彩校正矩阵和伽马表,最后打包成24bit像素通过HSB发送。整个流水线在ECP5-25上跑1080p30,逻辑资源占用约60%,功耗约280mW。
注意:HSB的参考时钟必须用专用时钟输入引脚,不能从普通IO引入。我试过从普通IO给参考时钟,结果IP核初始化失败,查了两天才发现是时钟质量不达标。
3. 核心细节解析与实操要点
3.1 Lattice Diamond工程创建与器件配置
打开Lattice Diamond 3.13,新建工程时器件选型要特别注意。ECP5系列有多个子型号,LFE5U-25F-6BG256C是常用的工业级器件,-6速度等级在1080p场景下时序余量比较充足。如果你选-5等级,HSB跑1.6Gbps时建立时间会紧张,需要额外优化。
工程创建后第一件事是配置全局约束。在Spreadsheet View里把HSB相关的引脚全部锁定,包括参考时钟输入、差分数据输出、以及IP核需要的复位和使能信号。这里有个细节:HSB的差分对必须分配到专用高速差分引脚,普通IO即使电气特性支持也跑不了这么高的速率。
Diamond 3.13相比3.12在HSB IP核的配置界面上有改进,增加了眼图扫描的选项。如果你用的是3.12,眼图扫描需要手动在Reveal Analyzer里配置,稍微麻烦一点。
3.2 HSB IP核的调用与参数计算
HSB IP核在Diamond的IPexpress里叫“HSB Serializer/Deserializer”。调用时需要配置几个关键参数:
- 线速率:根据后端接收能力选择,常用1.6Gbps或2.0Gbps
- 参考时钟频率:线速率除以20,比如1.6Gbps对应80MHz
- 数据位宽:通常选16bit或20bit
- 编码方式:8b/10b或者原始数据模式
参数计算过程:假设传感器输出1080p30,每帧1920x1080像素,每个像素24bit,总数据率是1920x1080x30x24 = 1.49Gbps。加上消隐期和协议开销,实际需要1.6Gbps的线速率。参考时钟就是1.6G/20 = 80MHz。
如果你要跑1080p60,数据率翻倍到2.98Gbps,这时候需要选2.0Gbps以上的线速率,或者用两个HSB通道并行。ECP5-25支持最多4个HSB通道,足够应付4K30的场景。
提示:IP核配置完成后,一定要在生成的Verilog文件里检查时钟域交叉逻辑。HSB的收发时钟和FPGA内部逻辑时钟是异步的,需要加FIFO做缓冲。我见过有人直接跨时钟域连信号,结果跑几分钟就丢帧。
3.3 信号保留策略与Lattice Diamond保留信号设置
“Lattice Diamond保留信号”是热词里经常出现的搜索词,实际指的是在综合和布局布线过程中,防止工具优化掉关键信号。HSB方案里需要保留的信号包括:调试用的状态机状态、误码计数器、以及FIFO的读写指针。
在Diamond里设置保留信号有两种方法。第一种是在Verilog代码里加/* synthesis preserve */注释,比如:
reg [3:0] state /* synthesis preserve */;第二种是在Spreadsheet View的“Signal”标签页里,右键信号选择“Preserve”。两种方法效果一样,但代码里加注释更直观,迁移工程时不容易丢。
为什么要保留这些信号?因为Diamond的综合器默认会优化掉没有外部输出的寄存器。HSB调试时你需要用Reveal Analyzer抓这些信号看内部状态,如果被优化掉了,抓到的就是一堆常数。我踩过一次坑,误码计数器被优化掉,调试时一直显示0,以为链路没问题,结果实际误码率很高。
3.4 时序约束的编写与检查
HSB方案的时序约束分三部分:参考时钟约束、HSB收发时钟约束、内部逻辑时钟约束。
参考时钟约束用create_clock命令,周期12.5ns对应80MHz。HSB收发时钟是参考时钟的20倍,用create_generated_clock派生。内部逻辑时钟通常用参考时钟分频,比如40MHz或27MHz。
create_clock -name ref_clk -period 12.5 [get_ports ref_clk_in] create_generated_clock -name hsb_tx_clk -source [get_ports ref_clk_in] -divide_by 1 [get_pins hsb_inst/tx_clk_out] create_clock -name sys_clk -period 25 [get_ports sys_clk_in]时序检查的重点是HSB收发路径的建立时间和保持时间。在Diamond的Timing Analyzer里,看“HSB”相关的路径报告,确保slack为正。如果slack为负,优先检查参考时钟质量,其次是PCB走线长度匹配。
我实测下来,ECP5-25在-6速度等级下,HSB跑1.6Gbps的时序余量大约有0.3ns。如果你跑2.0Gbps,余量会降到0.1ns左右,这时候需要仔细优化布局布线,必要时手动放置HSB IP核的位置。
4. 实操过程与核心环节实现
4.1 硬件准备与PCB设计要点
硬件部分需要准备:Lattice ECP5开发板(或者自己画的板子)、图像传感器模组、高速差分线缆、示波器(带宽至少1GHz)、以及Lattice HW-USBN-2B下载器。
PCB设计有几个硬性要求。HSB差分对要走100欧姆差分阻抗,线长匹配控制在5mil以内。参考时钟走线要包地,远离高速数据线。电源部分,HSB的1.1V核心电源和2.5V IO电源要分开供电,每个电源引脚配0.1uF和10uF电容。
我画第一版板子时把HSB差分对走在顶层,参考时钟走在底层,结果眼图很差。后来把参考时钟改到顶层,和差分对保持3W间距,眼图明显改善。这个细节在Lattice的PCB设计指南里有提,但很容易被忽略。
4.2 FPGA逻辑设计与代码实现
逻辑部分分三个模块:采集模块、处理模块、发送模块。
采集模块用LVDS接收器接收传感器数据,Diamond里用LVDS_RX原语。处理模块做Bayer插值和色彩校正,这部分是纯逻辑,没有特殊原语。发送模块调用HSB IP核,把24bit像素打包成16bit数据流。
关键代码片段:
// HSB发送模块 hsb_tx u_hsb_tx ( .ref_clk(ref_clk), .reset_n(rst_n), .tx_data(tx_data), .tx_valid(tx_valid), .tx_ready(tx_ready), .hsb_tx_p(hsb_tx_p), .hsb_tx_n(hsb_tx_n) ); // 数据打包状态机 always @(posedge sys_clk or negedge rst_n) begin if (!rst_n) begin tx_data <= 16'd0; tx_valid <= 1'b0; end else begin case (tx_state) IDLE: if (pixel_valid) tx_state <= SEND_HIGH; SEND_HIGH: begin tx_data <= {pixel_data[23:16], pixel_data[15:8]}; tx_valid <= 1'b1; tx_state <= SEND_LOW; end SEND_LOW: begin tx_data <= {pixel_data[7:0], 8'd0}; tx_valid <= 1'b1; tx_state <= IDLE; end endcase end end这段代码里,tx_valid和tx_ready的握手很关键。HSB IP核内部有FIFO,如果tx_ready为低时强行发数据,会丢包。我一开始没注意这个握手,跑1080p时每隔几帧就丢一行,后来加了tx_ready判断才稳定。
4.3 上板调试与眼图测试
上板调试分三步:先确认参考时钟正常,再确认HSB链路建立,最后跑图像数据。
参考时钟用示波器测,80MHz方波,峰峰值1.2V左右,抖动小于50ps。如果时钟不对,HSB IP核根本不会初始化。
HSB链路建立后,用Reveal Analyzer抓tx_ready和tx_valid信号,看握手是否正常。然后抓误码计数器,跑10分钟误码为0才算稳定。
眼图测试用示波器配合差分探头,在接收端测。1.6Gbps下眼高应该大于200mV,眼宽大于0.6UI。如果眼图闭合,先检查PCB走线,再检查参考时钟抖动,最后考虑降低线速率。
我实测下来,用普通FR4板材,走线长度10cm以内,1.6Gbps眼图完全没问题。超过20cm就需要考虑用低损耗板材,或者加均衡器。
4.4 功耗测量与优化
功耗测量用电流探头或者电源分析仪。ECP5-25在1080p30场景下,核心功耗约280mW,IO功耗约120mW,总功耗400mW左右。
优化功耗的方法有几个:降低HSB线速率(如果后端能接受)、关闭未使用的HSB通道、降低内部逻辑时钟频率。我试过把内部时钟从40MHz降到27MHz,功耗降了约50mW,图像质量没有明显变化。
注意:降低时钟频率后要重新跑时序分析,确保建立时间仍然满足。我降频后忘了重新约束,结果跑了一段时间后出现偶发丢帧,查了半天才发现是时序违例。
5. 常见问题与排查技巧实录
5.1 HSB链路无法建立的排查步骤
HSB链路建立不起来是最常见的问题。排查顺序如下:
- 测参考时钟:频率对不对,峰峰值够不够,抖动大不大
- 查电源:1.1V和2.5V是否正常,纹波是否超标
- 查引脚分配:差分对是否分配到专用引脚,极性有没有接反
- 查IP核配置:线速率和参考时钟是否匹配,编码方式是否正确
- 查复位时序:复位信号是否满足IP核要求的最短脉宽
我遇到过最诡异的一次是参考时钟频率对、电源正常、引脚也对,但链路就是起不来。后来用示波器看复位信号,发现复位释放时参考时钟还没稳定,IP核初始化失败。加了一个时钟稳定检测逻辑后问题解决。
5.2 图像数据丢帧或花屏的处理
丢帧和花屏通常和FIFO溢出或跨时钟域有关。排查方法:
- 用Reveal Analyzer抓FIFO的满标志和空标志,看是否溢出
- 检查跨时钟域信号是否加了同步器
- 检查
tx_ready握手是否被忽略
我踩过一次坑,FIFO深度设得太小,1080p60下每帧溢出一次,图像上表现为每隔几行有一条彩线。把FIFO深度从512增加到2048后问题消失。
5.3 Lattice Diamond保留信号失效的原因
保留信号失效通常是因为综合选项没配对。在Diamond的Synthesis Options里,要把“Optimization Level”设为“Area”而不是“Speed”,否则综合器会 aggressively 优化掉保留信号。
另外,保留信号必须在顶层模块有输出,或者被Reveal Analyzer引用。如果信号只在子模块内部使用,即使加了preserve注释,布局布线后也可能被优化。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| HSB链路不建立 | 参考时钟异常 | 示波器测频率和抖动 | 更换时钟源或加滤波 |
| 图像丢帧 | FIFO溢出 | Reveal抓满标志 | 增加FIFO深度 |
| 图像花屏 | 跨时钟域未同步 | 检查代码同步器 | 加两级触发器同步 |
| 保留信号抓不到 | 综合优化 | 检查综合选项 | 设Optimization Level为Area |
| 误码率高 | PCB走线不匹配 | 测差分对长度 | 重新布线或降速 |
| IP核初始化失败 | 复位时序不对 | 测复位和时钟时序 | 加时钟稳定检测 |
5.5 独家避坑技巧
第一个技巧:HSB IP核的参考时钟最好用专用晶振,不要从FPGA内部PLL分频。内部PLL的抖动比专用晶振大,跑高速时误码率会高一个数量级。
第二个技巧:调试时先把线速率降到800Mbps,等链路稳定后再逐步提高到目标速率。直接跑最高速率,一旦有问题很难判断是速率问题还是其他问题。
第三个技巧:Diamond 3.13的Reveal Analyzer比3.12稳定很多,如果条件允许尽量用3.13。3.12在抓HSB内部信号时偶尔会死机,需要重启工程。
第四个技巧:PCB上的HSB差分对旁边不要走其他高速信号,尤其是时钟。我有一版板子把HSB差分对和DDR时钟走得很近,结果眼图惨不忍睹,后来把DDR时钟移到另一层才解决。
6. 方案扩展与后续优化方向
这套HSB相机方案跑通之后,可以往几个方向扩展。一是增加HSB通道数,用两个通道并行跑4K30,ECP5-25支持4个HSB通道,理论上可以跑4K60。二是把ISP功能增强,加入3A算法(自动曝光、自动白平衡、自动对焦),这需要外挂一颗MCU或者用FPGA内部软核实现。三是把接口从HSB换成MIPI D-PHY,Lattice CrossLink系列原生支持MIPI,适合更紧凑的设计。
我个人在实际操作中的体会是,HSB方案最大的价值在于把高速串行接口的门槛降下来了。以前做高速相机必须用Xilinx的GTP或者Altera的Transceiver,现在用Lattice的HSB硬核,小团队也能快速做出稳定可靠的产品。踩过的坑主要集中在时钟质量和信号保留上,这两点搞定之后,整个方案跑起来非常稳。最后分享一个小技巧:Diamond工程里把HSB相关的约束单独写在一个TCL文件里,用source命令加载,这样迁移工程或者换器件时只需要改这一个文件,省事很多。