ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Lattice HSB相机方案实战:低功耗FPGA高速图像采集与Diamond保留信号技巧

Lattice HSB相机方案实战:低功耗FPGA高速图像采集与Diamond保留信号技巧 1. 为什么要在Lattice平台上做HSB相机方案第一次接触Lattice HSB相机方案是在一个工业检测项目里客户要求用低功耗FPGA实现高速图像采集同时把数据通过高速串行接口送到后端处理。当时市面上能选的方案不多Xilinx和Altera的器件功耗和成本都偏高Lattice的ECP5和CrossLink系列在功耗和封装尺寸上有明显优势尤其是HSBHigh 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好很多。我实测过用普通排线跑HSB1.2Gbps下眼图仍然张开换成并行LVDS早就误码了。2.3 方案框架与数据流设计整个方案的框架分三层采集层、处理层、传输层。采集层用图像传感器比如IMX219或OV5640输出RAW数据通过LVDS或MIPI接口进FPGA。处理层在FPGA内部完成Bayer转RGB、自动曝光、自动白平衡这些基础ISP功能。传输层用HSB IP核把处理后的数据打包通过高速差分对送到后端。数据流是这样的传感器输出10bit RAWFPGA接收后先做坏点校正然后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 16d0; tx_valid 1b0; 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 1b1; tx_state SEND_LOW; end SEND_LOW: begin tx_data {pixel_data[7:0], 8d0}; tx_valid 1b1; 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场景下核心功耗约280mWIO功耗约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通道数用两个通道并行跑4K30ECP5-25支持4个HSB通道理论上可以跑4K60。二是把ISP功能增强加入3A算法自动曝光、自动白平衡、自动对焦这需要外挂一颗MCU或者用FPGA内部软核实现。三是把接口从HSB换成MIPI D-PHYLattice CrossLink系列原生支持MIPI适合更紧凑的设计。我个人在实际操作中的体会是HSB方案最大的价值在于把高速串行接口的门槛降下来了。以前做高速相机必须用Xilinx的GTP或者Altera的Transceiver现在用Lattice的HSB硬核小团队也能快速做出稳定可靠的产品。踩过的坑主要集中在时钟质量和信号保留上这两点搞定之后整个方案跑起来非常稳。最后分享一个小技巧Diamond工程里把HSB相关的约束单独写在一个TCL文件里用source命令加载这样迁移工程或者换器件时只需要改这一个文件省事很多。
返回列表