Aktualisieren mehrerer Ports auf 8-Bit-AVR in einem einzigen Zyklus

Ist es auf dem 8-Bit-Atmel AVR MCUS (insbesondere Mega- und Xmega-Serie) möglich, mehrere Ports gleichzeitig in einem einzigen Befehlszyklus zu ändern?

Zum Beispiel habe ich einen 512-kB-RAM-Chip, der 19 Adressleitungen benötigt. Dies erfordert mehrere 8-Bit-Ports, um angemessen adressiert zu werden. Ist es möglich, in einem einzigen Befehlszyklus alle 19 Bits auf eine bestimmte Adresse zu setzen? Ich verstehe, dass ich die High-Bits, dann die Middle-Bits, dann die Low-Bits setzen und den Low-End-Port inkrementieren kann, um durch den RAM zu gehen, aber die Zuordnung ist möglicherweise nicht sequentiell. Kann ich, um wieder ein zufälliges Beispiel zu nehmen, das RAM das 1. Byte, dann das 510. Byte und dann das 294. Byte in drei aufeinanderfolgenden CPU-Taktzyklen auf den Datenbus legen lassen?

Danke!

Der Versuch, einen großen externen SRAM an diese Chips zu hängen, beginnt im Grunde mit einem schlecht durchdachten Design. Wählen Sie etwas mit externem Speicherplatz und einem ausreichenden linearen Adressraum - 32-Bit-Kerne sind heutzutage nicht teuer.

Antworten (3)

NEIN.

Der AVR hat einen 8-Bit-Datenbus und das bedeutet, dass er jeweils nur in ein 8-Bit-Register schreiben kann. Es gibt keine Möglichkeit, drei Bytes gleichzeitig zu programmieren.


Wenn Sie auf so viel Speicher zugreifen, würde ich vorschlagen, dass Sie sich für eine 32-Bit-MCU entscheiden. Es ist möglich , 32-Bit-AVR-Prozessoren zu erhalten , wenn Sie eine ähnliche CPU wünschen. Alternativ gibt es viele relativ einfache/günstige 32-Bit-ARM-Prozessoren von vielen Herstellern. Treffen Sie Ihre Wahl.

Es gibt einige Anwendungen, bei denen eine CPU möglicherweise auf viele kleine Elemente aus einem großen Speicher zugreifen muss; Eine 8-Bit-CPU kann für Zwecke wie das Ausspulen unkomprimierter Audiodaten von einem Speichergerät nahezu jeder Größe vollkommen ausreichend sein, wenn man einige externe Latches für obere Adressbits hinzufügt.
@supercat Ich stimme zu - tatsächlich verfügen einige AVRs über eine XMEM-Schnittstelle, mit der 64 KB externer RAM (mehr, wenn Sie zusätzliche Bankbits verwenden) direkt dem Adressraum der CPU zugeordnet werden können, wodurch Latches verwendet werden, um die Anzahl der erforderlichen E / A-Pins zu reduzieren. Obwohl es für einige Situationen eine großartige Option ist, erreicht es nicht das, was die Frage gestellt hat, nämlich einen wirklich zufälligen Einzelzykluszugriff auf den gesamten Speicherplatz.
@supercat - Obwohl es möglich ist, mit einer 8-Bit-CPU auszukommen, gibt es heute keinen großen Kostenvorteil, daher ist es in Situationen, in denen die Problemumgehungen viel Komplexität hinzufügen und die Softwaresituation durcheinander bringen, wenig sinnvoll .

Ein Speicherchip kümmert sich im Allgemeinen nicht darum, ob alle Adressdrähte gleichzeitig schalten. Das Höchste, was normalerweise erforderlich wäre, wäre, dass alle Adressdrähte auf ihre richtigen Pegel eingestellt werden, bevor ein Zugriff initiiert wird, und dass sie für eine gewisse Zeitdauer auf ihren richtigen Pegeln bleiben, nachdem der Zugriff abgeschlossen ist. In vielen Fällen sind die Anforderungen für Lesezugriffe sogar noch lockerer: Ändert sich die Adresse auf dem Bus während eines Lesevorgangs, initiieren viele Geräte praktisch automatisch einen Zugriff mit der neuen Adresse und verhindern gültige Daten innerhalb eines bestimmten Zeitraums letzte Änderung am Adressbus.

