1. 时钟网络与物理资源(决定性能上限)
FPGA硬件最底层的布线结构,直接决定电路能跑多快。
全局时钟(Global Clock):FPGA里到达全芯片各个角落延迟差异最小的专用布线网络。它专门用来走高频时钟(如100MHz、200MHz),确保所有触发器几乎同时收到跳变沿。由BUFG驱动。
区域时钟(Regional Clock):仅在芯片某个特定区域内(如1/4象限)有效的时钟网络。用于驱动局部模块,功耗比全局时钟低,资源也更灵活。由BUFR驱动。
MMCM(混合模式时钟管理器):Xilinx FPGA中的核心时钟“魔盒”。它可以倍频(把50M变200M)、分频、移相(调整时钟相位),还能去抖动(降低时钟抖动)。做DDR读写或高速接口时,必用MMCM来生成所需的多相位时钟。
时钟偏斜(Clock Skew):指同一个时钟信号到达不同触发器引脚的时间差。比如全局时钟的Skew很小(皮秒级),而用普通布线走时钟的Skew会很大。Skew过大是导致建立/保持时间违例(时序不收敛)的元凶之一。
CDC(跨时钟域处理,Clock Domain Crossing)
当数据(或单比特信号)从一个时钟域(如50MHz)输出,被另一个完全不同源的时钟(如以太网的 125MHz 时钟)抓取时,就发生了 CDC。
为什么要重视 CDC:如果直接跨域,会触发 亚稳态(Metastability)——触发器采样时没抓住,输出一个中间电压,导致后续逻辑全乱,甚至状态机死锁。
2.时序收敛
建立时间(Setup Time)与保持时间(Hold Time)
建立时间:时钟上升沿到来之前,数据必须保持稳定的最短时间。不满足(Setup Violation)→ 降频或修逻辑。
保持时间:时钟上升沿到来之后,数据必须保持稳定的最短时间。不满足(Hold Violation)→ 基本是物理布线问题(FPGA里通常靠工具自动修)。
3. 时钟设计禁忌
- 门控时钟(Gated Clock):指用组合逻辑(如
assign clk_out = clk & en)把时钟“与”出来给触发器用。FPGA设计中这是大忌! 因为它会产生毛刺,且引入巨大Skew,导致芯片逻辑错乱。正确做法:用MMCM的时钟使能(CE)脚,或者用全局时钟BUFGCE,用同步使能来控制,绝不用组合逻辑直接切时钟。
4. 运算优化
查找表(Look-Up Table):本质是一个由 SRAM 构成的可编程真值表,它将逻辑函数的真值表存储在少量内存单元中。输入信号作为地址,查表后直接输出对应的逻辑结果,从而实现组合逻辑功能,是 FPGA 实现组合逻辑的最小物理单元。
进位链(Carry Chain):FPGA内LUT(查找表)旁边紧挨着的专用快速进位逻辑(如Xilinx的CARRY4)。做加法、减法、计数器或比较器时,综合工具会自动调用它。它的传输延迟极短,是流水线乘法器、高速累加器的物理基础。注意:写大位宽加法时,进位链会级联变长,导致延迟增加,这是时序瓶颈的主要来源之一。
速度换面积:牺牲速度,节省资源,分时执行,复用硬件
- 乒乓操作(Ping-Pong Buffer):用双倍缓存掩盖数据处理时间,实现无缝数据流。比如有两个仓库(Buffer A和B)。往A输入时,处理B;A堆满时,切换——改为输入到B,处理A。卸货从不暂停,加工也从不等待。
- 流水线:把一个大组合逻辑切成N级小逻辑,中间插寄存器。延迟增加,但吞吐率变成每个周期都能出一个结果,时钟频率能跑得极高。
面积换速度:多份硬件,同时干活,提高吞吐速度
5. 经典编码范式(工程化写法)
三段式状态机(Three-stage FSM):指将状态机拆成三个Always块(或Process)来写的标准模板:
第一段:时序逻辑,描述现态到次态的寄存器跳转。
第二段:组合逻辑,描述次态译码逻辑(根据输入和现态决定下一跳转到哪个状态)。
第三段:时序逻辑或组合逻辑,专门描述输出(推荐用时序输出,避免毛刺)。
—— 这种写法代码清晰,能避免竞争冒险,且易于综合工具识别为安全状态机。