Ich verwende einen Freescale-PowerPC-Mikrocontroller. Im Flash-Speichermodul im Datenblatt kann die Anzahl der "Wartezustände des Flash-Speicherzugriffs" konfiguriert werden.
Der folgende Teil des Datenblattes hat meine Frage aufgeworfen. Er stammt aus der Registerbeschreibung der PFlash-Modulregister:
Dieses Feld muss auf einen Wert eingestellt werden, der der Betriebsfrequenz des PFlash und der tatsächlichen Lesezugriffszeit des PFlash entspricht. Höhere Betriebsfrequenzen erfordern Einstellungen ungleich Null für dieses Feld für einen ordnungsgemäßen Flash-Betrieb.
0 MHz, <23 MHz, erforderliche Wartezustände = 0 -
23 MHz, <45 MHz, erforderliche Wartezustände = 1 -
45 MHz, <68 MHz, erforderliche Wartezustände = 2 -
68 MHz, <90 MHz, Wartezustände erforderlich = 3 ---
(PFlash ist ein Platform Flash-Controller-Modul)
Ich verstehe, dass der Prozessor schneller als der Flash ist, deshalb werden Wartezustände eingeführt. Was ich nicht verstehe, ist: Wenn der Prozessor schneller als Flash ist, dann ist der Prozessor derjenige, der verlangsamt werden muss, nicht der Flash, aber der obige Absatz sagt das Gegenteil (oder habe ich das nicht verstanden?), Es sagt, wenn der Pflash mit hohen Frequenzen betrieben wird, müssen wir ihn verlangsamen, indem wir zusätzliche Wartezustände hinzufügen !!
Was ist los mit meinem Verständnis?
Vielen Dank
Antworten:
Um die Antwort von Stevenvh zu verstärken, benötigt jede Art von Logik, wenn ein Eingangssignal gegeben wird, einige Zeit, um ein Ausgangssignal zu erzeugen. Der Speicher ist im Vergleich zu anderen Logikfunktionen oft sehr langsam. Oft gibt es eine Garantie dafür, dass das Ausgangssignal innerhalb einer bestimmten Zeit gültig wird, aber das war's. Insbesondere ist es möglich, dass sich das Signal innerhalb dieses Intervalls mehrmals ändert, und es gibt vor dem Ende dieses Intervalls keinen Hinweis darauf, dass das Signal seinen endgültigen "korrekten" Wert erreicht hat.
Wenn ein typischer Mikrocontroller oder Mikroprozessor ein Byte (oder ein Wort oder eine beliebige Einheit) des Speichers liest, generiert er eine Adresse und betrachtet einige Zeit später den vom Speicher ausgegebenen Wert und wirkt darauf ein. Zwischen der Zeit, zu der der Controller die Adresse generiert, und der Zeit, zu der er den Wert aus dem Speicher betrachtet, ist es egal, wann oder ob sich die Ausgangssignale aus dem Speicher ändern. Wenn sich das Signal aus dem Speicher zum Zeitpunkt des Betrachtens durch den Controller nicht auf seinen endgültigen Wert stabilisiert hat, interpretiert der Controller den Speicher als falsch, da er den Wert gehalten hat, der zum Zeitpunkt der Anzeige ausgegeben wurde. Normalerweise prüft der Controller den Wert aus dem Speicher, sobald er bereit ist, etwas damit zu tun. Wenn der Wert des Speichers dann nicht bereit wäre, funktioniert dies möglicherweise nicht. Folglich, Viele Controller haben die Möglichkeit, etwas länger zu warten, nachdem sie bereit sind, Daten aus dem Speicher zu verarbeiten, um sicherzustellen, dass die Ausgabe aus dem Speicher tatsächlich gültig ist. Beachten Sie, dass das Hinzufügen einer solchen Verzögerung die Daten verlangsamt (der Controller hätte gerne früher auf die Daten aus dem Speicher reagiert), die Richtigkeit des Betriebs jedoch nicht beeinträchtigt (es sei denn, die Daten werden so stark verlangsamt, dass andere zeitliche Verpflichtungen nicht erfüllt werden können).
quelle
Wartezustände werden zu dem von der CPU initiierten Speicherzugriffszyklus hinzugefügt. Es ist also in der Tat die CPU, die auf den langsameren Flash warten muss. Der Speichercontroller signalisiert der CPU für einige Zyklen (0 bis 3) "nicht bereit", und währenddessen bleibt die CPU in ihrem aktuellen Zustand, dh sie hat die Flash-Adresse geschrieben, aber die Daten noch nicht gelesen. Erst wenn der Speichercontroller "Daten bereit" signalisiert, liest die CPU vom Datenbus und setzt ihren Befehl fort (Einrasten der Daten in ein Register oder in den RAM).
quelle
Der Prozessor muss möglicherweise im Speicher stehen bleiben, ein cleveres Design jedoch nicht.
Ich denke, die Schlüsseltechnologie, die Sie nicht kennen, ist der Burst- / Seitenmodus-Zugriff . Dadurch kann die Bandbreite der Speicherzugriffe sehr nahe an der Prozessorgeschwindigkeit liegen (aber wahrscheinlich ist Flash immer noch der Engpass, da ich noch nie eine Flash-basierte MCU mit> 200 MHz gesehen habe).
Die Latenz bleibt jedoch gleich. Für die von mir verwendeten STM32F4-MCUs lautet #wait beispielsweise = floor (clockSpeed / 30MhZ). Das bedeutet, dass die Latenz unabhängig von der Taktrate immer 33 ns beträgt. Es gibt ein Sprichwort: "Geld kann Bandbreite kaufen, aber Latenz ist für immer ..."
Selbst wenn die Flash-Bandbreite nicht ausreicht, um die CPU zu beschäftigen, können Sie problemlos einen Code-Cache entwerfen, in dem Anweisungen gespeichert und vorab abgerufen werden, deren Ausführung erwartet wird. ST hat einen Hinweis dazu für seine STM32F4-MCUs (168 MHz):
Tatsächlich deutet die Aussage auch darauf hin, dass der Burst-Modus nicht erforderlich ist und dass auch eine sehr breite Speicherschnittstelle ausreicht. Die Idee ist jedoch dieselbe (Parallelität verwenden, um die Latenz zu verbergen). Auf dem Chip sind die Kabel frei, sodass ein 128-Bit-Speicher sinnvoll wäre.
quelle