Ich beschreibe ein System in VHDL. Dieses System enthält bereits einen Prozessor, einen DDR-SDRAM-Controller und einen VGA-Controller. VGA liest Pixel aus dem SDRAM (bereits validiert und im FPGA bewährt).
Obwohl VGA und SDRAM bereits miteinander kommunizieren, muss die Verbindung zwischen Prozessor und SDRAM noch implementiert werden. Am Ende möchte ich einen Prozessor haben, der den im SDRAM gespeicherten Framebuffer zeichnet. Dann tritt ein Seitenwechsel auf und VGA beginnt, das neue Bild abzurufen, das vom Prozessor gezeichnet wurde.
Um den VGA anzuweisen, vom neuen Speicherort abzurufen, möchte ich den VGA-Controller (unter Verwendung des zugeordneten Speichers) über die neue Adresse des neuen Bildes informieren. Eine einfache Strategie bestand darin, einen Mux zu setzen und zu überprüfen, ob der Adressbereich in die Register des VGA-Controllers oder in den Adressbereich des Caches fällt. Muss ich mich auch um verschiedene Uhrdomänen kümmern? Wenn ja, welche möglichen Probleme sollten mich interessieren?
Zum Beispiel habe ich irgendwann in der Vergangenheit Code von x86 gesehen, der schreibt (unter Verwendung des Outb-Befehls), und der nächste Befehl war ein Inb an denselben und / oder einen verwandten Ort. Muss ich in diesem Fall die Prozessorlogik ändern, um bei solchen Vorgängen zu blockieren? Wenn ja, wie viele Fälle müssen implementiert werden? Wie viele Schnittstellen sind zu beachten?
Wie wird beim Booten der Cache verwendet, wenn alle Einträge ungültig sind? Ich glaube, es gibt ein ROM-Image mit dem Startcode. Könnte es auch einen temporären lokalen RAM für Schriften geben, die mit im ROM gespeichertem Code erstellt wurden (sw-Anweisungen)?
Fortsetzen: Ich benötige Informationen zum Implementieren von Speicherhierarchie-Schaltkreisen: Caches, Speicherzuordnungen, TLBs, virtueller Speicher usw. und wie all diese miteinander kommunizieren. Ich weiß zum Beispiel, wie man Caches und TLBs implementiert. Aber ich bin mir nicht sicher, wie ich sie miteinander verbinden soll. Ich könnte einfach etwas verwenden, das funktioniert (wie die Mux-Idee). Aber ich möchte Entwürfen folgen, die in der Industrie etabliert sind.
Was ich bereits studiert habe: - Ausführen von Mips - Computerarchitektur (Patterson) - MIPS-Handbücher - ARM-Handbücher - Intel-Handbücher
Aber keiner erklärt im Detail.
Wenn es viele Möglichkeiten zur Implementierung gibt, zeigen Sie mir bitte eine, die Sie kennen. Auch wenn es sich um Quellcode oder ein Blockdiagramm handelt. Auch hier brauche ich keine Erklärung, wie es intern funktioniert. Ich muss nur die Schnittstellen zwischen den Modulen kennen.
Danke euch allen
Antworten:
Hier ist ein Link zu einer kurzen Erklärung, wie speicherabgebildete E / A in einem älteren Computersystem funktionieren. Vielleicht kann dies einige Ihrer Fragen beantworten:
http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/IO/mapped.html
quelle
Nach all dieser Zeit habe ich nichts Detailliertes zu diesem Thema gefunden. Ich beschloss, einfach etwas zu codieren, das funktionieren würde, und zu vergessen, wie es der Branche geht. Dies geschah, nachdem einige Dokumentationen zum Wishbone-Busprojekt gelesen wurden, die besagen, dass in FPGA eine Reihe von Multiplexern verwendet werden, um die Routen zwischen den Modulen zu erstellen.
Mein Rat für diejenigen, die etwas Ähnliches in FPGA ausprobieren: Tun Sie einfach etwas, das funktioniert. Ich kann mich irren, aber es gibt einfach keine detaillierten Informationen darüber, wie man solche Sachen macht.
Zuallererst habe ich meine Realität akzeptiert: Ich bin ein FPGA-Typ, der im Allgemeinen durch Uhren von 50 MHz begrenzt ist. Ich projiziere auch kein System zur Schnittstelle mit einem Motherboard oder einer PCI oder was auch immer. Es ist ein einfacher SoC und alle physischen Schnittstellen, die ich benötige (Tastatur, Maus, VGA, SDRAM usw.), stehen zur Verfügung, damit ich sie über Pin-Zuweisungen verwenden kann (natürlich muss ich die Logik noch in VHDL implementieren).
Mit anderen Worten: Ich muss mich nur um VHDL kümmern, da die physischen Dinge bereits von den Jungs von Altera / Xilinx / YourVendorHere erledigt werden.
Ich werde kurz erklären, wie ich es gemacht habe:
Ich habe keinen Bus implementiert. Zuerst wollte ich einen Bus benutzen, weil es so ist, wie es im Allgemeinen gemacht wird. Aber die Wahrheit ist, dass ein Bus nur dann nützlich ist, wenn Sie Plug-and-Play-Module verwenden, und dies war nicht mein Fall (bitte korrigieren Sie mich, wenn ich falsch liege). Am Ende habe ich nur ein paar Multiplexer verwendet, um die Adressen abzubilden.
Für Status- / Steuerungs- / Datenregister innerhalb von Modulen habe ich mich für ein einfaches 'Protokoll' entschieden, das Sie als Handshake / Polling betrachten können: In einer Schleife lese ich das Register so lange, bis es den erwarteten Wert liefert, und führe dann die Operation aus Ich möchte.
Ich habe keine Ahnung, wie die ARM- und Intel-Leute ihre Sachen machen, aber hier habe ich einfach ein ROM und RAM (beide Block-RAM) für Bootstrap-Code hinzugefügt. Es ist einfach und es funktioniert.
Die Schnittstelle zwischen dem Prozessor und dem Cache / tlb / mmu ist die folgende: Cache, tlb und mmu ergreifen keine eigenen Aktionen. Wenn ein Fehler auftritt, muss der Prozessor ihn anweisen, die erforderlichen Daten abzurufen.
Es gibt so viele Details, dass ich nicht weiß, was erklärt werden soll oder nicht. Wenn einer von Ihnen detaillierte Informationen darüber benötigt, wie ich die Dinge gemacht habe, senden Sie mir einfach eine E-Mail: [email protected]. Gerne beantworte ich hier auf dem Stapel oder in meiner E-Mail alles.
Ich werde hier auch einige Links lassen, die mir geholfen haben: http://www.st.ewi.tudelft.nl/~gemund/Publications/michel_bsc.pdf http://amir-shenodua.blogspot.com.br/2012/ 06 / simple-memory-management-with-vhdl.html
Ich empfehle auch das folgende Buch, das einige Kapitel enthält, in denen beschrieben wird, wie ein Prozessor mit E / A-Modulen verbunden werden kann: http://www.amazon.com/FPGA-Prototyping-VHDL-Examples-Spartan-3/dp/0470185317
quelle