Forum: FPGA, VHDL & Co. STM32F4 FSMC 8-Bit Bus Zugriff auf 32 Bit Werte


von Martin K. (martinko)


Lesenswert?

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

von Andras H. (kyrk)


Lesenswert?

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.

von Martin K. (martinko)


Lesenswert?

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.

von Samuel C. (neoexacun)


Lesenswert?

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.

: Bearbeitet durch User
von Martin K. (martinko)


Lesenswert?

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?

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


Lesenswert?

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...

: Bearbeitet durch Moderator
von Martin K. (martinko)


Lesenswert?

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
Noch kein Account? Hier anmelden.