【问题标题】:Why do verilog tutorials commonly make reset asynchronous?为什么verilog教程通常使reset异步?
【发布时间】:2025-12-03 18:00:01
【问题描述】:

如果这有什么不同的话,这个问题是在 FPGA 综合的背景下进行的。数据表 (iCE40UP) 指出,每个逻辑单元都有一个 D 型触发器,带有异步复位和时钟使能输入。

许多 verilog 教程介绍顺序逻辑,例如:

always @(posedge clk)
  begin
    some_reg <= [...]
  end

我熟悉时钟逻辑,这对我来说很直观。

那么接下来介绍的概念通常是:

  • 注意不要意外创建锁存器,因为您真正需要的是正确的寄存器。
  • always @(posedge clk or [pos|neg]edge reset)
  • always @(*)

在*中,我读到scary statements like“如果系统依赖于任何连续输入,那么这些输入很可能容易受到亚稳态的影响。[...] 如果仲裁器或触发器的输入几乎同时到达,电路很可能会穿过一个亚稳态点。”

我的问题可能会因为格式不正确而被关闭……我错过了什么?

  • 异步复位是推荐的设计实践吗?不将复位视为任何其他输入并使其在下一个周期生效,可以获得什么?实际芯片的文档通常要求 RST* 引脚在多个时钟周期内保持低电平。

  • 设计中的锁存器是否会使其异步?在存在由时钟域之外的东西驱动的锁存器的情况下,我们如何确保观察到正确的时序?

  • 何时会有人真正需要时钟设计中的锁存器?为什么 verilog 让意外创建如此容易?

谢谢!

看似相关的问题: - Verilog D-Flip-Flop not re-latching after asynchronous reset - What if I used Asynchronous reset, Should I have to make as synchronous turned it?

【问题讨论】:

  • 你混合了很多问题并提出了问题。它们解决了完全不同的问题。我建议你就一个主题而不是九个问题问一两个问题!您在这里提出的问题。
  • 所以基本问题是“从异步信号中导出输入到寄存器的值而不考虑建立和保持时间如何正确?”其余的都直接从它继承而来。
  • 我可以回答,但有更好的答案,在 WWW 上有很多漂亮的图片。只需寻找“数字逻辑同步”。而no,其余的并没有随之而来,因为它没有解决锁存器或如何处理复位或为什么在 FPGA 中更多地使用异步复位。

标签: verilog hardware flip-flop timing-diagram


【解决方案1】:

同步与异步重置与 CPU 的大端与小端之争有一些相似之处。 在许多情况下,这两种类型都同样有效。 但是在某些情况下,任何一种类型都比另一种具有优势。 在上电或断电等情况下,您可能没有有效的时钟,但您仍然需要复位才能使系统处于已知的被动状态,并避免危险的 I/O 故障。 只有异步重置可以做到这一点。

如果您的设计包含缺乏复位功能的寄存器,例如 RAM 模块,那么在将 adr、数据和控制信号馈送到 RAM 的寄存器上使用异步复位可能会在复位发生时导致 RAM 内容损坏。因此,如果您需要在必须保留 RAM 内容的情况下进行热复位:对最接近 RAM 的逻辑使用同步热复位。

Altera 和 Xilinx 建议他们的客户只使用同步复位,这加剧了人们的困惑。 仅使用同步复位可以在 Altera 和 Xilinx 上很好地工作,因为它们都是基于 SRAM 的 FPGA 架构,所以上电故障永远不会成为问题。

但如果您想让您的设计可移植到其他架构,例如 ASIC 或闪存 FPGA,那么异步复位可能是更好的默认选择。

关于您关于异步重置引起的亚稳态的问题。那是正确的。完全异步的复位信号会导致亚稳态。 这就是为什么您必须始终同步低电平有效异步复位信号的上升沿。 只有复位的下降沿可以完全异步。

仅同步上升沿由两个触发器完成。

锁存器:不,您几乎不需要采用时钟设计的锁存器。 好的做法是让 DRC 在找到锁存器时触发错误。

【讨论】: