Hallo mchii
Du hast noch ein paar Probleme in dem Verständnis, was der unterschied
zwischen Software und Hardwarebeschreibung ist. Versuche Dich von dem
Gedanken zu lösen, dass du Hardware programmierst.
Um ein Signal stabil in einem Zustand zu halten bedarf es ein
Speicherelement. Dies sollte im FPGA (oder CPLD) immer ein FlipFlop
sein. Ein Latch ist immer zu vermeiden.
Um ein FF zu beschreiben bedarf es (für den Anfänger) immer ein Prozess
mit einem Takt. Dein folgender Ansatz
1 | process(flag)
|
2 | begin
|
3 | if rising_edge(flag) then
|
4 | takt <= not takt;
|
5 | end if;
|
6 | end process;
|
ist daher nicht verkehrt. Das Signal Takt invertiert sich immer wenn das
Singal flag eine steigende Flanke hat.
Allerdings stellt das Signal flag hier das Problem dar:
1 | flag <= '1' when r_reg=(2**N-1) else '0';
|
Warum: Was hier beschrieben ist ist eine sogenannte beiläufige
Anweisung. Es entsteht hier eine Schaltungslogik die aus den
Grundgattern (UND, ODER, NAND...) zusammengebaut ist. Wenn sich nun ein
oder mehrere Signale am Eingang dieser Gatterkombination (also ein bit
aus r_reg) ändert, dann hat das zur Folge dass sich ev. das Signal flag
ändert. Wenn Du aber pech hast, dann ändert wegen der Laufzeiten auf den
Leitungen (Signal) und den Durchlaufzeiten in den Gattern dein
flag-Signal für einen kurzen Moment obwohl es sich aus Deiner Logik
nicht ändern sollte. Dies nennt man Glitch.
Als Feste Regel sollte daher sein, dass ein Takt immer nur exakt eine
Quelle haben sollte. Das flag-Signal von Dir wir ja als Takt verwendet.
Um das ganze trotzdem korrekt zu lösen, könntest Du folgendes tun:
1 | process(clk)
|
2 | begin
|
3 | if rising_edge(clk) then
|
4 | if r_reg=(2**N-1) then
|
5 | takt <= not takt;
|
6 | end if;
|
7 | end if;
|
8 | end process;
|
Was hier entsteht ist ein FF dessen Ausgang invertiert auf den Eingang
zurück geführt wird. Die Verknüfung r_reg=(2**N-1) ergibt dann ein
Signal das an den Enable Eingang des FF geführt wird.