Forum: FPGA, VHDL & Co. Wie umgeht man Signalzuweisung aus mehreren Prozessen?


von Tom (Gast)


Lesenswert?

Hallo,

beim Entwurf von VHDL Modulen komme ich immer wieder zu dem Punkt wo ich 
gern ein und das selbe Signal aus unterschiedlichen Prozessen heraus 
verändern würde. Das geht ja aber nicht.

Zum Beispiel: Ein Prozess soll ein Ereignis in einem anderen Prozess 
auslösen (soweit funktioniert es ja). Wenn das Ereignis abgeschlossen 
ist muss das "Auslösesignal" aber wieder zurückgesetzt werden. Da es 
aber in Prozess eins gesetzt wurde kann ich es nicht in Prozess zwei 
zurücksetzen. Prozess eins weiss jedoch wiederum nicht wann das Ereignis 
abgeschlossen ist und das Auslösesignal zurückgesetzt werden kann.

Ich hoffe man versteht ungefähr was ich meine.

Da sowas sicherlich häufig vorkommt gibt es bestimmt einen sinnvollen 
Weg soetwas zu machen. Kann mir jemand auf die Sprünge helfen?

Vielen Dank

Tom

von Falk B. (falk)


Lesenswert?

@ Tom (Gast)

>beim Entwurf von VHDL Modulen komme ich immer wieder zu dem Punkt wo ich
>gern ein und das selbe Signal aus unterschiedlichen Prozessen heraus
>verändern würde.

Dann hast du die falsche Entwurfsmethode.

> Das geht ja aber nicht.

Eben.

>Zum Beispiel: Ein Prozess soll ein Ereignis in einem anderen Prozess
>auslösen (soweit funktioniert es ja). Wenn das Ereignis abgeschlossen
>ist muss das "Auslösesignal" aber wieder zurückgesetzt werden. Da es
>aber in Prozess eins gesetzt wurde kann ich es nicht in Prozess zwei
>zurücksetzen. Prozess eins weiss jedoch wiederum nicht wann das Ereignis
>abgeschlossen ist und das Auslösesignal zurückgesetzt werden kann.

Du brauchst einfach zwei Signale, eins zum Auslösen, eins zum 
Rücksetzen. AVoila.

MFG
Falk

von Tom (Gast)


Lesenswert?

Sorry vielleicht stell ich mich ein bisschen dumm an aber ich versteh 
das mit den zwei Signalen noch nicht ganz:

Ich meine das so:

Prozess 1:
...
if auslösesignal = '1' then
  ...
  ...
end if;
...
end prozess 1




Prozess 2:
...
an irgendeiner Stelle
...
auslösesignal <= '1';
...
ende prozess 2

Bis zum ersten Auslösen funktioniert das auch aber woran soll ich jetzt 
im zweiten Prozess fest machen das das Auslösesignal wieder 0 gesetzt 
wird?

von Falk B. (falk)


Lesenswert?

@ Tom (Gast)
1
Prozess 1:
2
...
3
if auslösesignal = '1' then
4
  ...
5
  resetsignal ='1';
6
  ...
7
end if;
8
...
9
end prozess 1
10
11
12
13
14
Prozess 2:
15
...
16
an irgendeiner Stelle
17
...
18
auslösesignal <= '1';
19
  if resetsignal='1' then auslösesignal <= '0'; end if;
20
...
21
ende prozess 2

MFg
Falk

von Tom (Gast)


Lesenswert?

OK so wird das Auslösesignal zurückgesetzt aber besteht jetzt nicht das 
gleiche Problem mit dem Resetsignal? An welcher stelle wird das nun 
wieder auf 0 gesetzt?

von Falk B. (falk)


Lesenswert?

@ Tom (Gast)

>OK so wird das Auslösesignal zurückgesetzt aber besteht jetzt nicht das
>gleiche Problem mit dem Resetsignal? An welcher stelle wird das nun
>wieder auf 0 gesetzt?

Natürlich auch wieder in dem entsprechenden Prozess.

MFG
Falk

von Hermann (Gast)


Lesenswert?

