【问题标题】:Simple oscillator in VHDLVHDL 中的简单振荡器
【发布时间】:2018-04-17 03:09:43
【问题描述】:

我刚开始使用 VHDL,但在理解流程的具体运作方式时遇到了问题。这是一个简单振荡器的示例:

timer_1Hz: process(clk) is
    variable timer : integer := 0;
    constant period : integer := 50E6;
begin
--if rising_edge(clk) then
    timer := (timer+1) rem period;
    if (timer=0) then
        led <= not led;
    end if;
--end if;
end process timer_1Hz;

clk 是一个输入(时钟)信号,频率为 50 MHz,占空比为 50%。

现在,据我所知,timer_1Hz 信号的任何变化都会触发进程timer_1Hz,无论是从01,还是从1 到@987654327 @。

我希望从上面的示例中以0.5 Hz 的频率闪烁 LED,因为 rising_edge 测试已被注释掉。换句话说,我预计主体将在一个时钟周期内被触发两次,分别在上升沿和下降沿。但是,这似乎不起作用,即 LED 永远不会打开。

如果我包含 rising_edge 测试,LED 会以 1 Hz 的频率闪烁,正如我所期望的那样。

谁能解释一下我在意外情况下遗漏了什么。

【问题讨论】:

  • Fpga 寄存器不能在上升沿和下降沿触发。你只需要使用一个边缘。

标签: process vhdl fpga clock


【解决方案1】:

如果没有您删除的上升沿部分,代码将无法工作。它可能在模拟中工作,但不能在真正的 fpga 板上工作。为什么?因为敏感度列表(大部分)对模拟很重要,而对合成则没有(那么重要)。

出于综合目的,您必须始终考虑要实现的硬件。实际上,当某些事件发生时,进程不会“运行”。

如果你真的想要 0.5 Hz 输出,只需使用 25E6 而不是 50E6 与原始代码..

【讨论】:

  • 为了完成 - 用于实施该项目的注册器通常只对一个时钟沿敏感。有时你可以选择哪一个,有时你必须坚持一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多