Forum: FPGA, VHDL & Co. Was sind Prozesse und was meint man mit "sequenziell"


von Michael S. (decimad)


Lesenswert?

Gegrüßet seid ihr!
Mit diesem Posting feiere ich meinen Einstand in dieses Forum, 
hoffentlich hinterlasse ich nicht gleich einen schlechten Eindruck.

Ich beschäftige mich nun einige Tage mit meinem FPGA-Einsteigerboard und 
habe allerhand simples zustande gebracht, allerdings fische ich 
(natürlich?) noch ziemlich im Trüben. Als ich mich eingehender mit 
Prozessen im Internet beschäftigt habe, fand ich allerhand (für mich) 
widersprüchliche Information (Auch will mir das Wort "sequenziell" in 
diesem Zusammenhang nicht so sehr gefallen), was sie nun bedeuten. Daher 
versuche ich mal mit meinen Worten auszudrücken, was ich meine, das sie 
bedeuten und erhoffe mir von euch eine Bewertung.

Ich stelle mir im Moment einen getakteten Prozess umgesetzt in 
"Hardware" folgendermaßen vor:

- Ein kombinatorisches Netzwerk
- Umgeben von Eingangs- und Ausgangsspeicherelementen
- Ich sage jetzt mal, die Eingänge sind "links" und die Ausgänge 
"rechts"
- Das entsprechende kombinatorische Netzwerk einer Zeile aus dem 
Prozessquellcode wird "rechts" angepappt, wo es nötig ist, um 
Zwischenergebnisse entsprechend der Zeilenreihenfolge im Quelltext zu 
berücksichtigen.

Also um es auf den Punkt zu bringen: ein Prozess ist für mich auch nur 
ein kombinatorisches Netzwerk, bloß wird es für mich in geeigneter Weise 
generiert, dass ich mich nicht selbst um (beispielsweise) 
"Verkabelungen" über 20 Zeilen zu kümmern habe (um Zwischenergebnisse 
"heranzuholen").
Ein getakteter Prozess ist für mich ein solches Netzwerk umgeben von 
Speicherelementen, die die Eingangs- bzw. Ausgangssignale während einer 
Taktperiode konstant halten.

Liege ich mit meiner Vorstellung so richtig daneben?

Viele Grüße,
Michael

von enan (Gast)


Lesenswert?

Ganz falsch liegst du da nicht.
Allerdings würd ich es ein bisschen einfacher und kürzer zusammenfassen 
wir folgt:
Es gibt grundsätzlich zwei Arten von Statements:
- concurrent
- sequential
concurrent bedeutet grob gesagt dass alle Zuweisungen sofort stattfinden 
und wenn es mehrere sind dann alle gleichzeitig.
Bei Sequentiellen statements kommt ein clock Signal ins Spiel. Mit jedem 
Takt wird ein Schritt in deiner Hardware beschreibung durchgeführt. Dann 
der nächste Schritt und so alles schön nacheinander.
Hoffe ich konnte helfen und bin mit meiner Beschreibung nicht all zu 
weit weg von der Realität :-)

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


Lesenswert?

enan schrieb:
> Bei Sequentiellen statements kommt ein clock Signal ins Spiel.
Nein. Es kommt ein Prozess ins Spiel.
Und dieser Prozess wird "von oben nach unten" berechnet, und die letzte 
Zuweisung an ein Signal dann "sofort" durchgeführt.

Nehmen wir mal diese sequentielle Beschreibung:
1
  process (input) begin
2
     if (input=2) then 
3
        output <= 4;
4
     en if;
5
     
6
     if (input>3) then 
7
        output <= 2;
8
     en if;
9
10
     output <= 7;
11
  end process;
Hier wird, auch wenn input gleich 2 ist, niemals der Wert 4 am output zu 
sehen sein. Denn die letzte Zuweisung (7) gewinnt immer!
Der Synthesizer wird also keinen Vergleicher bauen, sondern output fest 
auf 7 verdrahten.

Wenn ich die Reihenfolge umdrehe, dann kommt ganz was anderes raus;
1
 
2
  process (input) begin
3
     output <= 7;
4
5
     if (input=2) then 
6
        output <= 4;
7
     en if;
8
     
9
     if (input>3) then 
10
        output <= 2;
11
     en if;
12
  end process;
Jetzt ist output nur noch 7, wenn keine andere Bedingung zutrifft.
Sequenziell also, weil die Reihenfolge (Sequenz) eine Rolle spielt.

Man könnte diese Beschreibung concurrent so ausführen:
1
 
2
        output <=  2 when input>=3  else 
3
                   4 when input=2   else 
4
                   7;
Kurz und knackig und die selbe Funktion.

enan schrieb:
> Hoffe ich konnte helfen und bin mit meiner Beschreibung nicht all zu
> weit weg von der Realität :-)
Was du beschrieben hast, ist eine Statemachine (FSM), wo der jetzige 
Zustand und Eingangssignale zum nächsten Zustand führen, der dann mit 
dem Takt übernommen wird...

