我们可以在VHDL中的单个进程中使用两个等待语句吗?

时间:2016-04-25 04:22:21

标签: vhdl delay wait

我必须在输入按钮等待的过程中创建一个20毫秒的延迟。

我写了下面的代码并且它给出了一个错误

wait until clk'EVENT and clk='1';
wait for 20 ms;

或者,我可以使用如下构造:

wait for 20 ms until clk'EVENT and clk='1';

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以等待某个事件,时间或两者(或两者都没有 - 但这是一个独特的案例)。

现在,我不太清楚为什么你的第一个例子会出错,因为它是一个有效的顺序语句。但是您没有提供完整的示例,也没有提供错误代码。所以,我在这里的答案非常基本。

首先,wait语句只能作为顺序语句出现,本质上只表示process(或从process调用)。所以,如果你试图同时使用它,这是一个问题。

现在,如果您从process使用它,它必须位于没有敏感列表的process中。也就是说,以下是非法的:

process(clk)
begin
  wait until clk'EVENT and clk='1';
end process;

它必须是一个裸流程,例如:

process
begin
  wait until clk'EVENT and clk='1';
end process;

您的第一个示例(正确放置在顺序上下文中并进行编译)的更多内容:

process
begin
  wait until clk'EVENT and clk='1';
  wait for 20 ms;
end process;

此代码等待clk上升沿,然后等待20ms。这些是按顺序执行的(因此是一个过程中的顺序上下文)。

你的第二个声明需要调整才能编译。通常,wait语句的格式为wait until <event> for <time>,其中eventtime都是可选的。例如:

process
begin
  wait;  -- No event, no time.  Wait forever.

  wait until clk'event and clk='1'; -- Wait forever for a rising edge on 'clk'

  wait for 20 ms; -- Wait for 20 ms

  wait until clk'event and clk='1' for 20 ms; --Wait for up to 20 ms for a rising edge on 'clk'
end process;

所以,你的第二个例子的顺序是事件和时间的顺序。

最后,您的介绍性文字表明您正在等待20毫秒的按钮。这暗示您正在尝试创建真正的逻辑。 wait语句只能在非常有限的用例中合成。其中一个特别排除的案例是等待一段时间。如果需要等待20 ms,则需要以其他方式进行(例如计数时钟)。如果你想要等待最多20毫秒的按钮,它必须是检测按钮变化和计数时钟的组合。