Ich habe gerade mit VHDL begonnen, und ich habe ein Problem zu verstehen, wie genau Prozess funktioniert. Hier ist ein Beispiel eines einfachen Oszillators:Einfacher Oszillator in 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 ist ein Eingang (Takt) Signal mit 50 MHz Frequenz und Tastverhältnis von 50%.
Nun, wie ich es verstehe, wird der Prozess timer_1Hz
wird auf jede Änderung des clk
Signal ausgelöst werden, ob das ein Übergang 0
-1
sein, oder 1
-0
.
Ich erwartete von dem obigen Beispiel, LEDs mit einer Frequenz von 0.5 Hz
zu blinken, da der rising_edge
Test auskommentiert wurde. Mit anderen Worten, ich erwartete, dass der Körper zweimal in einer einzigen Taktperiode ausgelöst wird, bei einer steigenden und einer fallenden Flanke. Dies scheint jedoch nicht zu funktionieren, d. H. LEDs sind niemals eingeschaltet.
Wenn ich den rising_edge
Test einschließe, blinken LEDs mit einer Frequenz von 1 Hz, genau wie ich es erwartet hatte.
Kann mir bitte jemand erklären, was ich im unerwarteten Fall vermisse.
FPGA-Register können nicht sowohl auf steigende und fallende Flanke ausgelöst werden. Sie müssen nur eine Kante verwenden. – JHBonarius