3. Lattice FPGA架构与资源建模
软硬件协同设计的第一步,不是写代码,而是回答一个量化问题:这块 Lattice FPGA 到底能装下多少逻辑、多少乘法、多少存储、多少时钟域和多少 I/O?如果资源估算失真,划分方案会在综合阶段崩塌——本该放进 FPGA 的模块被迫回退到 MCU,或者为了塞进逻辑而牺牲时序余量。本节围绕 Lattice FPGA 的六类核心资源,建立一套可用于软硬件划分的资源估算模型。
一、六类资源的物理本质与建模口径
Lattice FPGA(以 ECP5、iCE40、CrossLink-NX 等系列为代表)的可编程资源可归为六类,每类的“计量单位”不同,建模时必须统一到可比较的口径。
可编程逻辑单元(LUT/FF):Lattice 主流器件采用 4 输入 LUT(LUT4)结构,每个 Slice 通常含 2 个 LUT4 与 2 个触发器(FF)。ECP5 的每个 PFU(Programmable Functional Unit)含 4 个 Slice,即 8 个 LUT4 与 8 个 FF。建模时以“LUT4 数量”和“FF 数量”分别计数,因为组合逻辑与寄存器逻辑的消耗比例差异很大。
DSP(乘法累加单元):ECP5 的 sysDSP 支持 18×18、9×9 等多种乘法模式,每个 DSP Slice 含一个 18×18 乘法器、加法器和流水寄存器。关键建模参数是“乘法位宽”与“是否级联”:一个 36×36 乘法需要 4 个 18×18 DSP 拼接,而 8×8 乘法可在一个 DSP 内以 9×9 模式实现。
EBR(Embedded Block RAM):ECP5 每个 EBR 为 18 Kbit,可配置为 512×36、1024×18、2048×9 等宽度。建模时按“位宽×深度”折算成 EBR 块数,并注意位宽非 9 的倍数时会产生位浪费。
分布式 RAM(Distributed RAM):由 LUT 直接构成,适合小容量、多端口、低延迟的存储。iCE40 系列中分布式 RAM 是主要存储形式。建模时按“LUT 消耗量”折算,一个 16×4 的分布式 RAM 约消耗 16 个 LUT4。
时钟网络:Lattice 器件提供全局时钟(Global Clock)与区域时钟(Regional Clock)。ECP5 有 8 个全局时钟网络,每个时钟域消耗一个全局网络。建模时统计“独立时钟域数量”,超过全局网络数时需改用区域时钟或时钟使能方案。
I/O 资源:按 Bank 组织,每个 Bank 有独立的 VCCO 电压。建模时统计“I/O 标准类型×数量”,并检查同一 Bank 内电压兼容性。高速接口(如 DDR、SerDes)还需占用专用 I/O 和 PLL。
二、从 RTL 到资源数字:折算方法
资源估算不能等到综合报告出来才做,那样就失去了划分的意义。在 RTL 阶段,可以用“结构计数法”快速估算。
LUT 估算:一个 N 位加法器约消耗 N 个 LUT4;一个 N 位计数器约消耗 N 个 LUT4 加 N 个 FF;一个 N 输入组合逻辑函数若输入数 ≤ 4,消耗 1 个 LUT4,超过 4 则按树形分解。例如一个 16 位比较器约消耗 16 个 LUT4,一个 8 状态有限状态机约消耗 8~12 个 LUT4 加 4 个 FF。
DSP 估算:统计所有乘法运算的位宽。若位宽 ≤ 18,每个乘法占 1 个 DSP;若位宽在 19~36 之间,占 4 个 DSP(两个 18×18 拼接再相加)。注意 Lattice sysDSP 支持 9×9 模式,两个 9×9 乘法可共享一个 DSP Slice,这是小位宽场景的优化点。
EBR 估算:按“位宽向上取整到 9 的倍数,深度向上取整到 2 的幂”折算。例如一个 512×12 的 FIFO,位宽 12 向上取整为 18,深度 512 不变,占用 512×18 = 9216 bit,即 1 个 EBR(18 Kbit)的 51%。若位宽为 20,则取整为 36,占用 512×36 = 18432 bit,刚好 1 个 EBR。位宽取整带来的浪费在窄位宽场景下非常显著。
分布式 RAM 估算:一个深度 D、位宽 W 的分布式 RAM,消耗约 D×W/16 个 LUT4(因为每个 LUT4 可存 16 bit)。例如 32×8 的分布式 RAM 消耗约 16 个 LUT4。分布式 RAM 的优势在于多端口和低延迟,但容量超过 256 bit 后应优先考虑 EBR。
三、时钟域与 I/O 的约束建模
时钟网络和 I/O 是“硬约束”资源,不像 LUT 那样可以灵活复用。ECP5-45F 有 8 个全局时钟网络,如果设计中有 10 个独立时钟域,就必须合并或改用区域时钟。建模时统计每个模块的时钟域数量,并检查跨时钟域接口是否需要额外的同步器(每个同步器约消耗 2 个 FF)。
I/O 建模需要按 Bank 分组。每个 Bank 有独立的 VCCO,同一 Bank 内不能混用不兼容的 I/O 标准。例如 Bank 0 的 VCCO 设为 3.3V 时,不能同时接入 1.8V 的 LVDS 差分对。建模时列出每个 Bank 的 I/O 标准、数量和电压,检查是否存在冲突。高速接口(如 DDR3、SerDes)还需占用专用 I/O 和 PLL,这些资源在数据手册中有独立计数。
四、资源估算表与划分决策
将上述估算结果填入一张资源估算表,是软硬件划分的直接依据。以下是一个可填写的示例模板,以 ECP5-45F 为目标器件,假设设计包含一个图像预处理模块、一个 FFT 模块和一个控制状态机。
| 模块 | LUT4 | FF | DSP | EBR | 时钟域 | I/O |
|---|---|---|---|---|---|---|
| 图像预处理(3×3 卷积) | 2,800 | 1,200 | 9 | 4 | 1 | 24 |
| FFT-256 点 | 6,500 | 4,800 | 12 | 8 | 1 | 0 |
| 控制状态机 | 320 | 180 | 0 | 0 | 1 | 8 |
| 跨时钟域同步器 | 48 | 96 | 0 | 0 | — | 0 |
| 合计 | 9,668 | 6,276 | 21 | 12 | 3 | 32 |
| 70% 预算 | 30,240 | 30,240 | 50 | 75 | 8 | 221 |
| 余量 | 20,572 | 23,964 | 29 | 63 | 5 | 189 |
从表中可以看出,LUT、FF、EBR 和 I/O 都有充足余量,但 DSP 占用 21 个,距离 70% 预算的 50 个还有 29 个余量。如果后续要增加一个 36×36 的矩阵乘法模块,需要 4 个 DSP,仍在预算内。但如果要增加三个这样的模块,DSP 将接近上限,此时应考虑将部分乘法运算移到 MCU 软件中实现,或者改用分布式算法(DA)以 LUT 替代 DSP。
五、面向软硬件划分的量化判据
资源估算的最终目的是支撑划分决策。以下三条判据可直接用于工程实践:
- DSP 瓶颈判据:若 DSP 占用超过 70% 预算,优先将低吞吐率的乘法运算移到 MCU 软件实现。MCU 的乘法指令虽然单次延迟高,但通过流水线调度可以隐藏部分延迟。
- EBR 瓶颈判据:若 EBR 占用超过 70% 预算,检查是否存在位宽浪费。将多个窄位宽存储合并为一个宽位宽 EBR,或改用分布式 RAM 承担小容量存储,可以释放 EBR 资源。
- 时钟域判据:若独立时钟域数量超过全局时钟网络数的 70%,必须进行时钟域合并。合并方法包括:使用时钟使能代替独立时钟、将同频不同相的时钟统一到同一全局网络、用 PLL 生成同源时钟。
这三条判据不是孤立的。实际划分时,需要同时检查所有资源的余量,找到最紧的约束作为划分边界。例如上表中 DSP 是最紧约束,那么划分决策应以 DSP 为核心:优先保证 DSP 密集型模块留在 FPGA,将 DSP 需求低但 LUT 需求高的模块考虑移到 MCU 或进行逻辑优化。
建立资源估算模型后,下一步是将其与软硬件接口设计结合:确定哪些数据通过 AXI 或 SPI 在 FPGA 与 MCU 之间传输,传输带宽是否与模块吞吐率匹配。资源估算表将作为接口设计的输入,确保划分后的系统在资源和带宽两个维度上都可行。