Was sind Flash-Speicher-Wartezustände?

Ich verwende einen Freescale PowerPC Mikrocontroller. Beim Flash-Speichermodul im Datenblatt ist die Anzahl der „Wartezustände des Flash-Speicherzugriffs“ konfigurierbar.

Das Folgende ist der Teil des Datenblatts, der meine Frage aufgeworfen hat, er stammt aus der Registerbeschreibung der PFlash-Modulregister:

Dieses Feld muss auf einen Wert gesetzt 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 Plattform-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, muss der Prozessor verlangsamt werden, 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 ihm zusätzliche Wartezustände hinzufügen !!

Was ist falsch an meinem Verständnis?

Vielen Dank

Wenn ich das richtig verstanden habe, ist der Regler auf unterschiedliche Geschwindigkeiten einstellbar; es muss also warten, bis der eigentliche Flash-Speicher die Daten zur Verfügung hat.

Antworten (3)

Um Stevenvhs Antwort zu verstärken, benötigt jede Art von Logik, wenn sie ein Eingangssignal erhält, einige Zeit, um ein Ausgangssignal zu erzeugen. Speicher ist im Vergleich zu anderer Logik oft sehr langsam. Oft gibt es eine Garantie, dass das Ausgangssignal innerhalb einer bestimmten Zeit gültig wird, aber das war es auch schon. 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 "richtigen" 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 reagiert darauf. Zwischen dem Zeitpunkt, zu dem die Steuerung die Adresse generiert, und dem Zeitpunkt, zu dem sie den Wert aus dem Speicher betrachtet, spielt es keine Rolle, wann oder ob sich die Ausgangssignale aus dem Speicher ändern. Wenn sich andererseits das Signal aus dem Speicher nicht auf seinen endgültigen Wert stabilisiert hat, wenn der Controller es betrachtet, liest der Controller den Speicher fälschlicherweise so, als hätte er den Wert gehalten, der in dem Moment ausgegeben wurde, in dem er es betrachtete. Normalerweise würde der Controller den Wert aus dem Speicher sehen, sobald er bereit wäre, etwas damit zu tun, aber wenn der Wert des Speichers dann nicht bereit wäre, könnte das nicht funktionieren. 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 Dinge verlangsamt (der Controller hätte gerne früher auf die Daten aus dem Speicher reagiert), aber die Korrektheit des Betriebs nicht beeinträchtigt (es sei denn, die Dinge werden so sehr verlangsamt, dass andere Timing-Verpflichtungen nicht erfüllt werden können).

Nett! Vielen Dank für die hilfreichen Details, die Sie erklärt haben!
@MemoryLeaks: Gerne. Es ist wichtig zu beachten, dass das Reduzieren von Wartezuständen unter die angegebenen Grenzwerte dazu führt, dass das System schneller läuft, aber Lesevorgänge aus dem Speicher willkürlich falsche Daten liefern können. ferner kann „willkürlich falsche Daten liefern“ bedeuten „korrekte Daten liefern, bis das von Ihnen entworfene Gerät in den Händen Ihres Kunden ist, und dann anfangen, oft genug falsche Daten zu liefern, um den Kunden sehr sauer auf Sie zu machen“.
Dies scheint dem Übertakten sehr ähnlich zu sein, ist aber eher eine konfigurierbare Option davon. Interessante Art, eine MCU vielleicht zu übertakten.
@supercat, Eine Frage, was mit Controller gemeint ist, ist es der Prozessor oder der Speichercontroller?
@Mouin: Der Speichercontroller, falls vorhanden, oder der Prozessor, falls nicht vorhanden.

Wartezustände werden dem von der CPU initiierten Speicherzugriffszyklus hinzugefügt. Es ist also tatsächlich die CPU, die auf den langsameren Flash warten muss. Der Speichercontroller signalisiert der CPU für eine Anzahl von Zyklen (0 bis 3) "nicht bereit", während die CPU in ihrem aktuellen Zustand bleibt, dh die Flash-Adresse geschrieben, aber die Daten noch nicht gelesen hat. Nur wenn die Speichersteuerung "Daten bereit" signalisiert, liest die CPU vom Datenbus und setzt ihre Anweisung fort (Zwischenspeichern der Daten in einem Register oder im RAM).

