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.