Forum: FPGA, VHDL & Co. VHDL: einen Process über einen Signalimpuls aus einem anderen Prozess starten?


von Schmidt (Gast)


Lesenswert?

Hallo,

ich habe leider keine Ahnung, unter welchem Schlagwort ich suchen soll, 
daher eröffne ich einen neuen Beitrag.

Ich arbeite mich gerade in VHDL ein und habe eine Frage:


Ein Shiftregister soll von einem SPI-Anschluss mit Daten beschickt 
werden. Sobald eine gewisse Bitmenge eingegangen ist, soll das Register 
kopiert und wieder freigegeben werden.

Soweit gut.

Da nun eine neu Kopie des letzten Eingangsregisters vorliegt, soll einem 
anderen Prozess mitgeteilt werden, dass diese Kopie bearbeitet werden 
soll.

Ich würde so etwas in C oder ähnlich mit einem globalen Flag machen. Der 
Einleseprozess schreibt das Flag, der nachgeschaltete Ausleseprozess 
liest das Flag, übernimmt die Daten und löscht das Flag wieder. So 
würden sich die beiden Prozesse synchronisieren.

Aber in VHDL? Ich habe erfahren, dass immer nur ein Process auf ein 
Signal schreibend zugreifen darf (mach auch Sinn). Also wie dieses 
Problem lösen? Ich dachte an einen Signalimpuls, der einen anderen 
Process triggert.

Also

process a (...)
begin
...
daten einlesen;
...
Signal flag <= impuls generieren;
end process;

process b (flag)
begin
if flag'event and flag ='1' then
Daten weiter verarbeiten;
end if;
end process;

Oder geht das eleganter?

Ich bin für alle Tipps dankber.

MfG

Schmidt




end process;

von Hanswurst (Gast)


Lesenswert?

Die VHDL-Skizze entspricht ja soweit Deiner Beschreibung, mit Ausnahme 
der Rückwärts-Beeinflussung des Flags zu dem Prozess A. Das ist soweit 
in Ordnung.

Du fragst aber genau nach dieser rückwärtigen Beeinflussung, was Du 
Synchronisation nennst.

Zunächst einmal müsste man klären, ob so etwas grundsätzlich in Deinem 
Design nötig ist.
Es ist dann nötig, wenn die Verarbeitung im Prozess B länger dauert, als 
es dauert ein neues Wort zu empfangen. Anders ausgedrückt, dauert das 
Verarbeiten so lange, wie die Signale im Prozess B stabil bleiben 
müssen, damit das Ergebnis korrekt ist.
In der Umkehrung ist so eine "Synchronisation" (ich setze das 
absichtlich in Anführungszeichen, weil der Begriff hier nicht ganz 
stimmt) dann nicht nötig, wenn die Verarbeitung kürzer ist, als es 
dauert ein neues Wort zu empfangen.
Letzteres wird bei den ersten einfachen Designs die Regel sein. Nimm 
einmal an, es handelt sich um eine Berechnung oder ähnliches die 
insgesamt etwa 4 bis 5 Gatter (LUT) Laufzeiten lang ist, dann sind das, 
je nach FPGA, etwa um 100ns - jedenfalls in dieser Grössenordnung.

Da das Flag-Signal im Prozess B durch eine Flanke etwas auslöst und 
nicht durch einen Pegel, kann es auch sofort wieder zurück gesetzt 
werden. Auch wenn Prozess B noch beim verarbeiten ist. Das tut ja 
nichts. Erst wenn wieder eine neue Flanke auftritt übernimmt Prozess B 
neue Daten.
Und diese Flanke erzeugst Du eben nur dann, wenn wieder ein Wort 
komplett empfangen wurde.

Kurz zum Begriff "Synchronisation": An sich bezeichnet das jedes Mittel 
oder Signal, mit dem dafür gesorgt wird, dass Vorgänge gleichzeitig oder 
ein zeitlich festem Abstand geschehen.
Was Du meinst wird eher als "Bestätigung" (engl. Acknowledge) 
bezeichnet. Hier liegt die Betonung darauf, das eine "Bedingung" 
signalisiert wird, was auf Deine Absicht eher zutrifft.

