《Advanced FPGA Design》— 高级 FPGA 设计:结构、实现与优化
Steve Kilts 著,Wiley 2007 年出版。作者为 Spectrum Design Solutions 创始人,拥有 Medtronic、Honeywell、AMD 等多家公司的 FPGA 咨询经验。 全书 355 页,19 章 + 2 附录 + 参考书目 + 索引。以 Verilog / Xilinx / Synplicity 为默认工具链,但方法学可迁移到 VHDL / Altera / Mentor。
全书定位
- 不是入门教材:跳过基础理论,直接面向有经验的 FPGA 工程师
- 实战导向:来自众多真实项目的经验总结,替代”行业经验 + 资深导师”
- 按设计流程组织:架构 → 仿真 → 综合 → 布局规划 → 布线优化 → 时序分析 → PCB
- 配套案例:4 个完整设计实例(AES / I2S vs SPDIF / 浮点单元 / SHA-1 / 微处理器)
第一部分:架构设计(第 1-5 章)
第 1 章:速度架构(Architecting Speed)
速度的三个定义维度:
| 维度 | 定义 | 度量单位 |
|---|---|---|
| 吞吐量 Throughput | 单位时间处理的数据量 | bps, Mbps |
| 延迟 Latency | 输入到输出的时间 | 时钟周期, ns |
| 时序 Timing | 时序元件之间的逻辑延迟 | 时钟周期, MHz |
五种时序优化策略:
- 添加寄存器层(Add Register Layers) — 将关键路径切分为两段更小的延迟
- 并行结构(Parallel Structures) — 将顺序执行的操作拆分为并行,路径延迟降为最长子路径
- 扁平化逻辑(Flatten Logic Structures) — 移除不必要的优先级编码,减少级联门延迟
- 寄存器平衡(Register Balancing) — 将组合逻辑从关键路径移到相邻路径
- 路径重排序(Reorder Paths) — 重新组织数据流,让关键路径逻辑更靠近目的寄存器
核心洞察:吞吐量和面积是线性交换关系(流水线越深,面积越大,吞吐量越高);延迟则需要在流水线级数和时序之间权衡。
第 2 章:面积架构(Architecting Area)
面积优化的核心思想:最大程度复用逻辑资源,通常以吞吐量为代价。
四种面积优化技术:
- 折叠流水线(Rolling Up the Pipeline) — 用状态机循环复用同一硬件,牺牲吞吐量换面积
- 基于控制的逻辑复用(Control-Based Logic Reuse) — 自然数据流不存在时,用控制逻辑调度复用
- 资源共享(Resource Sharing) — 互斥操作之间共享算术/逻辑单元,通过选择器切换输入
- 复位对面积的影响(Impact of Reset on Area) — FPGA 中许多资源(LUT、BRAM、移位寄存器)没有内置复位,强制加复位会消耗额外逻辑
复位对面积的五条细则:
- 无复位的资源 → 强制复位需额外逻辑
- 无置位的资源 → 同理
- 无异步复位的资源 → 同步复位可能更高效
- RAM 复位 → 块 RAM 通常不支持全局复位,需额外电路
- 利用触发器的置位/复位引脚做逻辑实现 → 高级技巧
第 3 章:功耗架构(Architecting Power)
FPGA 功耗优化的六大手段:
- 时钟控制(Clock Control) — 门控时钟,但要注意时钟偏移(skew)管理
- 输入控制(Input Control) — 停止不活动模块的输入切换
- 降低电源电压(Reducing Voltage Supply) — 以速度换功耗
- 双边沿触发器(Dual-Edge Triggered Flip-Flops) — 时钟频率减半,功耗降低
- 修改端接(Modifying Terminations) — 调整 I/O 端接方案
- 封装与散热 — 系统级考虑
第 4 章:设计实例 — AES 加密
AES 的三种架构对比(Virtex II FPGA):
| 架构 | LUT 数量 | 最佳吞吐量 | 最差吞吐量 |
|---|---|---|---|
| 迭代型(Iterative) | 886 | 340 MBPS | 340 MBPS |
| 部分流水线(Partially Pipelined) | 4,432 | 15,400 MBPS | 314 MBPS |
| 全流水线(Fully Pipelined) | 5,894 | 15,400 MBPS | 15,400 MBPS |
S-box 的三种实现方式:
- Block RAM LUT 法(最常用,占内存多)
- 扩展欧几里得算法(迭代型,延迟大)
- Rijmen GF(16) 复合域法(面积最小,S-box 更紧凑)
第 5 章:高级设计方法
图形化状态机(Graphical State Machines):
- StateCAD 等工具:图形描述 → 自动生成 RTL
- 优势:可读性强,可自动做速度/面积优化
- 关键原则:顶层抽象的可读性最重要,自动生成的 RTL 可读性不重要
- 类比:从原理图到 RTL 的跃迁 — 我们信任工具,不再逐门检查
DSP 设计(MATLAB + Synplify DSP):
- MATLAB/Simulink 算法 → 直接生成 RTL
- FIR 滤波器:流水线架构 828 LUT / 140 MHz vs 折叠架构 249 LUT / 120 MHz
- “折叠(Folding)“选项:自动在速度和面积之间权衡
软硬件协同设计(Software/Hardware Codesign):
- C 到 HDL 的历史教训:顺序语言无法高效映射到并行硬件
- 软硬件划分的五个判断维度:
- 复杂度 — 递归/迭代不明确的算法适合软件
- 速度 — 极高速操作适合硬件
- 重复性 — 持续重复的任务适合硬件加速
- 实时精度 — 单周期级精度要求必须用硬件
- 操作系统/UI — 需要 OS 或复杂接口则必须用处理器
第二部分:时钟域与数学(第 6-9 章)
第 6 章:时钟域(Clock Domains)
跨时钟域的三种方案:
| 方案 | 适用场景 | 原理 |
|---|---|---|
| 相位控制(Phase Control) | 两时钟频率相同、相位已知 | 利用已知相位关系采样 |
| 两级打拍(Double Flopping) | 单比特控制信号 | 两级寄存器降低亚稳态概率 |
| FIFO 结构(FIFO Structure) | 多比特数据总线 | 双端口 RAM + 格雷码指针同步 |
亚稳态(Metastability):
- 无法完全消除,只能降低发生概率
- MTBF(平均无故障时间)取决于寄存器特性、时钟频率、数据变化率
- 两级同步器是标准做法,高速设计可用三级
同步器模块的设计原则:
- 单独分区,不与其他逻辑混合
- 只用寄存器,不加组合逻辑
- 明确标记同步边界
第 7 章:设计实例 — I2S vs SPDIF
两种数字音频接口的硬件实现对比:
- I2S:简单协议,左右声道分时复用,硬件实现直接
- SPDIF:自时钟、双相编码(biphase mark),需要时钟恢复和数据解码
- 分析维度:协议复杂度、硬件资源、时序约束、误码率
第 8 章:数学函数实现
除法的三种实现方式:
| 方法 | 适用场景 | 特点 |
|---|---|---|
| 乘移法(Multiply and Shift) | 除数固定/可预计算 | 简单,面积小 |
| 迭代除法(Iterative Division) | 定点、延迟不敏感 | 面积小,延迟大 |
| Goldschmidt 算法 | 高吞吐量浮点除法 | 可流水线,4-5 次迭代达到 64 位精度 |
超越函数的两种实现:
- 泰勒/麦克劳林级数展开 — 将 sin/cos/exp/log 分解为乘法和加法,但乘法次数多、延迟大
- CORDIC 算法 — 向量逐次旋转,只用加减和比较,每次迭代一个时钟,计算 sin/cos 优先选择 CORDIC,最终只需一次常数乘法
第 9 章:设计实例 — 浮点单元(FPU)
IEEE 754 浮点加法的五级流水线架构:
- 亚正态检测 — 判断是否为 subnormal,补上隐藏位
- 对阶(Mantissa Normalization) — 小数字右移对齐指数
- 符号检测与加减 — 根据符号做加法或减法
- 后归一化(Post-normalization) — 结果规格化,调整指数
- 舍入与异常处理 — 四种舍入模式(就近偶舍入/向零/向上/向下),溢出/下溢/非精确标志
第三部分:复位与验证(第 10-11 章)
第 10 章:复位电路
三种复位策略对比:
| 策略 | 优点 | 缺点 |
|---|---|---|
| 完全异步复位 | 数据通路干净,不影响时序 | 复位撤除时可能有亚稳态,对 skew 敏感 |
| 完全同步复位 | 安全,无亚稳态风险 | 增加组合逻辑路径,依赖时钟 |
| 异步置位、同步撤除(推荐) | 复位响应快,撤除安全 | 需要额外同步电路 |
最佳实践:异步断言 + 同步释放
- 复位信号异步生效(随时复位)
- 复位释放经过两级同步器同步到各自时钟域
- 每个时钟域都需要自己的复位同步器
混合复位类型的注意事项:
- 不可复位触发器的上电初始值问题
- 内部生成的复位信号
- 多时钟域的复位分配树
第 11 章:高级仿真
测试平台架构:
- 测试平台组件 + 测试流程
- 主线程 + 时钟复位 + 测试用例三段式结构
系统激励方法:
- MATLAB 生成激励 — 对 DSP 类设计特别有效
- 总线功能模型(BFM) — 模拟总线协议行为,比 RTL 更快更灵活
覆盖度分析:
- 代码覆盖(Code Coverage) — 行/分支/条件/翻转覆盖
- 门级仿真(Gate-Level Simulations) — 验证综合后网表的功能正确性
- 翻转覆盖(Toggle Coverage) — 检查信号是否都有 0→1 和 1→0 跳变
运行时陷阱:
- timescale 设置 — 精度 vs 仿真速度的权衡
- 毛刺抑制(Glitch Rejection) — 过滤掉小于指定延迟的脉冲
- 组合延迟建模 — 如何在仿真中反映实际延迟
第四部分:综合与编码(第 12-14 章)
第 12 章:可综合编码
决策树(Decision Trees):
- 优先级 vs 并行 — if-else 生成优先级链(长路径),case 生成并行多路选择器
- Full Case / Parallel Case — 综合指令,告诉工具所有情况都覆盖、分支互斥
- 多控制分支 — 复杂嵌套结构的优化
常见陷阱:
- 阻塞 vs 非阻塞赋值 — 时序逻辑用非阻塞
<=,组合逻辑用阻塞= - For 循环 — 综合时完全展开,需注意面积
- 组合循环(Combinatorial Loops) — 没有寄存器的反馈环路,会产生振荡和时序问题
- 推断锁存器(Inferred Latches) — case/if 不完整时生成,几乎总是设计错误
设计组织:
- 分区(Partitioning)
- 数据通路 vs 控制逻辑分离
- 时钟和复位结构清晰
- 合理使用多次实例化
- 参数化(Parameterization)
- 定义、参数声明、Verilog-2001 新语法
第 13 章:设计实例 — SHA-1
SHA-1 哈希算法的 FPGA 实现:
- 架构:循环展开 + 流水线
- 资源与性能分析
- 与 AES 的对比:不同类型算法的架构选择差异
第 14 章:综合优化
速度 vs 面积的三个区域:
- 欠约束区 — 约束很低,面积最小,速度余量很大
- 优化区(线性区) — 约束越高,工具用更多面积换速度,近似线性关系
- 过约束区 — 约束过高,工具”放弃”,结果反而更差
经验法则:目标频率设置不应高于最终可达频率的 15-20%,过约束反而会得到更差的结果。
主要综合优化技术:
| 技术 | 作用 |
|---|---|
| 资源共享(Resource Sharing) | 互斥操作共享算术单元,减面积 |
| 流水线 / 重定时 / 寄存器平衡 | 在寄存器之间重新分配组合逻辑 |
| FSM 编译 | 自动选择最佳状态编码(二进制/独热/格雷码),移除不可达状态 |
| 黑盒(Black Boxes) | 保留预优化模块,不让综合工具改动 |
| 物理综合(Physical Synthesis) | 结合布局信息做综合优化,前标注 vs 后标注 |
复位对寄存器平衡的影响: 带复位的寄存器不能随意移动逻辑,限制了重定时的效果。
第五部分:布局布线与时序(第 15-18 章)
第 15 章:布局规划(Floorplanning)
布局规划的四个要素:
- 数据通路(Data Path) — 规则结构放在一起,减少布线延迟
- 高扇出信号(High Fan-Out) — 放置在中心位置,减少到各端点的距离
- 器件结构(Device Structure) — 利用 FPGA 的列/行结构(BRAM 列、DSP 块等)
- 可重用性(Reusability) — 模块化布局,方便后续复用
布局规划的危险:
- 过度约束可能导致工具无法优化
- 小设计通常不需要手动布局规划
- 临界路径布局规划(Critical-Path Floorplanning)是最有效的手动干预方式
第 16 章:布局布线优化
十一种 P&R 优化技术:
| 技术 | 说明 |
|---|---|
| 最优约束 | 完整约束是所有优化的前提 |
| 布局与布线的关系 | 布局对性能影响最大,布线影响相对较小 |
| 逻辑复制(Logic Replication) | 高扇出关键路径信号复制驱动器,减少负载 |
| 跨层次优化 | 展平层次做全局优化,但会影响门级仿真一致性 |
| I/O 寄存器打包 | 把寄存器塞进 IOB,高速设计可能需要额外流水线寄存器 |
| Pack Factor | 人为限制可用资源比例,评估真实利用率和余量 |
| 逻辑映射到 RAM | 用块 RAM 实现逻辑,仅在极高密度低速设计中考虑 |
| 寄存器排序 | 多位寄存器相邻放置,但会抵消布线平衡寄存器的效果 |
| 布局种子(Placement Seed) | 多跑几次取最好结果,只能作为最后手段,会失去可重复性 |
| 引导布局布线(Guided P&R) | 小改动时用之前的布局做引导,保持一致性,减少运行时间 |
| 功耗优化 | 布局规划层面降低动态功耗 |
第 17 章:设计实例 — 微处理器(SRC)
简单 RISC 计算机(SRC)的 FPGA 实现与优化案例:
- 32 位,32 个通用寄存器,Load/Store + 分支 + 算术 + 逻辑移位指令
- 多级流水线实现
- 用速度/面积选项、流水线、物理综合做优化对比
- 分区布局规划 vs 临界路径布局规划的两层抽象优化
第 18 章:静态时序分析(STA)
标准 STA 分析:
- 建立时间(Setup)和保持时间(Hold)检查
- 最大延迟路径和最小延迟路径
- 多周期路径(Multicycle Paths)、虚假路径(False Path)
锁存器(Latches)的时序分析:
- 锁存器是电平敏感,不是边沿触发
- 时间借用(Time Borrowing)特性 — 可以从前一级”借”时间
- STA 工具对锁存器的处理方式
异步电路与时序:
- 组合反馈(Combinatorial Feedback)— 振荡、毛刺、潜在功能错误
- 异步设计的 STA 分析挑战
第六部分:系统级(第 19 章 + 附录)
第 19 章:PCB 相关问题
电源系统:
- 供电要求 — FPGA 电源轨数量(核心、I/O、辅助、PLL)
- 稳压方案 — LDO vs 开关电源,效率 vs 噪声
去耦电容(Decoupling Capacitors):
- 原理 — 提供瞬态电流,抑制电源噪声
- 容值计算 — 根据瞬态电流和允许纹波计算
- 放置原则 — 尽可能靠近电源引脚,多种容值搭配(高频小电容 + 低频大电容)
附录 A / B
- 附录 A:辅助 Verilog 模块(寄存器、乘法器等基础组件)
- 附录 B:SRC 微处理器完整代码
核心观点提炼
- 架构决定上限:工具优化永远无法弥补糟糕的架构,先选对架构再调工具
- 三维权衡:速度 / 面积 / 功耗是永恒的三角关系,没有”最优”只有”最合适”
- 复位很重要:FPGA 资源的复位特性与 ASIC 不同,设计时需从第一天考虑
- 跨时钟域是高危区:亚稳态无法消除,只能通过正确的同步设计降低概率
- 过约束反而有害:综合和布局布线都存在”过犹不及”,合理设置约束
- 抽象层次向上迁移:图形化状态机、DSP Builder、C 到 RTL — 趋势是更高抽象,核心是顶层可读性
- 可重复性 vs 最后一步优化:种子调整等方法能挤出最后几 MHz,但会失去可重复性,需谨慎使用
- 系统思维:FPGA 设计不只是 RTL,时钟、复位、功耗、PCB 去耦都是系统级问题