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#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,
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.