Hi.
Ich habe ein seltsames Problem:
process(clock, reset)
begin
if reset = '1' then
foo;
elsif rising_edge(clock) then
foo;
end if;
end process;
das funktioniert nicht,
process(clock, reset)
begin
foo;
end process;
geht. Eine Sache ist dass die clock erst kommt,
wenn reset = '0' ist. Aber das dürfte doch nichts
machen oder? Es werden immer die gleichen "Zuweisungen"
gemacht, egal welcher "Pfad" durch den Prozess genommen
wird. Und wenn keine Zuweisung geschieht, behalten
die Signale ihren Wert bei oder? Oder werden die dann
undefined?
(Das echte Beispiel ist etwas Umfangreich und in
ein noch groesseres Projekt eingebettet, schwer
zu extrahieren.)
Hat vielleicht trotzdem jemand ne Idee an was sowas
liegen könnte?
Grüße
Ich verwende anstatt rising_edge immer folgendes:
process(clock, reset)
begin
if reset = '1' then
foo1;
elsif clock = '1' and clock'event then
foo2;
end if;
end process;
Bisher hatte ich damit noch nie Probleme.
Zitat: "Eine Sache ist dass die clock erst kommt, wenn reset = '0' ist."
Was meinst Du damit? Du hast mit dem Prozess ein FlipFlop mit
asynchronem Reset programmiert. Somit wird foo1 sofort bei einem Reset
ausgeführt und so lange, bis der Reset wieder weg ist. Erst danach
interessiert der Takt.
Wenn keine Zuweisung (z.B. reset = '0' and clock = '0') erfolgt, dann
bleiben die Signale so, wie sie sind.
>(Das echte Beispiel ist etwas Umfangreich und in >ein noch groesseres Projekt eingebettet, schwer >zu extrahieren.) Erkenntnisgewinn ist meist mit Arbeit verbunden!
"Funktioniert nicht" ist bißchen zu wenig Information um zu wissen woran etwas liegt. Deine zweite Möglichkeit mag in der Simulation gehen, ist aber praktisch nicht verwendbar. Dort wird der Block nämlich immer ausgeführt, wenn reset oder clock sich ändert, also bei jeder Flanke (was bei deinem reset nicht gewollt ist und beim clock nicht geht).
Ich formuliers nochmal anders:
Wenn sowas hab:
process(clock, reset)
begin
if reset = '1' then
foo1;
elsif clock = '1' and clock'event then
foo2;
end if;
end process;
und Clock ist immer 0, der Reset
ist am Anfang 1 und geht irgendwann auf 0.
Bleiben dann die Zuweisungen von foo1
"fuer immer" erhalten?
und Clock ist immer 0, der Reset ist am Anfang 1 und geht irgendwann auf 0. Bleiben dann die Zuweisungen von foo1 "fuer immer" erhalten? --> Richtig, du hast ein Latch gebastelt.
>Ich formuliers nochmal anders: Also ich als VHDL/FPGA-Anfänger hätte folgendes erwartet: process(clock, reset) wird ja nur dann ausgeführt, wenn sich clock oder reset ändert. Wenn Du sagst " clock konstant 0, reset anfangs 1 später 0": Der process wird einmalig ausgeführt beim Übergang reset 1=>0. Dann hat reset im process aber den Wert 0, die Anweisung if reset = '1' then foo1; sollte nicht ausgeführt werden. Mein Fazit wäre: process hat überhaupt keine Wirkung, solange keine weiteren Signaländerungen auftreten. Aber wie gesagt, das ist eine Anfängeransicht. Gruß Stefan Salewski PS: Ist if clock = '1' and clock'event then und if clock'event and clock = '1' then eigentlich identisch? Im Buch von Pedroni habe ich stets die zweite Form gesehen, aber man sollte wohl wegen der besseren Lesbarkeit (und Klarheit) eh besser if rising_edge(clock) verwenden?
@ Schlumpf >>und Clock ist immer 0, der Reset >>ist am Anfang 1 und geht irgendwann auf 0. >>Bleiben dann die Zuweisungen von foo1 >>"fuer immer" erhalten? Ja >--> Richtig, du hast ein Latch gebastelt. NEIN! Es ist ein flankengesteuertes FlipFlop! Das ist ein Riesenunterschied! @ Stefan Salewski (Gast) >>Ich formuliers nochmal anders: >Also ich als VHDL/FPGA-Anfänger hätte folgendes erwartet: >process(clock, reset) wird ja nur dann ausgeführt, wenn sich clock oder >reset ändert. Wenn Du sagst " clock konstant 0, reset anfangs 1 später Genau. >0": >Der process wird einmalig ausgeführt beim Übergang reset 1=>0. >Dann hat reset im process aber den Wert 0, die Anweisung >if reset = '1' then foo1; >sollte nicht ausgeführt werden. Nicht MEHR! Vorher wurde sie ausgeführt und das FlipFlop asynchron auf den Resetwert gesetzt. Solange Reset aktiv ist kann der Takt machen was er will, RESET hat Priorität. Erst wenn er inaktiv ist ('0') hat der Takt eine Chance. >PS: Ist >if clock = '1' and clock'event then >und >if clock'event and clock = '1' then >eigentlich identisch? Ja. >Im Buch von Pedroni habe ich stets die zweite Form gesehen, aber man >sollte wohl wegen der besseren Lesbarkeit (und Klarheit) eh besser >if rising_edge(clock) >verwenden? Tu das. Mfg Falk
@ Falk: Okay, anders formuliert: Ein Flankengesteuertes FF, an dem nie ne Flanke anliegt. Und daher nur der Reset ausgeführt wird.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.