1. Lattice FPGA软硬件协同开发全景
Lattice FPGA的软硬件协同开发,核心不是“把一部分逻辑搬到软件里”这么简单,而是在项目早期就明确:哪些功能必须由FPGA内部并行硬件完成,哪些功能交给MCU、SoC或上位机软件串行处理,以及两者之间通过什么接口、以什么节拍交换数据与控制信息。Lattice的产品线恰好覆盖了从超低功耗小规模控制到高速接口桥接的不同定位,理解这些器件的边界,是后续性能优化的前提。
一、器件系列在协同设计中的定位
Lattice Nexus平台是当前低功耗FPGA的主力,采用FD-SOI工艺,典型代表包括CrossLink-NX、Certus-NX、CertusPro-NX和Mach-NX。Nexus器件的优势在于低静态功耗、较高的I/O密度和嵌入式存储资源,适合做传感器聚合、视频桥接、MIPI接口转换以及需要常开(always-on)的轻量控制逻辑。在协同架构中,Nexus通常承担“实时硬通道”的角色:它不依赖软件轮询,而是用硬件状态机或小型软核完成确定性的时序处理。
MachXO系列(如MachXO3、MachXO2)定位为“控制与桥接型”FPGA,逻辑规模较小,但配置灵活、成本低、上电即工作。它非常适合做电源时序控制、板级胶合逻辑、低速总线转换和系统监控。在软硬件分工中,MachXO往往作为“硬件管家”,把上电顺序、复位释放、时钟切换等对时序敏感的任务固化在FPGA里,软件只负责发出高层命令和读取状态。
CrossLink系列则专注于高速视频与显示接口,支持MIPI D-PHY、SLVS等差分信号,常用于摄像头到处理器之间的桥接、多路视频切换和格式转换。它的协同边界很清晰:FPGA负责高速串行链路的物理层与协议层转换,软件负责配置分辨率、帧率、通道映射等参数,并处理异常中断。
此外,iCE40系列面向超低功耗、小封装的消费类与工业传感场景,适合做简单的接口扩展和状态机控制;ECP5系列则提供更高的逻辑密度和SerDes资源,适合中等规模的协议处理与算法加速。把这些器件放在同一张协同地图上,可以形成从“纯硬件时序”到“软硬混合”的连续谱系。
二、软硬件分工边界与划分原则
划分边界时,最实用的判断依据是“时间确定性”和“并行度”。凡是要求纳秒级到微秒级确定性响应、需要同时处理多路独立信号、或者对抖动敏感的任务,应优先放入FPGA硬件域。例如,MIPI摄像头输入的像素时钟连续不断,若用软件轮询读取,必然丢帧;而用FPGA内部的状态机按像素节拍搬运数据,可以做到零丢帧。反之,涉及复杂决策、协议栈高层、用户交互、数据记录的任务,适合放在软件域,因为软件修改成本低、灵活性高。
具体划分时,可以沿着三条线展开。第一条是数据流线:高速、连续、宽位宽的数据通路放在FPGA侧,用FIFO或DMA与软件交换;低速、突发、事件驱动的数据可以交给软件。第二条是控制流线:上电时序、时钟切换、复位释放等“必须按固定顺序发生”的控制放在FPGA;模式选择、参数下发、状态查询等“可以容忍毫秒级延迟”的控制放在软件。第三条是异常处理线:硬件过流、链路失锁等需要立即切断或切换的异常,由FPGA硬件直接响应;软件负责记录、上报和恢复策略。
一个常见的误区是把“软硬件协同”理解为软件可以随意干预硬件时序。实际上,一旦边界确定,软件对硬件的控制应通过寄存器映射或消息接口完成,而不是直接操作底层信号。这样既能保证硬件时序的确定性,也能让软件在边界之外获得最大的修改自由度。
三、数据流与控制流的划分方法
以典型的“摄像头—FPGA—处理器”链路为例。摄像头输出MIPI差分信号,FPGA(如CrossLink-NX)接收后完成D-PHY解串、像素对齐和格式转换,再通过并行接口或DMA写入处理器内存。这里的数据流是:MIPI串行→FPGA内部并行像素→FIFO缓冲→处理器总线。控制流则是:处理器通过I²C配置摄像头寄存器,通过SPI配置FPGA的通道映射和输出格式,FPGA通过中断通知处理器“一帧就绪”。
划分时要注意“背压”处理。如果处理器暂时来不及取数据,FPGA侧的FIFO会逐渐填满。此时硬件应产生溢出标志或暂停信号,而不是无限缓存。软件收到中断后,应优先读取FIFO并清中断,再处理其他任务。这个过程中,FIFO深度、中断阈值和DMA突发长度就是需要协同调优的参数。
四、性能优化的四个核心指标
吞吐量指单位时间内成功传输的有效数据量,通常用MB/s或帧/秒衡量。优化方向包括:加宽数据通路、提高时钟频率、使用DMA减少CPU搬运、增加FIFO深度平滑突发。延迟指从输入到输出经过的时间,包括硬件流水线延迟、FIFO排队延迟和软件中断响应延迟。对于实时控制,延迟比吞吐更关键,此时应减少流水线级数、降低FIFO深度、使用硬件中断直连。资源占用包括LUT、寄存器、Block RAM、DSP和I/O数量,优化时要在“功能完整”和“留有余量”之间平衡,通常建议资源利用率不超过70%以便后续修改。功耗则与工艺、时钟频率、翻转率和供电策略相关,Nexus的FD-SOI工艺在低功耗场景优势明显,软件侧可以通过动态关闭未用外设、降低采样率来配合。
五、协同开发的基本流程与交付物
一个可执行的协同开发流程通常包含以下环节:需求分解→软硬件边界定义→接口协议约定→FPGA逻辑设计与软件驱动并行开发→联合仿真→板级联调→性能测量与迭代。其中,接口协议约定是最容易被忽视但影响最大的环节。建议在项目早期就确定寄存器映射表、中断号、DMA描述符格式和错误码定义,并以文档形式冻结。
下面给出一份简化的接口约定示例,可作为实际项目的起点:
寄存器映射(基地址 0x4000_0000):
0x00 CTRL [0] 使能 [1] 软复位 [3:2] 通道选择
0x04 STATUS [0] 就绪 [1] 溢出 [2] 帧同步
0x08 FIFO_DATA 只读,读取一帧像素数据
0x0C FIFO_LEVEL 当前FIFO深度(单位:32bit字)
0x10 IRQ_MASK [0] 帧就绪中断使能 [1] 溢出中断使能
0x14 IRQ_CLR 写1清除对应中断标志
中断约定:
IRQ0:帧就绪,软件应在 500us 内读取 FIFO
IRQ1:FIFO 溢出,软件应记录并复位通道
DMA 描述符:
源地址 = FPGA FIFO_DATA 映射地址
目的地址 = 软件帧缓冲区
长度 = 一行像素字节数 × 行数
触发方式 = 帧就绪中断后由软件启动
这份约定明确了软件能做什么、硬件保证什么。例如,软件不需要关心MIPI解串细节,只需在中断后读取FIFO;硬件则保证在FIFO未满时不丢数据。后续的性能优化,也围绕这些接口参数展开:调整FIFO深度、修改中断阈值、改变DMA突发长度,都可以在不改动对方逻辑的前提下进行。
六、从全景到实践的关键认知
Lattice FPGA的协同开发,最终要落到“边界清晰、接口稳定、指标可测”三个关键词上。器件选型决定了硬件域的能力上限,分工原则决定了系统是否可靠,而性能指标则提供了优化的方向。对于初学者,建议先从MachXO或iCE40这类小规模器件入手,用简单的SPI控制加状态机回读,建立“软件发命令、硬件执行、软件读状态”的完整闭环;再逐步过渡到Nexus或CrossLink的高速数据通路,体会FIFO、DMA和中断协同的实际节奏。只有把边界和接口真正跑通,后续的吞吐、延迟、资源和功耗优化才有意义。