Indem ich diese Einstellung konfiguriere, sage ich dem Speichercontroller, wann er genau "Daten bereit" signalisieren soll. Kann ich dem Speicher nicht einfach sagen, dass er "Daten bereit" signalisieren soll, wenn er tatsächlich bereit ist?
@MemoryLeaks - Das ist möglich und wird von asynchronen Prozessoren durchgeführt, die selten sind. Es ist üblicher und vorhersehbarer, alles mit einer Uhr zu synchronisieren. Es ist also entweder eine Taktzyklusverzögerung (oder 2 oder 3) oder nichts.
Vielen Dank für Ihre Antwort :) Zusammenfassend: Die Beschreibung in meiner obigen Frage bedeutet, dass die "CPU" und nicht der Flash-Controller verzögert wird
@stevenvh hängt der Prozessor buchstäblich auf, er empfängt die Daten aus dem Speicher, ich meine, stoppt er die Ausführung vollständig oder würde er im Falle einer Pipeline-CPU andere Anweisungen ausführen. Was ist mit Interrupts, die ich denke, sie würden bedient, während die CPU darauf wartet, dass der Speicher bereit ist?

Der Prozessor muss möglicherweise im Speicher hängen bleiben, aber ein cleveres Design muss das nicht.

Ich denke, die Schlüsseltechnologie, die Sie nicht kennen, ist der Zugriff im Burst-/Page-Modus . 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 gesehen habe, die mit> 200 MHz läuft).

Die Latenz bleibt jedoch gleich. Zum Beispiel für die STM32F4-MCUs, die ich verwende, #wait states = 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 ewig ..."

Selbst wenn die Flash-Bandbreite nicht ausreicht, um die CPU auszulasten, können Sie einfach einen Code-Cache entwerfen, der Anweisungen speichert und vorab abruft, deren Ausführung erwartet wird. ST hat dazu einen Hinweis für seine STM32F4-MCUs (168 MhZ):

Dank des ART-Beschleunigers und des 128-Bit-Flash-Speichers wirkt sich die hier angegebene Anzahl von Wartezuständen nicht auf die Ausführungsgeschwindigkeit aus dem Flash-Speicher aus, da der ART-Beschleuniger es ermöglicht, eine Leistung zu erreichen, die der Programmausführung mit 0 Wartezuständen entspricht.

Eigentlich deutet die Aussage auch darauf hin, dass der Burst-Mode nicht nötig ist und auch ein sehr breites Speicherinterface ausreicht. Aber die Idee ist die gleiche (Verwendung von Parallelität, um Latenz zu verbergen). Auf dem Chip sind Kabel frei, daher wäre ein 128-Bit-Speicher sinnvoll.

Drähte sind auf einem Chip im Allgemeinen weit davon entfernt, "frei" zu sein, aber das Erhöhen der Busbreite zwischen einem Speicherarray und einem Satz von Latches fügt keine Drähte hinzu. Wenn ein Chip ein 256-kbit-Flash-Array hat, das als 512 x 512-Gitter organisiert ist, sind die Verdrahtung und die Logik zum Zusammenfassen von 512 Spalten zu einem 32-Bit-Bus erforderlich, unabhängig davon, ob man ein 512 Bit breites Latch vor die "verdichtenden" Drähte und Logik setzt oder ein 32-Bit breites Latch nach ihnen.
Ich meine, sie sind im Vergleich zu externen Pins "frei". Ich weiß, dass Drahtenergie heutzutage dominiert und dass die Lokalität wichtig ist, also lassen Sie mich diese Aussage relativieren. Sie können kostenlos erstellt, aber nicht aktiviert werden!
Ich bin mir nicht sicher, was Sie mit "Drahtenergie" meinen, aber selbst aus räumlicher Sicht sind große Busse teuer, aber wenn die Verdoppelung der Breite eines Busses seine Länge ungefähr halbiert, bleiben die Gesamtkosten ungefähr gleich.