【问题标题】:VHDL process for blinking led用于闪烁 LED 的 VHDL 流程
【发布时间】:2016-11-11 17:41:59
【问题描述】:

我想要一个让 LED 闪烁 3 次(每次灯应该亮一秒)并且亮灯之间的间隔应该是 1 秒的过程。

最快最简单的方法应该如下:

process(CLK)
begin
....
led <= '0';
led <= '1' after  1 sec,
 '0' after 1 sec,
 '1' after 1 sec,
 '0' after 1 sec,
 '1' after 1 sec,
 '0' after 1 sec;
....
end process;

通过编译它没有错误......但是时钟有自己的工作频率(例如1ns)。用 Modelsim 查询这段代码会报如下错误:

run
# Cannot continue because of fatal error.
# HDL call sequence:
# Stopped at C:/User...rm.vhd 50 Process line__41
# 

该行正好在 PROCESS(CLK) 行上。

我认为问题在于 CLK 具有更大的频率,所以在这种方式下一个进程在前一个完成之前开始(这让事情变得非常讨厌......)。

如果我写的是正确的,一个解决方案可以是使用时钟来获得请求的周期,但我想找到一个更快、更轻便的解决方案。

【问题讨论】:

  • 天哪。这只是为了模拟,还是合成到硬件中?
  • 它将用于合成到硬件中,因此我不能按照我的示例使用“之后”。

标签: vhdl modelsim


【解决方案1】:

正如您已经写过的,clk 比 1 秒快。在一个时钟周期(1ns)中,您尝试“等待”5-6 秒,具体取决于“... 1 秒后”行的数量。 你不应该这样做。如果你真的想要这么快的时钟,那么让一些计数器足够宽一秒钟。在 process(clk) 中,您递增此计数器并将计数器值与预定义值比较一秒钟,如果计数器值达到此值,则重置计数器并切换 LED。

如果你想要一些其他的“阶段”,比如 LED 应该闪烁 3 秒长,然后它不会再闪烁 3 秒长,那么你需要多个计数器。每个阶段都应该有一个计数器。

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多