复位分同步复位(时钟沿采样复位)和异步复位(复位立即生效);推荐异步复位同步释放:复位信号异步生效(立即复位),但释放时同步到时钟域(防亚稳态);多时钟域每个时钟域都要同步释放;复位树要平衡延迟,避免某些寄存器先释放后释放导致状态错误。
本文概述
复位是 FPGA 设计基础,面试常考:同步/异步复位、异步复位同步释放、复位树、跨时钟域。回答要给代码和原理。
核心要点
同步复位:复位信号在时钟沿采样,需要时钟才能复位,抗毛刺好
异步复位:复位立即生效,不依赖时钟,但释放时可能亚稳态
推荐异步复位同步释放:复位异步生效,释放时打两拍同步到时钟域
多时钟域:每个时钟域单独做同步释放,复位信号跨域要同步
复位树:高扇出复位要加缓冲器,平衡延迟,用全局复位网络(BUFG)

面试官考察点
FPGA 复位基础题。面试官看你是否理解复位亚稳态。重点听:异步生效、同步释放。
回答思路
讲异步复位释放时亚稳态问题,给同步释放代码。
参考回答
同步 vs 异步复位。
| 类型 | 生效 | 优点 | 缺点 |
|---|---|---|---|
| 同步复位 | 时钟沿采样 | 抗毛刺,仿真干净 | 需要时钟,无时钟不复位 |
| 异步复位 | 立即生效 | 不依赖时钟,立即复位 | 释放时可能亚稳态,毛刺误触发 |
异步复位的问题。
异步复位生效时没问题(立即复位,所有寄存器到复位值);
但复位释放(撤防)时,如果在时钟建立/保持窗口内释放,触发器可能亚稳态;
不同寄存器复位路径延迟不同,有的先释放有的后释放,导致状态不一致;
所以要异步复位同步释放。
异步复位同步释放代码。
reg rst_sync1, rst_sync2;
wire rst_n = rst_sync2; // 同步后的复位
always @(posedge clk or negedge async_rst_n) begin
if(!async_rst_n) begin
rst_sync1 <= 1'b0; // 异步复位
rst_sync2 <= 1'b0;
end else begin
rst_sync1 <= 1'b1; // 同步释放
rst_sync2 <= rst_sync1;
end
end
复位按下(async_rst_n=0):立即复位,rst_sync1/2 都变 0;
复位释放(async_rst_n=1):要等两个时钟沿后 rst_sync2 才变 1,保证在时钟沿稳定释放;
所有寄存器用 rst_n(同步后的复位)。
多时钟域复位。
每个时钟域单独做异步复位同步释放;
不能把一个时钟域的复位直接用到另一个时钟域(亚稳态);
如果需要有序复位(先复位 A 再复位 B),用握手或计数器控制。
复位树。
复位信号扇出大(连到所有寄存器),要加缓冲器或用全局时钟网络 BUFG 驱动;
复位延迟要平衡,避免有的寄存器先释放有的后释放;
FPGA 一般用全局复位网络,综合工具自动处理;
高扇出复位可以用多级缓冲树。
注意。
复位是低电平有效还是高电平有效要统一(一般低电平有效);
上电复位(POR)要足够长,保证时钟稳定后再释放;
不是所有寄存器都需要复位,数据通路寄存器可以不复位(节省资源);
复位不要加组合逻辑(毛刺会误触发)。

扫码关注




























