【问题标题】:VHDL If StatementsVHDL If 语句
【发布时间】:2012-05-20 07:48:35
【问题描述】:

如果您有这样的流程,例如:

process (clk)
if (var = '1') then
   var2 = '1';
end if;

if (var2 = '1') then
   //do something
end if;
end process;

第二个 if 语句会在下一个时钟周期执行,还是会在 var2 = '1' 执行后立即执行?

下面的代码会和上面的代码完全一样吗?

process (clk)
if (var = '1') then
   var2 = '1';
end if;
end process;

process (var2)
if (var2 = '1') then
   //do something
end if;
end process;

如果有人能解释时间问题,那就太好了。

【问题讨论】:

    标签: if-statement vhdl


    【解决方案1】:

    如果您的vars 是变量,那么您不能明智地选择第二个选项,因为您不能跨进程使用变量(在大多数情况下,请参见下文)。如果它们实际上是信号,那么可以。

    在第一个代码中 - 如果它们是变量,那么是的,它们将立即更新并且代码的第二部分将运行。

    如果它们是信号,则第二个 if 块将仅在下一次运行,因为信号仅在写入它们的进程结束时更新。

    第二个示例代码将在第一个运行后的下一个“增量周期”中运行第二个进程,因为它对 var2 上的更改很敏感。


    可以在进程之间使用变量,但必须将它们指定为shared variables。如果你用“直接”的着色变量来做这件事,你会冒着可怕的类似 Verilog 的竞争条件的风险,因为读取和更新的顺序是不确定的。

    您应该将它们设为protected type,它有点类似于 OO,并且具有对值进行操作的方法,允许跨多个进程进行原子访问。

    【讨论】:

      【解决方案2】:

      在您的第一段代码中 - 由于var2 是一个变量,它会立即获得新值。因此if 语句将看到新值,而//do something 将在同一时间片内发生。

      (// cmets?真的吗?这是VHDL。我们用--)

      您的第二段代码不起作用。变量的作用域是进程,不能用于在进程之间传递值。您必须使用信号,因此规则会发生变化。考虑这段代码:

      signal sig  : std_logic := 1;
      signal sig2 : std_logic := 0;
      
      process (clk)
        if (sig = '1') then
          sig2 <= '1';
        end if;
      
        if (sig2 = '1') then
          -- do something
        end if;
      end process;
      
      process (sig2)
        if (sig2 = '1') then
          -- do something else
        end if;
      end process;
      

      初始条件:sig1sig20,所以我们只是在等待 clk 边缘。

      当时钟沿到达时,我们进入第一个进程,我们看到sig1,并将1 分配给sig2。到目前为止一切都很简单,但是因为sig2 是一个信号,所以在进程完成之前不会发生分配。这意味着当我们在下一行比较sig21 时,它会是假的(sig2 现在仍然是0),我们不会-- do something。然后我们结束这个过程。

      现在,因为在第一个进程结束时sig2 改变了值0 -&gt; 1 将触发第二个进程(它对sig2 敏感)。它看到sig21,所以它会-- do something else

      当下一个时钟沿到来时(此代码可能是下降沿),sig2 仍然是 1,所以现在我们将 -- do something,我们将为每个时钟沿执行此操作.

      总的来说,这段代码的事件顺序是:

      Clk  : 0->1
      Sig2 : 0->1
      -- Do Something Else
      Clk  : 1->0
      -- Do Something
      Clk  : 0->1
      -- Do Something
      Clk  : 1->0
      -- Do Something
      Clk  : 0->1
      -- Do Something
      .........
      

      当您了解该排序后,您将了解 VHDL 如何安排事物的重要部分。

      【讨论】:

      • 您好,谢谢您的回答,我明白了。但是由于 sig
      • 你是对的。它将不断被分配1,但由于这与当前值没有变化,因此不会导致第二个进程重新评估。我只列出了会导致某些事情发生的任务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多