顺序与组合逻辑(Verilog和VHDL)

时间:2014-03-12 15:14:07

标签: vhdl verilog hdl

在Verilog中,以下Code-1和Code-2是否相同是真的:

代码1

always@(posedge Clock or B or C) 
 begin
   if (B)
    A <= 0;
   else if (C)
    A <= 1; 
 end 

代码2

 always@(posedge Clock or B or C) 
 begin
   if (B)
    A <= 0;
   else if (C)
    A <= 1; 
   else
    A <= A;
 end 

在VHDL中也是如此吗?

Code-3

process (clk, preset, reset) 
 begin  
  if (preset = ‘1’) then 
   ff <= ‘1’; 
  elsif (reset = ‘1’) then 
   ff <= ‘0’; 
  elsif (clk=’1’ and clk’event) then 
   ff <= ff_d; 
 endif; 
end process

Code-4

process (clk, preset, reset) 
 begin  
  if (preset = ‘1’) then 
   ff <= ‘1’; 
  elsif (reset = ‘1’) then 
   ff <= ‘0’; 
  elsif (clk=’1’ and clk’event) then 
   ff <= ff_d;
  else
   ff <= ff; 
 endif; 
end process

我们还能说Code-3和Code-4是一样的吗?

关于组合逻辑的同样的事情怎么样?我们可以说以下是等价的(Verilog例子)吗?

代码-5

  always @ ( * ) begin
    if ( Trigger ) begin
      A = Pass ;
    end
  end

代码-6

  always @ ( * ) begin
    if ( Trigger ) begin
      A = Pass ;
    end
    else begin 
     A = A;
    end
  end

我们还能说Code-5和Code-6是一样的吗? ˚F

2 个答案:

答案 0 :(得分:3)

  1. Code-1和Code-2是相同的,但是很乱。
  2. Brian Drummond回答说Code-3和Code-4是相同的。
  3. Code-5和Code-6相同,都包含相同的错误
  4. 代码1和代码2 更新基于Gregs的评论
    always@(posedge Clock or B or C)的使用很混乱,因为它结合了边缘触发和水平触发。

    您可能需要一个组合块always @**会为您提供一个自动编译的敏感列表(更少的错误,更容易重构)。在学习的同时,有时会有目的地给出一个不完整的敏感性列表以获得您想要的模拟行为,不要为RTL执行此操作。合成后,您将获得always @*的行为。

    暗示顺序或触发器使用边缘触发即

    // Flip-flop sync or no reset
    always @(posedge clk) begin 
    
    //Flip-flop with async active-low reset.
    always @(posedge clk or negedge rst_n) begin
    
    //Flip-flop with asyn active-low reset and async set
    always @(posedge clk or negedge rst_n or posedge set) begin
    

    正如格雷格至少从2001年注意到的那样,逗号,可以使用分隔列表代替or

    Code-5和Code-6 意味着组合块,它维持状态这意味着锁存。

    闩锁本身并不是很糟糕,但需要小心谨慎,因此偶然的闩锁通常会引起关注和许多错误。

    触发器是一个接一个地具有时钟反转的两个锁存器。这意味着2个锁存器中只有1个在给定点处打开。启用时,单个锁存器是透明的。

    如果闩锁打开并在更新数据(时钟的位置)附近关闭,则时序不确定性意味着您可以锁存旧数据或新数据。

    控制此操作的典型方法是在时钟的前半部分打开闩锁并在下半部分将其关闭。这可确保Latch在更新输入时保持输出值。通常使用完整周期使能操作时钟门以产生锁存器的使能信号。

答案 1 :(得分:0)

您的问题的基本答案适用于VHDL和Verilog。如果您通过“进程”跟踪每条可能的路径(并且所有内容基本上分解为'进程',在VHDL和Verilog中),并且未在一个或多个路径中分配“信号”,则该信号保持其值在那些道路上。它必须,因为你没有分配给它。如果你明确添加一个“将信号分配给自己”的赋值,它没有任何区别,因为这与完全不分配信号相同(假设你的代码对delta延迟不敏感,你没有做过手动指定延迟的任何事情,等等)。如果将该过程解释为时钟或组合,则没有任何区别。

其中一条评论指的是一个SO线程,其中有人建议明确分配的表单可以合成门控时钟而不是门控数据实现。我不买这个,我想看一个例子。

说了这么多,你需要坚持使用传统的合成模板来获得你知道会按照预期合成的东西,而不仅仅是正确模拟。另请注意,您的片段#1和#2没用,并且不等同于#3 /#4 - 没有数据输入。只要您的工具流可以应对它们(即对它们进行时序分析),锁存器就没有问题。而且您不需要VHDL中的alhe括号,使用rising_edge