Hallo zusammen, Ich möchte einen STM32F4 über dessen FSMC Bus im SRAM Betrieb an einen FPGA ankoppeln. Der FSMC Datenbus ist dabei 8-Bit breit, im FPGA habe ich aber 32-Bit breite Register. Das Funktioniert grundsätzlich ganz gut, über die unteren 2 Adressbits gebe ich über ein Multiplexer die passenden 8 Bits des 32-Bit Registers aus und die restlichen Adressbits geben mir die 32-Bit Registeradresse vor. Der STM32F4 liest dabei 1, 2 oder 4 Byte über den 8-Bit Bus, je nachdem ob ich ein uint8, ein uint16 oder ein uint32 lesen will. Aber: Die Registerwerte im FPGA verändern sich, z.B. im Falle eines schnellen counters. Wenn der STM32F4 jetzt den 32-Bit Counterwert über 4 8-Bit Zugriffe lesen will, dann kann sich mittendrin bereits der Wert im FPGA geändert haben und die ausgelesene Zahl ist Müll. Soweit ich sehen kann gibt es auch keinen unterschied in der Bedienung der Steuerleitungen (NCS, NWE und NOE) wenn ich schnell hintereinander 4 8-Bit Werte oder einen 32-Bit Wert auslesen will. Den auszulesenden 32-Bit Registerwert beim ersten Zugriff sichern und erst dann auslesen scheint nicht der richtige Weg zu sein, da ich nicht wirklich erkennen kann ob der STM32F4 jetzt nur 8-Bit oder 32-Bit lesen will. Wie macht man so etwas richtig? Danke und Gruß Martin
Nimm doch im FPGA an dass der uC immer 32 bit lest und speichere es zwischen. Wenn nicht dann wird der nächste lese zugriff den Wert nicht aus der Cache holen.
Habe ich auch schon überlegt. Ich ermittle die 32 Bit Registeradresse und kopiere dessen Wert. Danach liefere ich die 8 Bit Werte aus dieser Kopie aus. Aber wann aktualisiere ich diese Kopie wieder? Erstelle ich eine Kopie wenn sich die Adresse (ohne die unteren 2 Bit, also die 32 Bit Registernummer) oder Zugriffsart (lesen/schreiben) geändert bekomme ich keine aktuellen Werte mehr wenn ich mehrfach hintereinander einen Zugriff auf die selbe Adresse machen will.
Du könntest dir zusätzlich im FPGA merken, welche Bytes der Kopie du bereits gelesen hast. Greifst du auf ein Byte erneut darauf zu, kannst du den Wert wieder aktualisieren.
Oder vielleicht so: Wenn der Zugriff ein lesender Zugriff ist, die Adresse der letzten +1 entspricht , die 32-Bit Registernummer identisch der letzten ist und der letzte Zugriff nicht länger als x Takte vor diesem lag ist der cache noch gültig :-o Habe ich damit alles erschlagen?
Martin K. schrieb: > Aber: Die Registerwerte im FPGA verändern sich Stichwort: Schattenregister Gibt's z. B. beim AVR auch bei den Timerregistern. Du musst dabei z. B. IMMER von "unten nach oben" lesen und schreiben. Beim Lesen des unteren Bytes wird der Timerwert der anderen 3 Bytes in einem 24 Bits-Register gespeichert und von den nachfolgen drei 8-Bit Zugriffen ausgelesen. Beim Schreiben kommen die unteren 3 Bytes wieder nur in das Schattenregister. Und wenn das höchste Byte drankommt, dann wird der 32-Bit Wert komplett geschrieben. Und da musst du jetzt schauen, welche Reihenfolge der Compiler und/oder der Buscontroller bei long-Zugriffen nimmt. Und du (sowie ebenso dein Buscontroller und dein Compiler) darfst natürlich nie auf die Idee kommen, eine andere Reihenfolge zu nehmen. Ich würde diese Reihenfolge im FPGA mit einer FSM überwachen und eine rote LED anschalten, wenns schief geht. Dieses "rote-LED"-Signal könnte auch dem uC mitgeteilt werden. BTW: wenn man es sich dann genau überlegt, dann kann man mit diesem Schattenregister natürlich auch 16-Bit Worte problemlos lesen. Nur beim Schreiben wird es spannend...
Hallo Lothar, Ist wahrscheinlich das einfachste und verursacht nicht so eine komplexe Geschichte wie die, die ich bei wahlfreiem Zugriff vorhatte. Ein Zugriff auf eines der Register muss in der Mikrokontrollersoftware immer als 32 Bit Zugriff ausgeführt werden. Und dann Deine Vorgehensweise im FPGA dazu und alles andere ist ein Fehler. Danke an alle und Gruß Martin
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.