mikrocontroller.net

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


Autor: asdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Salewski (Gast)
Datum:

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

Erkenntnisgewinn ist meist mit Arbeit verbunden!

Autor: adpat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: asdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk:

Okay, anders formuliert: Ein Flankengesteuertes FF, an dem nie ne Flanke 
anliegt. Und daher nur der Reset ausgeführt wird.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.