VHDL 中的简单振荡器
Simple oscillator in VHDL
我刚开始使用 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
将在 clk
信号发生任何变化时触发,无论是从 0
到 [=14= 的过渡],或从 1
到 0
。
由于 rising_edge
测试被注释掉了,我希望从上面的示例中以 0.5 Hz
的频率闪烁 LED。换句话说,我预计主体将在一个时钟周期内在上升沿和下降沿触发两次。然而,这似乎不起作用,即 LED 永远不会打开。
如果我包括 rising_edge
测试,LED 将以 1 Hz 的频率闪烁,正如我预期的那样。
谁能解释一下我在意外情况下遗漏了什么。
如果您删除了上升沿部分,代码将无法运行。它可能适用于模拟,但不适用于真正的 fpga 板。为什么?因为灵敏度列表(主要)对模拟很重要,而不是(那么重要)对合成。
出于综合目的,您必须始终考虑要实现的硬件。在实际意义上,当某些事件发生时,进程不是 "run"。
如果你真的想要 0.5 Hz 输出,只需使用 25E6 而不是原始代码的 50E6..
我刚开始使用 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
将在 clk
信号发生任何变化时触发,无论是从 0
到 [=14= 的过渡],或从 1
到 0
。
由于 rising_edge
测试被注释掉了,我希望从上面的示例中以 0.5 Hz
的频率闪烁 LED。换句话说,我预计主体将在一个时钟周期内在上升沿和下降沿触发两次。然而,这似乎不起作用,即 LED 永远不会打开。
如果我包括 rising_edge
测试,LED 将以 1 Hz 的频率闪烁,正如我预期的那样。
谁能解释一下我在意外情况下遗漏了什么。
如果您删除了上升沿部分,代码将无法运行。它可能适用于模拟,但不适用于真正的 fpga 板。为什么?因为灵敏度列表(主要)对模拟很重要,而不是(那么重要)对合成。
出于综合目的,您必须始终考虑要实现的硬件。在实际意义上,当某些事件发生时,进程不是 "run"。
如果你真的想要 0.5 Hz 输出,只需使用 25E6 而不是原始代码的 50E6..