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:
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.
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):
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).
Benutzer35443
Tut