von enan (Gast)


Lesenswert?

So ähnlich hatte ich das gemeint :-)
Am besten hörste auf Lothar, der kennt sich hier aus und is n dufter 
typ.

von Michael S. (decimad)


Lesenswert?

Hallo!
Vielen Dank euch beiden erstmal!

Lothar, wenn ich dir richtig Folge, dann ist ein process-Block also 
eigentlich "nur" eine Definition einer Kombinatorik mit einer gewissen 
Semantik (Eben dass auf die Ergebnisse aus den Ausdrücken der 
darüberliegenden Zeilen in den folgenden zurückgegriffen werden kann 
(Dass die Blöcke sozusagen "in Reihe" synthetisiert werden, wo es nötig 
ist))? Alles was der "Compiler" aus dem Process-Block macht, könnte man 
auch per Hand im "Concurrent"-Teil basteln, der nur mit Signalen 
hantiert?

Und auf mein Beispiel umgemünzt entnehme ich Deinen Ausführungen, dass 
die Speicherelemente, welche ich auf der "rechten Seite" des Prozesses 
(also hinter den letzten Blöcken der enstehenden Kombinatorik) 
vorgesehen hatte gar nicht existieren. Am Anfang sind sozusagen beim 
getakteten Prozess bloß noch sowas wie Sample&Hold-Speicher 
(Eingangs-Flipflops oder so etwas?) für alle Eingangssignale oder 
Variablen und die Kombinatorik hängt nach rechts "frei". Wie sorgt man 
so denn dafür, dass die Ausgänge eines Prozesses nicht "flattern" beim 
Wechsel der Eingänge? Oder tun sie das? Ich versuche mir das hier gerade 
alles so auf Hardware-Ebene vorzustellen.

Viele Grüße,
Michael

von Klaus F. (kfalser)


Lesenswert?

Lothar Miller schrieb:
> enan schrieb:
>> Bei Sequentiellen statements kommt ein clock Signal ins Spiel.
> Nein. Es kommt ein Prozess ins Spiel.
> Und dieser Prozess wird "von oben nach unten" berechnet, und die letzte
> Zuweisung an ein Signal dann "sofort" durchgeführt.

Alle Vorgänge bei VHDL basieren auf dem Prozess Modell.
VHDL wurde entworfen um Hardware zu simulieren.
Man stellt sich einen schwarzen Block vor, der Eingänge und Ausgänge 
besitzt. Die Ausgänge bleiben solange stabil, bis sich an den Eingängen 
etwas tut, dann müssen die Ausgänge neu berechnet werden.
Dies genau macht der Prozess. Er reagiert auf die Sensitivity Liste( = 
alle oder nur ein Teil der Eingänge) und berechnet die Ausgänge neu. 
Diese Neuberechnung verhält sich wie eine "normale" Programmiersprache, 
alle Statements werden sequenziell abgearbeitet.
Ist die Berechung abgeschlossen ( alle Statements abgearbeitet ) wird 
der Prozess gestoppt und alle Signale werden auf den letzten Stand 
gebracht.
Auch wenn während der Berechnung ein Signal zwischenzeitlich einen 
anderen Wert zugewiesen bekommen hat, wird dieser verworfen, es zählt 
nur die letzte Zuweisung.
Diese Änderung des Ausgangssignals löst nun wiederum eine Neuberechnung 
in einem anderen schwarzen Block aus, dort wo dieses Ausgangsignal ein 
Eingangssignal ist.

Die Freiheit, die VHDL bietet, ist nun sein Design in viele schwarze 
Blöcke (Prozesse) zu zerlegen, die über Ein- und Ausgangsignale 
kommunizieren.

Auch hinter concurrent Statements stecken Prozesse, diese werden nur vom 
VHDL Simulator selbst erzeugt.

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


Lesenswert?

Klaus Falser schrieb:
> Alle Vorgänge bei VHDL basieren auf dem Prozess Modell.
> Dies genau macht der Prozess. Er reagiert auf die Sensitivity Liste
> ( = alle oder nur ein Teil der Eingänge)
Wobei genau genommen schon diese Sensitivliste eine Sonderform eines 
"allgemeinen" Prozesses herleitet: die Sensitivliste ist nur ein 
"vorweggenommenes" wait on. Jeder Prozess mit Sensitivliste könnte 
auch mit einem wait on Statement statt der Sensitivliste geschrieben 
werden. Hier ein kleines Beispiel:
1
   process (s1,s2,s3,s4,s5) begin
2
      :
3
   end process;
Das ist gleichbedeutend mit:
1
   process begin
2
      wait on s1,s2,s3,s4,s5;
3
      :
4
   end process;
Und sowas (mehrere wait in 1 Prozess) wird bei Simulationen ständig 
verwendet...

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.