《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

五种时序优化策略:

  1. 添加寄存器层(Add Register Layers) — 将关键路径切分为两段更小的延迟
  2. 并行结构(Parallel Structures) — 将顺序执行的操作拆分为并行,路径延迟降为最长子路径
  3. 扁平化逻辑(Flatten Logic Structures) — 移除不必要的优先级编码,减少级联门延迟
  4. 寄存器平衡(Register Balancing) — 将组合逻辑从关键路径移到相邻路径
  5. 路径重排序(Reorder Paths) — 重新组织数据流,让关键路径逻辑更靠近目的寄存器

核心洞察:吞吐量和面积是线性交换关系(流水线越深,面积越大,吞吐量越高);延迟则需要在流水线级数和时序之间权衡。

第 2 章:面积架构(Architecting Area)

面积优化的核心思想:最大程度复用逻辑资源,通常以吞吐量为代价。

四种面积优化技术:

  1. 折叠流水线(Rolling Up the Pipeline) — 用状态机循环复用同一硬件,牺牲吞吐量换面积
  2. 基于控制的逻辑复用(Control-Based Logic Reuse) — 自然数据流不存在时,用控制逻辑调度复用
  3. 资源共享(Resource Sharing) — 互斥操作之间共享算术/逻辑单元,通过选择器切换输入
  4. 复位对面积的影响(Impact of Reset on Area) — FPGA 中许多资源(LUT、BRAM、移位寄存器)没有内置复位,强制加复位会消耗额外逻辑

复位对面积的五条细则:

  • 无复位的资源 → 强制复位需额外逻辑
  • 无置位的资源 → 同理
  • 无异步复位的资源 → 同步复位可能更高效
  • RAM 复位 → 块 RAM 通常不支持全局复位,需额外电路
  • 利用触发器的置位/复位引脚做逻辑实现 → 高级技巧

第 3 章:功耗架构(Architecting Power)

FPGA 功耗优化的六大手段:

  1. 时钟控制(Clock Control) — 门控时钟,但要注意时钟偏移(skew)管理
  2. 输入控制(Input Control) — 停止不活动模块的输入切换
  3. 降低电源电压(Reducing Voltage Supply) — 以速度换功耗
  4. 双边沿触发器(Dual-Edge Triggered Flip-Flops) — 时钟频率减半,功耗降低
  5. 修改端接(Modifying Terminations) — 调整 I/O 端接方案
  6. 封装与散热 — 系统级考虑

第 4 章:设计实例 — AES 加密

AES 的三种架构对比(Virtex II FPGA):

架构LUT 数量最佳吞吐量最差吞吐量
迭代型(Iterative)886340 MBPS340 MBPS
部分流水线(Partially Pipelined)4,43215,400 MBPS314 MBPS
全流水线(Fully Pipelined)5,89415,400 MBPS15,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 的历史教训:顺序语言无法高效映射到并行硬件
  • 软硬件划分的五个判断维度:
    1. 复杂度 — 递归/迭代不明确的算法适合软件
    2. 速度 — 极高速操作适合硬件
    3. 重复性 — 持续重复的任务适合硬件加速
    4. 实时精度 — 单周期级精度要求必须用硬件
    5. 操作系统/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 浮点加法的五级流水线架构:

  1. 亚正态检测 — 判断是否为 subnormal,补上隐藏位
  2. 对阶(Mantissa Normalization) — 小数字右移对齐指数
  3. 符号检测与加减 — 根据符号做加法或减法
  4. 后归一化(Post-normalization) — 结果规格化,调整指数
  5. 舍入与异常处理 — 四种舍入模式(就近偶舍入/向零/向上/向下),溢出/下溢/非精确标志

第三部分:复位与验证(第 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 面积的三个区域:

  1. 欠约束区 — 约束很低,面积最小,速度余量很大
  2. 优化区(线性区) — 约束越高,工具用更多面积换速度,近似线性关系
  3. 过约束区 — 约束过高,工具”放弃”,结果反而更差

经验法则:目标频率设置不应高于最终可达频率的 15-20%,过约束反而会得到更差的结果。

主要综合优化技术:

技术作用
资源共享(Resource Sharing)互斥操作共享算术单元,减面积
流水线 / 重定时 / 寄存器平衡在寄存器之间重新分配组合逻辑
FSM 编译自动选择最佳状态编码(二进制/独热/格雷码),移除不可达状态
黑盒(Black Boxes)保留预优化模块,不让综合工具改动
物理综合(Physical Synthesis)结合布局信息做综合优化,前标注 vs 后标注

复位对寄存器平衡的影响: 带复位的寄存器不能随意移动逻辑,限制了重定时的效果。


第五部分:布局布线与时序(第 15-18 章)

第 15 章:布局规划(Floorplanning)

布局规划的四个要素:

  1. 数据通路(Data Path) — 规则结构放在一起,减少布线延迟
  2. 高扇出信号(High Fan-Out) — 放置在中心位置,减少到各端点的距离
  3. 器件结构(Device Structure) — 利用 FPGA 的列/行结构(BRAM 列、DSP 块等)
  4. 可重用性(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 微处理器完整代码

核心观点提炼

  1. 架构决定上限:工具优化永远无法弥补糟糕的架构,先选对架构再调工具
  2. 三维权衡:速度 / 面积 / 功耗是永恒的三角关系,没有”最优”只有”最合适”
  3. 复位很重要:FPGA 资源的复位特性与 ASIC 不同,设计时需从第一天考虑
  4. 跨时钟域是高危区:亚稳态无法消除,只能通过正确的同步设计降低概率
  5. 过约束反而有害:综合和布局布线都存在”过犹不及”,合理设置约束
  6. 抽象层次向上迁移:图形化状态机、DSP Builder、C 到 RTL — 趋势是更高抽象,核心是顶层可读性
  7. 可重复性 vs 最后一步优化:种子调整等方法能挤出最后几 MHz,但会失去可重复性,需谨慎使用
  8. 系统思维:FPGA 设计不只是 RTL,时钟、复位、功耗、PCB 去耦都是系统级问题

关联笔记