我必须在输入按钮等待的过程中创建一个20毫秒的延迟。
我写了下面的代码并且它给出了一个错误
wait until clk'EVENT and clk='1';
wait for 20 ms;
或者,我可以使用如下构造:
wait for 20 ms until clk'EVENT and clk='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>
,其中event
和time
都是可选的。例如:
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毫秒的按钮,它必须是检测按钮变化和计数时钟的组合。