FPGA开发的四大基本原则是什么?

文章来源:FPGA入门到精通

从软件编程转向FPGA设计,最大的挑战并非语法学习,而是思维模式的根本转变。

这里分享下FPGA开发的四大基本原则。

原则一:时序优先原则——数字电路的“心跳”

核心思想:功能正确远非终点,确保信号在正确的时间到达才是关键。

如果说功能是电路的“躯体”,那时序就是它的“心跳”。在软件世界中,我们关心的是逻辑结果;而在FPGA的硬件世界里,我们同样关心结果何时产生。
1、什么是时序? 

有两个关键概念:

(1)建立时间

在时钟有效沿到来之前,数据输入必须保持稳定的最短时间。

(2)保持时间

在时钟有效沿到来之后,数据输入必须继续稳定的最短时间。

1.png

2、时序不满足的后果

时序不满足会导致亚稳态,即寄存器的输出进入一个不确定的中间状态,进而引发整个系统运行的结果错误或稳定性差。

3、实践指南

(1)严格约束:必须使用时序约束文件来告知开发工具你的时钟频率、输入/输出延迟等目标。

(2)关注报告:综合与实现后的时序报告是你的“成绩单”,必须确保没有违例。

(3)流水线设计:这是解决时序问题的利器。将长组合逻辑链切断,插入寄存器,从而缩短关键路径,提高系统时钟频率。

原则二:面积与速度的互换原则——设计的“权衡艺术”

核心思想:

在保证设计满足速度(能够达到预期的Fmax)的前提下,尽可能地减少FPGA资源消耗;

或在有限的资源下,使设计的时序裕量WNS更大,获取更高的Fmax。

2.png

面积:一个工程设计消耗的FPGA逻辑资源数量,可以查看资源利用率报告。

速度:一个工程在FPGA上稳定运行时所能达到的最高时钟频率,也就是Fmax,可通过时序报告中的WNS计算得到(Worst Negative Slack,建立时间最小裕量,当值大于等于0时表明建立时间收敛;当值小于0表示建立时间存在时序违例)。

WNS 与 Fmax 的计算关系:

核心公式:Fmax = 1 / (时钟周期 - WNS)

计算示例:

设计有一个时钟约束为100 MHz,则时钟周期为10ns

如果WNS等于 - 0.5ns,则

Fmax = 1 / (10 - (-0.5 ns)) ≈ 95.24 MHz;

如果WNS等于0.2ns,则

Fmax = 1 / (10 - (-0.2 ns)) ≈ 102.04 MHz;

FPGA内部的LUT、寄存器、BRAM和DSP等资源是有限的。优秀的FPGA工程师就像一位精明的商人,懂得如何在“面积”和“速度”之间进行最优的权衡。
以面积换速度:

  · 流水线:增加寄存器(消耗面积)来提升系统速度。

  · 逻辑复制:对高扇出的信号进行复制,减少单个网络的负载,从而改善时序(速度)。

  · 循环展开:将串行处理的循环体展开成多个并行处理单元,在一个周期内完成更多工作,极大提升吞吐率,但消耗大量资源。

以速度换面积:

  · 资源共享:让时间上互不冲突的操作共享同一个功能单元(如乘法器),减少资源使用,但可能会降低吞吐率。

  · 串行化处理:将宽位宽的操作拆分成多个周期完成,用时间换取空间。

原则三:同步设计原则——系统稳定的“压舱石”
核心思想:整个系统的核心逻辑应由单一或同源的时钟驱动,尽量减少异步设计,但随着系统功能越来越复杂,系统中时钟的数目越来越多,需要处理好跨时钟信号处理。
同步设计是构建复杂、可靠数字系统的基石。它确保了所有状态变化都在时钟的“指挥棒”下整齐划一地发生,使得电路行为可预测、可分析。
同步电路:所有寄存器使用同一个时钟网络,数据变化仅在时钟边沿被采样。

异步设计的危害:
  · 亚稳态:当异步信号被时钟采样时,极易因不满足建立/保持时间而产生亚稳态。

  · 难以分析:静态时序分析工具无法有效处理异步路径,导致潜在的风险无法被及时发现。

  · 可靠性差:设计难以移植和调试,在不同温度、电压下行为可能不一致。

实践指南:
  1. 全局时钟:尽可能使用全局时钟资源。

  2. 同步化处理:对于不可避免的异步输入(如按键、外部中断),必须使用同步器(通常是两级或多级寄存器串联)来降低亚稳态传播的风险。

  3. 杜绝门控时钟:切勿使用组合逻辑的输出作为时钟,这会产生危险的毛刺。应使用时钟使能信号来控制寄存器。

原则四:硬件并行思维原则——从“顺序执行”到“并行宇宙”
核心思想:用硬件并行的视角来思考,而非软件的顺序流思维。

3.png

这是FPGA开发最根本、也最具魅力的原则。在FPGA中,只要电路没有数据依赖关系,它们就是同时工作的。
并行性:所有进程、模块在通电后即刻同时运行,而非逐行执行。

代码即电路:你写的每一行硬件描述语言代码,都不是指令,而是对硬件结构的描述。一个if-else语句对应一个多路选择器,一个for循环会被展开成多个相同的硬件单元。

实践指南:
  1. 心中要有电路:在编写代码时,可以思考:“这行代码会综合成什么电路?”

  2. 慎用循环:理解HDL中的for循环是空间上的展开,而非时间上的迭代。循环8次意味着生成8个相同的电路单元,而非1个单元工作8个周期。

  3. 善用状态机:对于必须按步骤执行的操作,应使用有限状态机来清晰地描述控制流,这是实现“顺序行为”的标准硬件方式。

  4. 拥抱流水线:将任务分解为多个阶段,让数据流连续不断地通过系统,实现极高的吞吐率,这是并行思维的最佳体现。