MPU greift auf ausgelasteten Speicher zu

Ich wusste nicht, ob ich diese Frage hier oder auf Stackoverflow stellen sollte, aber ich habe mich schließlich entschieden, sie hier zu posten.

Ich möchte ein einfaches System bauen, das mit grundlegenden Peripheriegeräten (UART, Tastatur, VGA-Monitor) arbeiten kann. Ich würde gerne MPU anstelle von MCU als ´Haupteinheit´ verwenden, damit mehr Speicher für die Verarbeitung von Daten vorhanden wäre. Dieser „Haupt“-Chip würde einen einzigen SDRAM verwenden, um seine Daten zu speichern.

Für die VGA-Ausgabe möchte ich einen Atmel AVR-Chip verwenden, der Daten von einem anderen Speicher anfordern würde, der Bildschirmdaten im 8-Bit-RGBS-Format enthalten würde. Hier komme ich zu Problemen.

Ich brauche nicht viel VGA-Speicher (weniger als 512 KB), daher möchte ich SRAM-Speicher verwenden, der im Vergleich zu SDRAM auch einfach zugänglich ist. Die von mir gewählte VGA-Auflösung verwendet einen Pixeltakt von 25 MHz, was bedeutet, dass ich nur ~40 ns Zeit habe, um ein einzelnes Pixel vom SRAM zum DAC abzurufen. Das ist gut, denn die meisten Speicher, die meiner Sucheingabe entsprechen (>=4Mbit Speicher, <40ns Zugriffszeit), können dies.

Zurück zum MPU-Speicher möchte ich meine erste Frage stellen: Wann ist es notwendig, einen Aktualisierungsbefehl an das SDRAM zu senden? Muss ich es tun, oder ist es möglich, eine Erinnerung zu bekommen, die externe Magie benötigt, um sie aufzufrischen?

Jetzt komme ich zu dem Problem, wie ich vom Hauptchip auf diesen SRAM-VGA-Speicher zugreifen kann, da auf ihn fast immer von meinem VGA-Controller zugegriffen wird (ganz zu schweigen davon, dass ich noch einen weiteren Chip benötige, um diesen Speicher gut auf den Adressraum der MPU abzubilden). Ich dachte daran, einige Pins des VGA-Controllers für MPU-Anforderungen für den SRAM-Zugriff zu reservieren, was bedeuten würde, dass einige Videoframes übersprungen werden müssten, damit dieser SRAM ohne Unterbrechungen für die MPU zugänglich bleibt.

Ich stecke hier fest. Mir fielen nur diese möglichen Lösungen ein:

  1. Ich kann SDRAM auf VGA-Chip anstelle von SRAM verwenden, aber ich brauche auch einen besseren Controller für die Videoausgabe. Dieses SDRAM wird mit dem auf der MPU kompatibel sein, und ich muss über eine spezielle Taktik zum Taktdiebstahl nachdenken, bei der ich vom Videocontroller und der Hauptverarbeitungseinheit gleichzeitig auf den Videospeicher zugreifen könnte.
  2. Ich kann einen weiteren Chip hinzufügen, der Zeit verwendet, wenn nicht auf den Videospeicher zugegriffen wird (Synchronisationsimpulse, Porches usw.), um Datenblöcke aus dem Hauptspeicher in den Videospeicher zu kopieren.
  3. Ich kann nur einen SDRAM-Speicher verwenden und den Zugriff von der MPU jedes Mal anfordern, wenn VGA ein weiteres Pixel benötigt. Das würde das ganze System verlangsamen, aber es wäre einfacher.

Was denkst du über dies? Welche anderen Möglichkeiten (Tricks, Designs?) Gibt es hier, um zwei Einheiten (Haupt- und Videoverarbeitungseinheit) zu haben, von denen eine von einer anderen verwaltet wird?

Danke.

Danke für deine Ideen. Ich schätze, für den verschachtelten Speicherzugriff ist SDRAM erforderlich, oder?
Nicht unbedingt. Ich habe es mit schnellem SRAM gemacht. Mit 2 verschachtelten Chips hatte ich mehr als 2 Zugriffsfenster (ich glaube, es waren 4). Übrigens ist es viel einfacher, mit einem FPGA zu tun.

Antworten (1)

Eine Sache, die früher für Videografik-Controller üblich war, ist Video-RAM oder VRAM .

VRAM hat zwei Sätze von Datenausgangspins und somit zwei Ports, die gleichzeitig verwendet werden können. Auf den ersten Port, den DRAM-Port, wird vom Host-Computer auf eine Weise zugegriffen, die dem herkömmlichen DRAM sehr ähnlich ist. Der zweite Port, der Videoport, ist typischerweise schreibgeschützt und dient dazu, einen serialisierten Datenkanal mit hohem Durchsatz für den Grafikchipsatz bereitzustellen.

Intern liest VRAM eine ganze DRAM-Zeile und verschiebt sie sequentiell zu den Videoschaltkreisen. Dadurch bleibt der DRAM zur Verwendung durch die MPU verfügbar. VRAM wurde weitgehend durch die Verwendung von SDRAM ersetzt, "obwohl es nur Single-Port ist und mehr Overhead erforderlich ist".


Eine Technik, die ich in der Vergangenheit verwendet habe, ist der verschachtelte Zugriff auf den Speicher. Es ist ein bisschen kompliziert zu erklären (der Teufel steckt im Detail), aber ich werde die Grundlagen skizzieren:

Grundsätzlich greift die MPU zwischen den Pixelzugriffen durch den Videocontroller auf den Videospeicher zu. Wenn dieses Timing zu eng wird, gibt es ein paar Dinge, die Sie tun können, um das Timing erheblich zu erleichtern (normalerweise ist nur 1 davon erforderlich):

  1. Sie können 2 RAM-Chips (oder Bänke) verwenden und diese mit jedem Chip für jedes andere Pixel verschachteln. In Ihrem Fall würde dies Ihren Pixeltakt effektiv auf 80 ns pro Chip verlangsamen, sodass MPU- und Video-Controller-Zugriff Fenster von jeweils 40 ns haben. Dies könnte bei Bedarf auf mehr Bänke erweitert werden, die mehr Pixel verschachteln. Diese Technik wird Interleaved Memory genannt .
  2. Sie können die Datenbusgröße des Videospeichers erhöhen. Der Videocontroller würde mehrere Pixel bei einem einzigen Zugriff lesen und sie sequentiell verwenden. Die MPU hätte entweder einen größeren Datenbus, jeder Zugriff würde auf das entsprechende Byte (oder Wort) gerichtet und Byte-Selects würden auf dem Videospeicher verwendet, oder es müsste ein Read-Modify-Write durchgeführt werden, um zu schreiben auf die größere Datenmenge. In Ihrem Fall wäre es wahrscheinlich am einfachsten, den Datenbus des Videospeichers auf 16 oder 32 Bit (2 oder 4 Pixel) zu erhöhen und dann wahrscheinlich eine MPU mit derselben Busgröße zu verwenden.

Wenn Sie Videozugriffe verschachteln, sollten Sie die Verwendung eines FPGA oder CPLD für Ihren Videospeichercontroller in Betracht ziehen.


Eine andere Methode besteht darin, 2 separate Videospeicher zu haben und die Bankauswahl zu verwenden. Die MPU schreibt in eine Bank, während die andere vom Videocontroller zur Anzeige verwendet wird. Wenn die MPU mit dem Schreiben fertig ist, werden die Bankzugriffe vertauscht (normalerweise während eines Sync-Impulses).