Bei komplexen Schaltungen hast Du automatisch diverse Verkopplungen, die 
es nahezu verunmöglichen, Prozesse so zu schreiben, daß eine 
Signalzuweisung nur an einer Stelle erfolgt. Denke mal an Semaphoren.

Die übersichtlichste Struktur ist wohl die, jedem Signal ein 
prozessrelevantes suffix zu verpassen und einen handler-Prozess zu 
definieren, der die Prios der Zugriffe definiert.

Z.B. motor_aus_master, motor_aus_user, motor_an_user, motor_an_machine

Im handler-Prozess wird dann im Detail unterschieden, was zu passieren 
hat, wenn die Informationen konkurrieren. Eine solche Aufteilung ist 
auch für die Risiko-und Zustandanalyse von Systemen nutzvoll, da Du die 
Lokikdefinitonen direkt in einer EXCEL verwalten (lassen) kannst: Neue 
Funktionen in die Excel, vom Systemdeisnger abzeichnen lassen und dann 
einfach runterprogrammiert.

von Jan M. (mueschel)


Lesenswert?

Zur Entwurfsmethode:
In herkoemmlichen Programmiersprachen fragt man sich "Was soll 
passieren, wenn x auftritt?"
In VHDL sollte die Frage aber lauten "Wann soll y passieren?"

Ein process ist somit also etwas, das ein Ereignis ausloest, nicht 
etwas, das auf ein Ereignis reagiert - so lassen sich fast alle 
Mehrfach-Zuweisungs-Probleme umgehen.

@Toms Ursprungspost: In einem solchen Fall kann man auch ein RS-FlipFlop 
beschreiben.

von Hermann (Gast)


Lesenswert?

Da ist aber jetzt Philosophie! Prozesse erzeugen Signale ja dadurch, daß 
sie reagieren - das sind immer input-output Konstrukte, egal aus welcher 
Betrachtungssicht.

von Falk B. (falk)


Lesenswert?

@ Jan M. (mueschel)

>In herkoemmlichen Programmiersprachen fragt man sich "Was soll
>passieren, wenn x auftritt?"

Das macht VHDL nicht anders.

>In VHDL sollte die Frage aber lauten "Wann soll y passieren?"

Welches y?

>Ein process ist somit also etwas, das ein Ereignis ausloest, nicht
>etwas, das auf ein Ereignis reagiert - so lassen sich fast alle
>Mehrfach-Zuweisungs-Probleme umgehen.

???

>@Toms Ursprungspost: In einem solchen Fall kann man auch ein RS-FlipFlop
>beschreiben.

Mit so einem Quark fängt man heutzutage gar nicht mehr an, ausser in 
0,01% aller Fälle.

MFG
Falk

von Tom (Gast)


Lesenswert?

Also erstmal vielen Dank für eure Hinweise.

Die Variante von Hermann leuchtet mir ein aber ich denke dafür ist mein 
System nicht komplex genug. Bei wirklich großen Sachen macht das sicher 
Sinn.

Ich habe es jetzt so gemacht das der "Auslöser" nur 2 Takte lang ist 
somit hat der andere Prozess die Möglichkeit darauf zu reagieren und der 
Auslöser wird im gleichen Prozess wo er gesetzt wird eben nach diesen 2 
Takten zurückgesetzt. Ob das so ideal ist weiss ich nicht, aber ich 
denke ich kann damit leben.

Grüße

Tom

von Falk B. (falk)


Lesenswert?

@ Tom (Gast)

>Ich habe es jetzt so gemacht das der "Auslöser" nur 2 Takte lang ist
>somit hat der andere Prozess die Möglichkeit darauf zu reagieren und der

Warum zwei? Ist dann auch sichergestellt, dass der Empfangsprozess nicht 
zweimal reagiert?

MfG
Falk

P.S. Was auch gut geht ist ein Handshake ala ECP-Modus am Parallelport. 
Garantiert Race-Condition sicher.

von Jan M. (mueschel)


Lesenswert?

@Falk:
Ich meine mit meinen Ausfuehrungen nur die Denkweise beim Entwurf.
Nehmen wir einen ganz einfachen Fall an, zwei Eingangssignale E1,E2 und 
zwei Ausgangssignale A1, A2, die jeweils von beiden Eingaengen 
abhaengen. %Programmierer% will zwei Prozesse haben (warum auch immer).
Die "herkoemmliche" Denkweise fuehrt zu einem Prozess, der auf E1 
reagiert und einer der auf E2 reagiert: (verkuerzt)

