Das Mehrere Bausteine an denselben Bus angeschaltet sind, blieb mir auch nicht erspart. Ich musste Adress- und Datenbus zusammenlegen (nicht genug I/Os am Atmega328P-PU). Aber ich denke, die Programmierung richtet es dann. Meine Bausteine haben alle einen HIGH-Z-Zustand. Die Atmegas wohl auch, wenn man die auf Input schaltet. Ob sich da was stört weiß ich noch nicht. Nach einigem Probieren mit der seriellen Kommunikation, um Adressen zu übermitteln, habe ich das neu entworfen. Weil seriell zu langsam wäre. Funktioniert hatte das schon, mit einem Atmega328. Zu Anfang hatte ich nur einen Atmega, mit getrenntem Daten und Adressbus zum Speicher. Das war mir aber auch zu langsam, weil ich die Adressierung über Schiebregister machen musste. Dann habe ich versucht, 3 Schieberegister auf einmal zu laden, was auch ging, aber dann - erstaunlicher Weise - vom Programmcode her langsamer wurde, weil ich Adressen umrechen musste (das Schieben über die Schieberegister ging vom Code her dann schneller). Ich wollte gerne unter 1500 bis 2000 Millisekunden kommen, zum Lesen und Schreiben von 102400 Bytes. Als zentraler Speicher an einem Datenbus ist eine Beschaltung mit einem Atmega328 wegen begrenzter I/Os auch nicht tauglich, daher mein Versuch der ser. Schnittstelle, zur Adressübertragung. Außerdem hatte ich zu wenige I/Os, weil ich gerne noch SD-Karte einbinden möchte. Zwecks Ein- Auslagerung, wenn der physische SRAM zu wenig ist, weil höhere Adressen angefordert werden. Deshalb bin ich bei 2 Atmegas328 angekommen, die sich das dann teilen. Leider kann ich aber auch den Adressbus nicht vom Datenbus trennen (eben wegen der begrenzten I/Os), so dass dann das Umschalten der Pins zwischen Ein- und Ausgang nochmal Zeit kosten wird. Ich warte noch auf eine Lieferung meiner bestellten D-Latches, die ich eingeplant habe, dann fange ich mit dem Aufbau nochmal von vorne an.
Asynchroner Zugriff auf normales RAM ist nicht möglich. Dafür gibt es spezielle RAM-Bausteine, die das können. RAM-Zugriffe müssen in eine Warteschlange, bzw. muss jedes Modul, dass den RAM benötigt, warten. Hier kann man eine Hirarchielogik ausarbeiten. Da hatte ich gedacht, könnte man wenigstens einen RAM-Baustein spiegeln, damit man zwei Zugriffe gleichzeitig durchführen kann. Darum hatte ich an eine Schaltung gedacht, die am Atmega328 vorbei arbeitet und die Daten direkt von RAM zu RAM kopieren kann, so dass zwei Bausteine immer denselben Inhalt haben. Ich bin irgendwie auf eine Datenrate von ca. 16MByte/s gekommen - weiß nicht ob das richtig war, aber ich denk schon, da ein RAM nur 55ns Zugriffszeit hat. Nur das war mir zu aufgeblasen - ich hätte locker eine E100-Platine vollbekommen. Weshalb ich darauf zunächst verzichte. Verschiedene Arbeitsbereiche können natürlich ein eigenes RAM-Modul haben. So hat man verschiedene Scopes. Um Daten lokal zu verarbeiten und global auszutauschen. Das verringert die Wartezeiten.
Lesezeichen