Process VHDL中的简单振荡器

Process VHDL中的简单振荡器,process,vhdl,fpga,clock,Process,Vhdl,Fpga,Clock,我刚开始使用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

我刚开始使用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%

现在,据我所知,当clk信号发生任何变化时,无论是从0到1的转换,还是从1到0的转换,都会触发进程计时器_1Hz

从上面的例子中,我希望LED以0.5 Hz的频率闪烁,因为上升沿测试被注释掉了。换句话说,我预计身体在一个时钟周期内会被触发两次,一次上升,一次下降。然而,这似乎不起作用,也就是说,LED从不打开

如果我包括上升沿测试,LED会以1 Hz的频率闪烁,正如我预期的那样


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

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

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


如果您真的想要0.5赫兹的输出,只需使用25E6而不是原始代码中的50E6

Fpga寄存器不能在上升沿和下降沿上触发。您只需要使用一个边缘。对于完成,用于实现此项目的寄存器通常只对一个时钟边缘敏感。有时候你可以选择哪一个,有时候你必须坚持一个。