process(E1)
 A1 =
 A2 =
process(E2)
 A1 =
 A2 =

Jetzt merkt %Programmierer%, dass das so nicht funktioniert und muss 
eine Loesung suchen.
Geht er aber gleich von der "ergebnisorientierten" Denkweise aus, kommt 
er direkt zu einem process der A1 erzeugt und einem der A2 erzeugt.

process(E1,E2)
 A1 =
process(E1,E2)
 A2 =

In diesem einfachen Beispiel mag es offensichtlich sein, aber bei 
komplizierteren Schaltungen kann es doch Arbeit sparen.


Warum kein RS-FF? Das laesst sich einwandfrei mit minimalem Logikaufwand 
synthetisieren. Der Code ist ebenfalls weder unuebersichtlicher noch 
laenger oder weniger portabel.

von Axel (Gast)


Lesenswert?

Vielleicht hilft es manchem, wenn er hinten anfängt und sich mal 
hinschreibt, wann unterw Bedingungen ein Ausgang wie schalten soll. Das 
lässt sich dann rückführen.

von Falk B. (falk)


Lesenswert?

@ Jan M. (mueschel)

>Warum kein RS-FF? Das laesst sich einwandfrei mit minimalem Logikaufwand
>synthetisieren.

Nicht wirklich. Ausserdem gibt es damit immer Probleme bei der 
automatischen, synchronen Timinganalyse.

> Der Code ist ebenfalls weder unuebersichtlicher noch
>laenger oder weniger portabel.

Aber es ist keine solide, synchrone Lösung, welche zu 99,9% besser und 
vollkommen ausreichend ist.

MFG
Falk

von FPGAküchle (Gast)


Lesenswert?

|>Warum kein RS-FF? Das laesst sich einwandfrei mit minimalem Logikaufwand
|>synthetisieren.

|Nicht wirklich. Ausserdem gibt es damit immer Probleme bei der
|automatischen, synchronen Timinganalyse.

|> Der Code ist ebenfalls weder unuebersichtlicher noch
|>laenger oder weniger portabel.

|Aber es ist keine solide, synchrone Lösung, welche zu 99,9% besser und
|vollkommen ausreichend ist.

RS-FF sind eine bewährte, platzsparende, solide Lösung unter 
Xilinx-Spartan. nicht zu verwechsel mit CP-FF. Erstere sind synchrone 
Reset/Set-FF,letztere haben asynchronen clear/preset.

von Falk B. (falk)


Lesenswert?

@ FPGAküchle (Gast)

>RS-FF sind eine bewährte, platzsparende, solide Lösung unter
>Xilinx-Spartan.

Nur bedingt.

> nicht zu verwechsel mit CP-FF.

Was soll das sein?

> Erstere sind synchrone Reset/Set-FF,

Dann ist es aber kein echtes RS-FlipFlop!

MFG
Falk

von FPGAküchle (Gast)


Lesenswert?

Easy, easy, jetzt streitet man nich über halbe Namen.
Also es gibt zwei Arten für den Reset eines FF, synchron oder asynchron. 
Funktional tut beides dasselbe, der Ausgang Q wird auf '0' gesetzt.
Xilinx unterscheidet dies mit den namen, synchron q auf 0 setzen -> 
Reset;
asynchron auf '0' setzten -> Clear.

Zurück zum Ursprung, ein FF mit synchronen Reset|Set (bei Xilinx RS) ist
eine solide, platzsparende und sichere Lösung! Oder?

von Falk B. (falk)


Lesenswert?

@ FPGAküchle (Gast)

>Easy, easy, jetzt streitet man nich über halbe Namen.

Das ist hier ein kleiner, aber WICHTIGER Unterschied!

>Zurück zum Ursprung, ein FF mit synchronen Reset|Set (bei Xilinx RS) ist
>eine solide, platzsparende und sichere Lösung! Oder?

Ja.

MFG
Falk

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.