代码之家  ›  专栏  ›  技术社区  ›  Marsh Ray

为什么verilog教程通常使reset异步?

  •  1
  • Marsh Ray  · 技术社区  · 6 年前

    这个问题是在现场可编程门阵列合成的背景下,如果这有什么不同的话。数据表(ICE40UP)指出,每个逻辑单元都有一个具有异步复位和时钟启用输入的D型触发器。

    许多verilog教程介绍顺序逻辑,其中包括:

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

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

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

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

    我在维基百科上看到 scary statements like “如果系统依赖于任何连续输入,那么它们很可能容易受到亚稳态的影响。[…]如果仲裁者或触发器的输入几乎同时到达,电路很可能会穿过亚稳定点。”

    冒着因为我的问题形式不好而被关闭的风险…我错过了什么?

    • 在设计中使用闩锁是否会使其异步?如何确保在存在由时钟域以外的对象驱动的锁存器的情况下观察到正确的定时?

    • 什么时候会有人真正想要一个锁在一个时钟设计?为什么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?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Timmy Brolin    6 年前

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

    如果您的设计包含缺乏重置功能的寄存器,例如ram块,那么在向ram提供adr、数据和控制信号的寄存器上使用异步重置可能会在重置发生时导致ram内容损坏。因此,如果您需要在必须保留ram内容的地方进行热重置:对最接近ram的逻辑使用同步热重置。

    Altera和Xilinx建议他们的客户只使用同步复位,这增加了混乱。 由于altera和xilinx都是基于sram的fpga架构,因此仅使用同步复位就可以很好地工作,因此通电故障从来就不是问题。

    但如果你想让你的设计移植到其他架构,如asic或flash fpgas,那么异步重置可能是更好的默认选择。

    关于异步重置引起的元稳定性的问题。没错。完全异步复位信号可导致亚稳态。 这就是为什么您必须始终同步活动低异步复位信号的上升沿。 只有复位的下降沿可以完全异步。

    两个触发器只同步上升沿。

    闩锁:不,你几乎永远不希望闩锁在一个时钟设计。 好的做法是让刚果民主共和国在发现锁存时触发一个错误。