闩锁是否会在Verilog中以顺序逻辑发生

时间:2018-08-01 05:03:04

标签: verilog

这是一个基本问题,但似乎对我缺乏明确的解释。

在许多代码示例中,一种写FSM输出的样式是

assign a = (current_state==DONE)?1:0;

我将此与闩锁的定义混淆了。如果current_state!= DONE,此组合逻辑是否会推断锁存器为“ a”保持其先前值?我的编译器似乎没有警告。

有时候,我会

always@(posedge clk)
begin
if(reset)
  a<= 1'b0;
else
  if(current_state == DONE)
    a <=1'b1;
end

这肯定是一个顺序逻辑(我的输出不取决于我过去的输入链),并且a会保持其先前的值直到我的控制信号current_state == DONE。我猜想这个逻辑将合成为一个多路复用器以触发器的输入。

因此,如果在第二种情况下,我实际上有一个时钟控制的FSM,则我会将具有FSM状态的多路复用器输出为选择信号输入。 到现在为止,我能说什么不是组合逻辑的东西都不会产生锁存器吗?

但是,当我具有如下结构时,

always@(posedge DCO or posedge reset or posedge enable)
begin
    if(reset)
    begin


    end

    else if(enable)
    begin           

    end 
    else 
    begin
    end
end

我在我的FPGA中收到一条警告,提示我已推断出启用了控制信号的锁存器。

为什么?

例如,我的启用更改基于另一个状态机

assign enable = (pcurrent_state == START)?1:0;

此外,我们有无意闩锁和有意闩锁。但是设计规则基本上说避免闩锁以避免时序拱门。有人可以提供一些示例,说明在设计中应在何处使用故意闩锁,而不是时钟门控示例吗?

加上

  

在任何给定时间,电路中所有存储元件(触发器)的输出(它们包含的二进制数据)都称为电路状态。同步电路的状态仅在时钟脉冲上改变。在每个周期,下一个状态由当前状态和时钟脉冲发生时输入信号的值确定。(来自https://en.wikipedia.org/wiki/Sequential_logic

这听起来像是在向我描述一台功能强大的机器,而不是典型的顺序逻辑。我最简单的顺序逻辑不需要由current_state确定的输出更改

感谢您的帮助。我每天都在进行这种编码并阅读其定义,但似乎我很困惑,没有与他人讨论。

1 个答案:

答案 0 :(得分:1)

要部分回答您的问题:

给定的assign语句将不会推断出闩锁,因为a不会保留其值。如果为{{1},则为1,否则为current_state == DONE。因此,这是纯粹的组合逻辑。

第二个代码块实现了具有同步复位功能的触发器,并且如果0仅向1'b1加载,因此该代码中保留了代码。由于单个时钟的边沿敏感性,该代码不应生成锁存器。

由于服务器信号的敏感性,这在任何综合工具中都很难处理,这在硬件中并不常见。此外,如果说current_state == DONE被声明但在enable的上升沿出现时不是沿,则代码将使DC0的主体运行,从而模拟某种闩锁行为。综合工具通常允许在else if (enable)块的灵敏度列表中指定单个时钟和单个复位,以指示具有异步复位的触发器。尽管Verilog当然允许使用更复杂的敏感度列表,但其物理含义会很快变得复杂,从而推断出闩锁。在大多数设计中,您永远不需要这些复杂的灵敏度列表,然后再进入异步设计,因为大多数综合工具都不适合在行为层面上使用。 FPGA工具在异步元素方面尤其差劲,甚至锁存,因为必须将设计映射到的fpga中的逻辑单元是专门为使用触发器的同步设计而设计的;这就是fpgas的实现方式。

最后,在非fpga设计中,如果不需要边缘灵敏度,有时希望使用锁存器,因为锁存器实际上更小,在某些情况下可以使设计更小,更快和更省电。但是,您需要牢牢掌握正在设计的内容,并在这样做时了解潜在的折衷和时序要求。以下是闩锁是有用元素的示例:https://electronics.stackexchange.com/questions/255009/what-is-application-of-latch-in-vlsi-design