本文概述:FPGA复位设计的常见方式有同步复位和异步复位,各有优缺点。同步复位的优点是时序分析简单、没有亚稳态风险,缺点是需要时钟才能复位、占用更多逻辑资源。异步复位的优点是不依赖时钟、响应快、资源占用少,缺点是复位释放时可能有亚稳态风险、时序分析复杂。业界最常用的方案是"异步复位、同步释放",结合了两者的优点:复位异步生效,释放时经过同步器同步到时钟域,避免亚稳态。

核心要点速览

  • 同步复位:复位信号只在时钟有效沿起作用,安全但需时钟

  • 异步复位:复位随时生效,响应快但释放时可能有亚稳态

  • 异步复位同步释放:最常用方案,两者优点结合

  • 恢复时间(Recovery)和移除时间(Removal)是关键指标

  • 多时钟域每个域都要有自己的复位同步器

面试题

面试官问:FPGA的复位设计你一般怎么做?同步复位和异步复位有什么区别?什么是异步复位同步释放?

面试官考察点

  1. 是否理解同步复位和异步复位的本质区别

  2. 是否掌握异步复位同步释放的原理和实现

  3. 是否了解恢复时间和移除时间的概念

  4. 是否有实际工程中的复位设计经验

  5. 是否考虑过多时钟域的复位问题

回答思路

第一,同步复位和异步复位对比

同步复位:复位信号只在时钟上升沿(或有效沿)时才对触发器起作用。复位信号会被当作一个普通的输入数据来处理。

优点:时序分析简单,就是普通的数据路径;没有亚稳态问题,因为复位只在时钟沿生效;仿真行为更干净。

缺点:必须有时钟才能复位,如果时钟没有起来,复位不生效;会增加组合逻辑延时,可能影响时序;占用更多逻辑资源,因为综合工具要把复位接到数据通路。

异步复位:复位信号直接接到触发器的异步复位端,不需要时钟就能生效。

优点:不依赖时钟,只要复位到来立即生效,响应速度快;不影响数据通路的时序;资源占用少,大多数FPGA触发器自带异步复位端口。

缺点:复位释放时如果接近时钟沿,可能不满足恢复/移除时间,导致亚稳态;复位信号上的毛刺可能导致误复位;时序分析更复杂,需要做恢复时间和移除时间检查。

第二,什么是异步复位同步释放

异步复位同步释放(Asynchronous Reset, Synchronous Release)是目前业界最推荐的复位方案。它的设计思路是:

  • 复位生效是异步的:复位信号一来,所有触发器立即复位,不需要等时钟

  • 复位释放是同步的:复位撤销时,先经过两级触发器同步到时钟域,同步后的复位信号再接到各触发器的异步复位端

这样设计的好处是:既保留了异步复位响应快的优点,又通过同步器保证了复位释放时满足恢复时间和移除时间的要求,消除了亚稳态风险。

第三,异步复位同步释放的实现

典型的实现是两级触发器同步器。输入是异步复位信号,输出是经过同步的复位信号。两级触发器都用异步复位,复位端都接输入的异步复位。

工作过程:复位到来时,两级触发器同时异步复位,输出立即变低(假设低有效复位)。复位释放时,第一级触发器在时钟沿打一拍,第二级再打一拍,经过两个时钟周期后输出才释放。这样保证了输出的复位释放沿与时钟沿对齐,满足恢复时间要求。

Verilog关键代码结构大致是:第一级寄存器在复位时清零,时钟沿时采1(表示释放);第二级寄存器把第一级的输出再打一拍。最后取第二级的输出作为同步后的复位。

第四,复位树和复位域划分

复位树就是复位信号在FPGA内部的传播路径。设计复位树要注意:

  • 复位扇出太大时,要做复位树平衡,避免有的触发器先释放、有的后释放

  • 不同时钟域的复位要分别同步,不能跨时钟域共用同一个同步后的复位

  • 高速区域和低速区域的复位可以分开设计,各自优化

  • 关键路径上的复位要特别注意,确保时序收敛

复位域划分的原则:一个时钟域一个复位同步器,每个复位域内部共享同一个同步复位信号。跨时钟域的数据传输已经有CDC同步处理,和复位域是两个层面的问题。

第五,实际工程中的注意事项

第一,复位信号要经过防抖处理。外部复位按键可能有抖动,直接用可能导致多次复位,建议加防抖或用PLL的locked信号配合。

第二,PLL/MMCM的locked信号经常和复位配合使用。PLL未锁定时保持复位,锁定后才释放复位,这样保证时钟稳定后电路才开始工作。

第三,不是所有寄存器都需要复位。数据通路中的流水线寄存器,如果不复位也不影响功能,可以去掉复位,节省资源且有利于时序。

第四,仿真中要注意复位的初始状态。异步复位在仿真中要正确处理初始值,避免X态传播导致仿真异常。

第五,全局复位和局部复位要权衡。整个FPGA用一个全局复位最简单,但可能导致复位树太长、时序紧张。可以分模块局部复位。

常见追问

  1. 什么是恢复时间(Recovery Time)和移除时间(Removal Time)?

  2. 异步复位同步释放为什么用两级触发器?一级不行吗?

  3. 复位信号的毛刺怎么处理?你遇到过什么问题?

  4. 多时钟域的复位设计要注意什么?

  5. 复位树的高扇出怎么优化?有什么方法?

失分表达

避免这样说:

  • "同步复位好,安全"——只知其一不知其二,不理解适用场景

  • "异步复位简单,直接接进来就行"——忽略了亚稳态风险

  • "复位就是一个信号拉低拉高,没什么好设计的"——缺乏工程意识

准备动作

  1. 手写一遍异步复位同步释放的Verilog代码

  2. 画时序图,解释为什么两级触发器能解决亚稳态问题

  3. 理解恢复时间和移除时间的含义,能在波形图上标出来

  4. 准备一个实际项目中复位设计的案例

  5. 了解FPGA中全局复位网络(Global Reset)的概念

核心关键词

FPGA复位设计、同步复位、异步复位、异步复位同步释放、恢复时间Recovery、移除时间Removal、复位同步器、复位树、复位域、PLL锁定

FAQ常见问题

Q1: 恢复时间和建立时间有什么区别?
建立时间是数据相对于时钟沿需要提前稳定的时间。恢复时间是异步复位信号相对于时钟沿需要提前释放的时间,保证复位释放后第一个时钟沿触发器能正常工作。二者都是要求信号在时钟沿之前保持稳定,但适用的信号类型不同。
Q2: 为什么不用三级触发器同步复位?
两级同步器已经能把亚稳态的概率降到非常低的水平(MTBF可达数万年以上),再加一级只会增加延迟,边际效益很低。除非是高可靠系统(如航空航天),一般两级就足够了。
Q3: FPGA配置完成后,寄存器初始状态是什么?
FPGA配置完成后,所有带复位的触发器会进入复位状态(初始值由复位极性和代码决定)。不带复位的触发器初始状态不确定。这和ASIC不同,ASIC上电后寄存器状态完全随机。