Forum: FPGA, VHDL & Co. VHDL Anfänger


von asdf (Gast)


Lesenswert?

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

von Michael F. (Gast)


Lesenswert?

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.

von Stefan Salewski (Gast)


Lesenswert?

>(Das echte Beispiel ist etwas Umfangreich und in
>ein noch groesseres Projekt eingebettet, schwer
>zu extrahieren.)

Erkenntnisgewinn ist meist mit Arbeit verbunden!

von adpat (Gast)


Lesenswert?

"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).

von asdf (Gast)


Lesenswert?

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?

von Schlumpf (Gast)


Lesenswert?

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.

von Stefan Salewski (Gast)


Lesenswert?

>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?

von Falk (Gast)


Lesenswert?

@ 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

von Schlumpf (Gast)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.