为什么 verilog 教程通常将复位设为异步?
Why do verilog tutorials commonly make reset asynchronous?
如果这有什么不同的话,这个问题是在 FPGA 综合的上下文中。数据sheet (iCE40UP) 指出每个逻辑单元都有一个带异步复位和时钟使能输入的 D 型触发器。
许多 verilog 教程介绍时序逻辑,例如:
always @(posedge clk)
begin
some_reg <= [...]
end
我熟悉时钟逻辑,这对我来说很直观。
接下来介绍的概念通常是:
- 注意不要意外创建锁存器,因为您真正需要的是一个合适的寄存器。
always @(posedge clk or [pos|neg]edge reset)
always @(*)
我在维基百科上阅读了 scary statements like "if the system has a dependence on any continuous inputs then these are likely to be vulnerable to metastable states. [...] If the inputs to an arbiter or flip-flop arrive almost simultaneously, the circuit most likely will traverse a point of metastability."
冒着我的问题因格式不正确而被关闭的风险......我错过了什么?
异步复位是推荐的设计实践吗?不像对待任何其他输入一样对待重置并让它在下一个周期生效有什么好处?真实芯片的文档通常要求 RST* 引脚在许多时钟周期内保持低电平。
设计中的锁存器是否使其异步?我们如何确保在存在由时钟域外部驱动的锁存器的情况下观察到正确的时序?
什么时候会有人真正想要时钟设计中的锁存器?为什么 verilog 很容易不小心创建一个?
谢谢!
看似相关的问题:
-
-
同步与异步复位与 CPU 的大端与小端之争有一些相似之处。
在许多情况下,这两种类型都同样有效。
但在某些情况下,任何一种类型都比另一种类型具有优势。
在上电或断电等情况下,您可能没有有效的时钟,但您仍然需要重置才能使系统处于已知的被动状态,并避免危险的 I/O 故障。
只有异步复位可以做到这一点。
如果您的设计包含缺少复位功能的寄存器,例如 RAM 块,那么在向 RAM 提供 adr、数据和控制信号的寄存器上使用异步复位可能会在发生复位时导致 RAM 内容损坏。因此,如果您需要能够在必须保留 RAM 内容的地方执行热复位:对最接近 RAM 的逻辑使用同步热复位。
Altera 和 Xilinx 推荐他们的客户只使用同步复位,这加剧了混乱。
只使用同步复位可以在 Altera 和 Xilinx 上很好地工作,因为它们都是基于 SRAM 的 FPGA 架构,所以上电毛刺从来都不是问题。
但如果您想让您的设计可移植到其他架构,例如 ASIC 或闪存 FPGA,那么异步复位可能是更好的默认选择。
关于您关于异步复位引起的亚稳态的问题。那是对的。完全异步的复位信号会导致亚稳态。
这就是为什么您必须始终同步低电平有效异步复位信号的上升沿。
只有复位的下降沿可以完全异步。
仅同步上升沿由两个触发器完成。
锁存器:不,您几乎从不想在时钟设计中使用锁存器。
好的做法是让 DRC 在发现锁存器时触发错误。
如果这有什么不同的话,这个问题是在 FPGA 综合的上下文中。数据sheet (iCE40UP) 指出每个逻辑单元都有一个带异步复位和时钟使能输入的 D 型触发器。
许多 verilog 教程介绍时序逻辑,例如:
always @(posedge clk)
begin
some_reg <= [...]
end
我熟悉时钟逻辑,这对我来说很直观。
接下来介绍的概念通常是:
- 注意不要意外创建锁存器,因为您真正需要的是一个合适的寄存器。
always @(posedge clk or [pos|neg]edge reset)
always @(*)
我在维基百科上阅读了 scary statements like "if the system has a dependence on any continuous inputs then these are likely to be vulnerable to metastable states. [...] If the inputs to an arbiter or flip-flop arrive almost simultaneously, the circuit most likely will traverse a point of metastability."
冒着我的问题因格式不正确而被关闭的风险......我错过了什么?
异步复位是推荐的设计实践吗?不像对待任何其他输入一样对待重置并让它在下一个周期生效有什么好处?真实芯片的文档通常要求 RST* 引脚在许多时钟周期内保持低电平。
设计中的锁存器是否使其异步?我们如何确保在存在由时钟域外部驱动的锁存器的情况下观察到正确的时序?
什么时候会有人真正想要时钟设计中的锁存器?为什么 verilog 很容易不小心创建一个?
谢谢!
看似相关的问题:
-
同步与异步复位与 CPU 的大端与小端之争有一些相似之处。 在许多情况下,这两种类型都同样有效。 但在某些情况下,任何一种类型都比另一种类型具有优势。 在上电或断电等情况下,您可能没有有效的时钟,但您仍然需要重置才能使系统处于已知的被动状态,并避免危险的 I/O 故障。 只有异步复位可以做到这一点。
如果您的设计包含缺少复位功能的寄存器,例如 RAM 块,那么在向 RAM 提供 adr、数据和控制信号的寄存器上使用异步复位可能会在发生复位时导致 RAM 内容损坏。因此,如果您需要能够在必须保留 RAM 内容的地方执行热复位:对最接近 RAM 的逻辑使用同步热复位。
Altera 和 Xilinx 推荐他们的客户只使用同步复位,这加剧了混乱。 只使用同步复位可以在 Altera 和 Xilinx 上很好地工作,因为它们都是基于 SRAM 的 FPGA 架构,所以上电毛刺从来都不是问题。
但如果您想让您的设计可移植到其他架构,例如 ASIC 或闪存 FPGA,那么异步复位可能是更好的默认选择。
关于您关于异步复位引起的亚稳态的问题。那是对的。完全异步的复位信号会导致亚稳态。 这就是为什么您必须始终同步低电平有效异步复位信号的上升沿。 只有复位的下降沿可以完全异步。
仅同步上升沿由两个触发器完成。
锁存器:不,您几乎从不想在时钟设计中使用锁存器。 好的做法是让 DRC 在发现锁存器时触发错误。