Nehmen wir einmal an, dass die Verarbeitung länger dauern würde: Dann 
gibt es zwei Wege, von denen einer dieses "Acknowledge" benutzt. Dann 
wäre es nämlich nötig die empfangenen Worte zwischen zu speichern. In 
einem FIFO oder LIFO (siehe Internet). Dann würde das Flag mitteilen, 
dass im FIFO ein neues Wort vorhanden ist und das könnte auch wieder, 
weil Prozesse vorzugsweise auf Flanken reagieren, sofort (also nicht 
wörtlich sofort, sondern im nächsten Takt) zurückgesetzt werden könnte. 
Der empfangende Prozess B könnte nun A über ein zweites Signal 
signalisieren, dass er fertig ist und neue Daten aufnehmen könnte. Das 
muss also nicht ein Signal sein, dass von zwei Prozessen geschrieben 
wird. Im Prozess A wird nun die Erzeugung des Flag-Signales davon 
abhängig gemacht, ob Prozess B schon fertig signalisiert hat oder nicht. 
Falls nicht, dann erfolgt kein "Neue Daten da" Signal. Falls doch, dann 
doch.

Hoffe das hilft Dir etwas weiter.

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


Lesenswert?

Schmidt schrieb:
> Aber in VHDL? Ich habe erfahren, dass immer nur ein Process auf ein
> Signal schreibend zugreifen darf (mach auch Sinn). Also wie dieses
> Problem lösen?
Im Prinzip ist es einfach:
Wenn der eine "Prozess" (korreterweise eigentlich eher: die eine FSM) 
mit fertig ist, dass wird für 1 Taktzyklus lang ein Flag gesetzt. Und 
das wird einfach von anderen Komponenten abgefragt und darafu reagiert. 
So, wie z.B. das clken dort im Lauflicht: 
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Oder dort das TX_Start : 
http://www.lothar-miller.de/s9y/categories/42-RS232
Oder so wie dort der Empfang eines Zeichen über das signal start das 
Senden antriggert: 
http://www.lothar-miller.de/s9y/archives/60-RS232-IO.html#extended

Schmidt schrieb:
> Ich habe erfahren, dass immer nur ein Process auf ein Signal schreibend
> zugreifen darf (mach auch Sinn).
Das macht nicht nur Sinn, es ist technisch auch gar nicht möglich, denn 
ein Signal, das von einem Prozess beschrieben wird, ist zuallererst mal 
nur ein Flipflop. Und das kann nur mit irgenwelche vorgeschalteter Logik 
(=Multiplexer) von 2 Quellen versorgt werden. Und irgendwer müsste 
diesen Multiplexer verwalten, und sagen, wer das jetzt gerade schreiben 
darf.

Schmidt schrieb:
> process a (...)
> begin
> ...
> daten einlesen;
> ...
> Signal flag <= impuls generieren;
> end process;
>
> process b (flag)
> begin
> if flag'event and flag ='1' then
> Daten weiter verarbeiten;
> end if;
> end process;
>
> Oder geht das eleganter?
Du hast hier eine falsche Denkweise. Es ist nicht so, dass ein Prozess 
einer Subroutine in der Software entspricht...

> if flag'event and flag ='1' then
Alles, was mit 'event abgefragt wird, ist ein Takt für Flipflops. Und 
ein Design hat im Idealfall nur 1 Takt (z.B. einen Quarzoszillator mit 
100MHz), der schnell genug ist, die anderen Signale mehrfach abzutasten 
und darauf dann zu reagieren. So, wie das z.B. im SPI-Master dort 
gemacht wird: http://www.lothar-miller.de/s9y/categories/45-SPI-Master
Der SPICLK im http://www.lothar-miller.de/s9y/categories/45-SPI-Master 
ist kein Takt(!), sondern ein simples Signal, auf das mit einem kurzen 
2-Bit-Schieberegister eine Flankenerkennung angesetzt wird:
1
 if (spiclk='1' and  spiclklast='0') then

> Ein Shiftregister soll von einem SPI-Anschluss mit Daten beschickt
> werden. Sobald eine gewisse Bitmenge eingegangen ist, soll das Register
> kopiert und wieder freigegeben werden.
Du musst einfach nur das Register nicht "sperren", dann musst du es 
nicht "freigeben". Du fragst dich jetzt, was das bedeuten soll?
Sehr einfach: die Hardware kann mit jedem Takt alles machen, sie ist 
also so schnell, dass das Register nie blockiert sein wird. Du musst 
lediglich
in dem Takt, wo der Empfang fertig ist,

von X. X. (chrissu)


Lesenswert?

Natürlich kannst du aber auch die Synchronisation im gleiche Stil 
Rückwärts nutzten... Mit einem zweiten Signal... Und so ProcA mitteilen, 
dass ProcB fertig ist.

Nennt man dann Handshake!

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.