VHDL Anfänger

Gast #590018
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
Gast #590031
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.
Gast #590510
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).
Gast #590710
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?
Gast #590857
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?
Gast #591051
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren