Forum: FPGA, VHDL & Co. verständnisfrage process vhdl


von marco m. (jambaleija)


Lesenswert?

hallo
hätte da mal eine anfängerfrage zu folgenden kleinen programmausschnitt

process (run, takt) begin
if run = '0' and rising_edge (takt) then ...


nehmen wir an das run signal hätte seinen wert von 1 auf 0 gewechselt 
daraufhin startete der prozess und bewertet den ersten teil der if 
abfrage mit true was passiert dann bei der zweiten bedingung wenn zu dem 
zeitpunkt zu dem run von 1 auf 0 gewechselt hatte und der process 
deswegen gestartet ist der takt keine änderung aufgewiesen hätte

wird dann

a) die zweite bedingung mit false bewertet und der gesamte process 
bricht ab
also mit anderen worten die if bedingung kann nur true werden wenn run 
von 1 auch 0 wechselt und gleichzeitig auch der takt eine ansteigende 
taktflanke besitzt

oder

b) wird bei der if bedingung einfach so lange gewartet bis der takt eine 
ansteigende flanke aufweist und dann weiter gemacht

von dito (Gast)


Lesenswert?

marco meier schrieb:
> a) die zweite bedingung mit false bewertet und der gesamte process
> bricht ab

Sofern es keinen else-Zweig gibt oder außerhalb der if-Abfrage keine 
Anweisungen stehen, ja!

> also mit anderen worten die if bedingung kann nur true werden wenn run
> von 1 auch 0 wechselt und gleichzeitig auch der takt eine ansteigende
> taktflanke besitzt

Nicht ganz: Der if-Zweig wird ausgeführt, wenn zum Zeitpunkt der 
steigenden Taktflanke von 'takt' der Wert (Pegel) von 'run' gleich Null 
ist.

Das was du geschrieben ist, ist aber nicht synthesefähig. Richtig müsste 
es heißen:
1
process (takt) begin
2
  if rising_edge (takt) then 
3
    if run = '0' then
4
       ...

Beachte: 'run' entfällt in der Sensitivliste, da ja alles auf 'takt' 
synchronisiert ist.

von Bernd S. (Gast)


Lesenswert?

ich stimme dem Vorposter zu.

Die Sensitivity-List ist nur für Simulationszwecke wichtig, d.h. hier 
startet evtl. ein Prozess wenn sich was in der Sensitivity-List ändert.

Für Hardware usw. gibt es nach der Synthese nur noch Hardware, hier 
starten keine Prozesse. Um nachzuvollziehen was in Hardware passiert 
muss man sich entweder das Ergebnis ansehen, oder noch besser den 
VHDL-Code so schreiben dass er das ausdrückt was man in HW haben möchte.

von marco m. (jambaleija)


Lesenswert?

ach so dann bestimmt der ausdruck "rising_edge (takt)" nur den zeitpunkt 
zu dem run abgefragt wird und weil takt periodisch auftritt erfolgt auch 
die abfrage in festen zeiten zueinander

der quellcode müsste allerdings schon synthesefähig sein
stammt aus einer praktikumsanleitung meines professors und wurde bereits 
getestet

vollständiger quellcode
funktion: erzeugung einer zufallszahl

process (run, takt) begin
if run = '0' and rising_edge (takt) then
z <= z(12 downto 1) & (z(13) xnor z(12) xnor z(11) xnor z(8));
end if;
end process;



ist es eigentlich auch möglich einen std_logic_vector als zähler zu 
verwenden

variable Zaehler:std_logic_vector(3 downto 0)

und dann in einem process

Zaehler=Zaehler+`1`;
zu schreiben und damit den Zaehlerstand bei jedem durchlauf zu erhöhen
um am ende eine abfrage zu machen wie: if Zaehler >= "1000" then ...

danke schon mal für die bisherigen antworten

von Christian R. (supachris)


Lesenswert?

marco meier schrieb:
> ist es eigentlich auch möglich einen std_logic_vector als zähler zu
> verwenden

Theoretisch ja. Aber man rechnet in VHDL am besten mit unsigned und 
signed Signalen, oder bei einem Zähler am besten mit integer:
http://www.mikrocontroller.net/articles/Rechnen_in_VHDL

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

marco meier schrieb:
> variable Zaehler:std_logic_vector(3 downto 0)
Eine Variable? Wofür?
Das ist für einen Anfänger ein unnötiges No-Go!
Siehe den Beitrag "Variable vs Signal"

> ist es eigentlich auch möglich einen std_logic_vector als zähler zu
> verwenden
> variable Zaehler:std_logic_vector(3 downto 0)
> und dann in einem process
> Zaehler=Zaehler+`1`;
Man rechnet nicht mit uneingeschränkten Vektoren!
Mehr dazu im Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

> a) die zweite bedingung mit false bewertet und der gesamte process
>    bricht ab
Und fängt an zu rauchen und qualmen?
Im FPGA ist ein Prozess immer da. Es ist reale existierende Hardware, 
da kann nichts abbrechen. Du hast noch eine sehr softwarelastige 
Denkweise, das wird dir noch weitere Probleme bringen...
Als Tipp: sieh dir ab und zu mal den RTL-Schaltplan deiner 
Beschreibungen an. Dann bekommst du ein "Gefühl" für Hardware und 
Hardwarebeschreibung.

dito schrieb:
> Das was du geschrieben ist, ist aber nicht synthesefähig.
Mit ISE (und vermutlich auch anderen Synthesizern) ist es das. Es ist 
nur eine absolut unübliche Schreibweise eine Clock-Enables...
http://www.lothar-miller.de/s9y/archives/1-Clock-Enable-in-einer-ISE-VHDL-Beschreibung.html

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.