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;
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.
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#extendedSchmidt 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'andspiclklast='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,
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!