Da die Verwendung eines I/O-Pins für jede Adressleitung eine Menge I/O verschlingen würde, kann es hilfreich sein, einen oder mehrere Latches oder Register hinzuzufügen. Beispielsweise könnte man bis zu 16 MB Speicher adressieren, während neun Pins für die Adressierung verwendet werden. Verbinden Sie acht davon mit den Adressbits 0-7 sowie den Eingängen eines 74HC373 und eines 74HC374. Führen Sie den verbleibenden Pin den Ladefreigabe- und Taktsignalen dieser Chips zu. Verbinden Sie die Ausgänge des 74HC373 mit den Adressbits 8-15 und die des 74HC374 mit den Adressbits 16-23.

Um auf ein bestimmtes Byte zuzugreifen, beginnen Sie mit "Clock/LE" niedrig und gehen Sie wie folgt vor:

  1. Geben Sie die Bits 16-23 der gewünschten Adresse aus.
  2. Fahren Sie „Clock/LE“ hoch.
  3. Geben Sie die Bits 8-15 der gewünschten Adresse aus.
  4. Fahren Sie "Clock/LE" niedrig.
  5. Gibt die Bits 0-7 der gewünschten Adresse aus
  6. Drücken Sie alle anderen Pins, die erforderlich sind, um den gewünschten Zugriff auszulösen.

Zusätzliche Zugriffe innerhalb eines 256-Byte-Bereichs können durch Wiederholen der Schritte 5–6 (wobei die Schritte 1–4 weggelassen werden) durchgeführt werden.

Abhängig von den Geschwindigkeitsanforderungen und der Anzahl der verfügbaren I/O-Pins sind verschiedene Anordnungen möglich.

Ein guter Punkt, dass nicht alles auf einmal passieren muss - und wenn der typische Zugriff bis zu einem gewissen Grad sequenziell ist, kann der Zeitaufwand für das seltene Einspeichern eines neuen "Bank" -Werts in die höheren Zeilen gering sein. Allerdings gibt es heute nicht viele Gründe dafür, in einer Situation, in der dies begrenzt ist, bei einem 8-Bit-Teil zu bleiben - sie sind in der Regel nicht wirklich billiger.
Guter Punkt Supercat - es wird meine Bedürfnisse für dieses Projekt nicht erfüllen, aber ich werde es im Hinterkopf behalten!

Der AVR XMEGA verfügt über eine externe Busschnittstelle, die bis zu 16 MB adressiert. Auf den externen Speicher kann mit einem einzigen CPU-Befehl zugegriffen werden. Ein Lesevorgang dauert 2 CPU-Taktzyklen (Schreibvorgänge dauern nur 1 Zyklus), aber der XMEGA kann mit 32 MHz getaktet werden, was einem einzelnen Zyklus auf einem 16-MHz-AVR entspricht.

XMEGA externe Busschnittstelle

Geben Sie hier die Bildbeschreibung ein

Da der externe Speicher jedoch in den 64k-Datenspeicherplatz abgebildet wird, kann nur auf 48-55,5kB (je nachdem, wie viel Datenspeicherplatz für interne IO/EEPROM/RAM verwendet wird) wahlfrei zugegriffen werden, ohne die Bank zu wechseln. Die unteren 8,5-16k sind normalerweise nicht verfügbar. Um auf die gesamten 512 KB zuzugreifen, müssten Sie die Adressleitung A15 manuell steuern, wodurch die Bankgröße 32 KB beträgt (abgebildet in den oberen 32 KB des Datenspeicherplatzes).

Einige ältere AVRs wie der ATMega128 verfügen ebenfalls über eine externe Busschnittstelle, jedoch mit eingeschränkteren Adressierungsmöglichkeiten. Diese können langsamer sein, da sie mehr obere Adressleitungen manuell steuern müssen und auch, weil sie eine niedrigere Taktgeschwindigkeit haben. Aber wenn die Geschwindigkeit so kritisch ist, sollten Sie sowieso keinen 8-Bit-AVR verwenden!

Danke Bruce - ich habe gelesen, dass der XMEGA 16 MB adressieren kann, aber ich war mir nicht sicher, wie das mit dem 8-Bit-Bus funktioniert. Das erklärt es perfekt!