Wie man ein Prozessordesign auf FPGA bringt

Ich habe mich kürzlich auf eine lange Reise des selbstlernenden Logikdesigns begeben. Das Endprodukt davon ist eine funktionsfähige 16-Bit-CPU, die genau so funktioniert, wie sie in einem Simulator entworfen wurde . Jetzt habe ich gerade angefangen, die Möglichkeit zu untersuchen, es über ein FPGA in Silizium zu stecken. Ich weiß, dass ich viele Anpassungen im Ein-/Ausgabebereich vornehmen muss (die reale Welt unterscheidet sich von der Simulationsumgebung) und habe festgestellt, dass ich mein Design vollständig in einem Programm erstellt habe, das keine Netzlisten oder HDL-Code exportiert Also habe ich eigentlich nur einen Schaltplan.

Aber angenommen, ich komme irgendwie an einen Punkt, an dem ich eine Netzliste oder einen HDL-Code meines Designs habe, was ist mein nächster Schritt, um ihn in Silizium zu bringen? Soweit ich bisher gelesen habe, sieht es so aus, als wären FPGAs meine Lösung, aber wenn ich mir die Websites von Xilinx und Altera anschaue, dreht sich mir der Kopf. Belle ich den falschen Baum an? Im Grunde suche ich nach einer einfachen englischen Beschreibung dessen, was der nächste Schritt für einen Typen mit einem Funktionsschema einer CPU ist. Sobald ich weiß, in welche Richtung ich gehen muss, kann ich die Bücher knacken und alles herausfinden, was ich wissen muss, um dorthin zu gelangen. Auch eine Anmerkung, ich bin auf Mac OS X, aber ich habe eine Windows XP-Box, die ich anschließen kann, wenn ich unbedingt muss.

In welchem ​​Programm hast du dein Design gemacht? Möglicherweise gibt es Konverter von Drittanbietern.

Antworten (7)

Herzlichen Glückwunsch zu Ihrem CPU-Design. Ja, das FPGA ist definitiv Ihr nächster Schritt. Aber dir ist nicht ganz klar, was dir den Kopf verdreht. Ich vermute, es liegt an der Vielzahl der angebotenen Geräte. Sie sagen auch nicht, welchen Simulator Sie verwenden.
Wenn Sie ein Design synthetisieren, sollte der Synthesizer Ihnen einen Bericht über die verwendeten Ressourcen wie Anzahl der Gates und RAM geben. Dies sollte Ihnen eine Vorstellung davon geben, welche Teile für Ihr Design geeignet sind. Achten Sie auf genügend Kopffreiheit . Wählen Sie einen Teil aus, der über zusätzlichen RAM verfügt, den Sie zum Ausführen von Programmen auf Ihrer CPU benötigen.

bearbeiten (bezüglich Ihres Kommentars)
Sie benötigen ein Entwicklungssystem für einen bestimmten Hersteller. Altera und Xilinx sind die Big Player, und beide haben ihre Anhänger. Welche Sie wählen, ist nicht so wichtig, beide haben genug verschiedene Teile, um Ihre Bedürfnisse zu befriedigen.
Wenn Sie sich für Xilinx entscheiden würden, gibt es die ISE WebPACK Design Software , die kostenlos ist (großer Download bei 3,4 GB). Die Einschränkungen im Vergleich zu fortgeschritteneren Versionen der Software sollten Sie zu diesem Zeitpunkt nicht stören.
Als nächstes benötigen Sie ein Entwicklungsboard. Sie müssen eine Vorstellung davon haben, welches FPGA Sie benötigen, um eines auszuwählen. Wenn Sie sich für Xilinx entscheiden, würde ich einen Spartaner wählen, vielleicht ein Spartan-6, der Virtex ist meiner Meinung nach schon zu High-End. Es gibt immer noch eine große Auswahl, die sich hauptsächlich in den Extras auf dem Brett unterscheidet. Sie möchten ein Board mit etwas mehr als ein paar Schaltern und LEDs. Ich würde nach einem Tastaturanschluss und einem Anzeigemodul Ausschau halten.
Xilinx hat eine Reihe von Boards, und für Xilinx-FPGAs gibt es auch Digilent , Avnet , Xess und viele andere.

Vergleichen Sie also eine Reihe von Boards (der Preis wird auch eine Rolle spielen, nehme ich an) und laden Sie die Entwicklungssoftware für das FPGA herunter, das Sie verwenden möchten. Synthetisieren Sie Ihr Design, um zu überprüfen, ob es in das gewählte FPGA passt, und dann sind Sie bereit, ein Board um dieses FPGA herum zu kaufen.

Ich habe vergessen, ein bisschen über FPGAs zu erzählen. Ein FPGA ist im Grunde eine große Sammlung von Gattern mit programmierbaren Verbindungen zwischen ihnen, sodass Sie damit fast jede Logikfunktion / jedes Logiksystem erstellen können. Über mehrere Generationen hinweg wurden FPGAs immer fortschrittlicher und verfügen nun über optimierte Blöcke, um Funktionen wie RAM effizient zu erstellen. Der Synthesizer Ihrer Entwicklungssoftware erstellt das Verbindungsdiagramm zwischen den Gattern. Diese wird nicht dauerhaft im FPGA gespeichert, sondern muss beim Einschalten aus einem externen Konfigurations-Flash-Speicher geladen werden. Dort wird Ihr Design gespeichert. Wie jeder andere Flash-Speicher kann er viele Male gelöscht und neu beschrieben werden.

Ich habe Logisim verwendet, das für die Schaltpläne fantastisch ist, aber keine Methode zur Ausgabe von etwas anderem als Bildern (png, jpeg usw.) hat. Bei den FPGA-Verwirrungen, die ich habe, liegt es teilweise an der großen Auswahl an Geräten, aber ich finde auch keine Ressourcen, die die Grundlagen und Grundlagen erklären. Wenn ich meine CPU dort platziere, wie verbindet sie sich mit der Außenwelt? Welche Ausrüstung brauche ich? Kann ich das FPGA wiederholt neu programmieren? usw. usw. usw. Es ist wirklich nur ein völliger Mangel an Vertrautheit mit dem Thema. Ich schätze, ich brauche einen Starter Guide, aber ich finde nirgendwo einen.
Ihre Fragen in dieser Reihenfolge: 1) FPGAs sind über I/O-Pins mit der Außenwelt verbunden. Der Unterschied besteht darin, dass Sie die Pins im Gegensatz zu dedizierten Chips auswählen können. 2) Sie können mit einem Starterkit, Entwicklungskit oder ähnlichem beginnen. Dies wird das FPGA, einige Anschlüsse für I/O und Netzteile an Bord haben. Die meisten beinhalten auch den Programmierer; wenn man nicht vergisst sich einen zu besorgen. 3) Ja, Sie können das FPGA neu programmieren. Das Programm wird auf dem Chip in einem riesigen Schieberegister gespeichert. Beim Start lädt eine dedizierte Zustandsmaschine oder eine externe Quelle es in den Chip.

Ich bin mit den Werkzeugen von Xilinx nicht vertraut, aber ich kenne die von Altera, also werde ich Ihnen etwas über ihre erzählen. Xilinx und andere sollten nicht zu unterschiedlich sein.

Verilog

Das erste, was Sie tun müssen, ist Verilog zu lernen . Das wird Ihnen Kopfschmerzen bereiten, weil Verilog (und das etwas ähnliche VHDL) zuerst als Simulationssprache entwickelt wurde, und viele Konstrukte (wie #5was bedeutet "warte 5 Zeitschritte", ein Zeitschritt ist normalerweise eine Nanosekunde). Es gibt also viele Einschränkungen, die Sie beachten müssen, um Ihren Verilog-Code synthetisierbar zu machen , dh in einen Bitstrom für ein FPGA kompilierbar.

Der größte Schock ist jedoch, dass das, was Sie in Verilog (und VHDL) schreiben, das Verhalten ist, das Sie vom System erwarten , und der Compiler die richtige Logik aus Ihrer Beschreibung ableitet . Wenn Sie nicht aufpassen, können Sie viele böse Fehler davon bekommen.

Ein D-Flip-Flop sieht beispielsweise so aus:

always @(posedge RESET or posedge CLK)
begin
    if(RESET)
        Q <= 1'b0;
    else if(CLK_ENA)
        Q <= D;
end

Dies beschreibt, wie ein DFF funktioniert, und der Compiler muss es analysieren und herausfinden, dass Sie ein DFF möchten. Dies @(...)wird als Sensitivitätsliste bezeichnet, bei der es sich um eine Liste von Signalen handelt, die eine Neubewertung des Codeblocks auslösen; ändert sich also in diesem Block Qnur, wenn eine steigende Flanke an RESEToder vorhanden ist CLK(dies ist für einen aktiv-hohen Reset). Wenn Sie etwas in der Sensitivitätsliste vergessen (die alle Variablen auf der rechten Seite ohne irgendwelche posedgeoder negedgeModifikatoren für einen kombinatorischen Logikblock enthalten sollte), synthetisiert der Compiler nach Bedarf Latches, anstatt einen Fehler aufzurufen. Verrückt, aber so ist es, denn Verilog war ursprünglich eine Simulationssprache, die Implementierungsdetails verbarg (und daher nicht benötigte). VHDL ist das gleiche, aber viel ausführlicher.

Schließlich wurde vor ein paar Jahren eine neue Version von Verilog namens SystemVerilog veröffentlicht, die das Schreiben von synthetisierbarem Code viel, viel einfacher macht . Wenn möglich, lernen Sie diese Sprache, da sowohl Xilinx ISE als auch Altera Quartus II sie unterstützen. Das Hauptproblem ist der völlige Mangel an gutem Referenzmaterial.

Die SystemVerilog-Version eines DFF bereinigt ein paar kleine Dinge:

always_ff @(posedge RESET, posedge CLK)
begin
    if(RESET)
        Q <= '0;
    else if(CLK_ENA)
        Q <= D;
end

Beachten Sie, dass die Signale in der Empfindlichkeitsliste durch Kommas getrennt sind. Dies liegt daran , dass ores verwirrend war, da andes dort nicht funktionieren konnte. Beachten Sie auch die Ersetzung von 1'b0(einem einzelnen 0Bit) durch '0(ein Symbol, das auf beliebig viele 0Bits erweitert wird, je nachdem, was ihm zugewiesen wird; viel flexibler mit parametrisierten Modulen). Beachten Sie schließlich den Ersatz von always(der für alles verwendet werden könnte; kombinatorische Logik, Latches und Flip-Flops), mit always_ffdem der Inhalt zu Flip-Flops synthetisiert werden muss. Es gibt auch eine always_comb, die die Empfindlichkeitsliste eliminiert, da sie nur die Empfindlichkeiten von den Eingängen zum Block ausarbeitet.

Die Designsoftware von Altera heißt Quartus II, und Sie werden nach der Web Edition suchen . (Die Abonnement-Editionen sind ziemlich teuer und werden nur für die schnellsten oder neuesten FPGA-Modelle benötigt.)

Das Traurige daran ist, dass ich kein gutes Buch zu diesem Thema gefunden habe. Was ich gelernt habe, habe ich bekommen, indem ich Dinge aus mehreren Quellen zusammengefügt habe, wie zum Beispiel Verilog-Bücher, die Ihnen nicht gut sagen, was synthetisierbar ist und was nicht, und Beispielcode. Quartus II verfügt über einen "Vorlage einfügen"-Befehl, der Vorlagencode für mehrere gängige Strukturen einfügt, von D-Flip-Flops bis hin zu Zustandsmaschinen.

Demo-Hardware

Nachdem Sie Ihren Prozessor in Verilog implementiert haben, müssen Sie ihn erstellen. Überlassen Sie vorerst Quartus die Auswahl des Chips (Sie müssen die Familie auswählen; ich würde den Cyclone IV empfehlen) und die Pinbelegung. Sobald es aufgebaut ist, wissen Sie, wie viel Chip Sie benötigen. Es wird Ihnen sagen, wie viele Logikelemente, Flip-Flops, RAM-Bits usw. Sie verwendet haben. Stellen Sie sicher, dass Sie bei keinem davon mehr als 50 % haben; Wenn ja, schauen Sie sich den Chip an, den der Compiler ausgewählt hat, und wählen Sie manuell den nächstgrößeren Chip (in Logikelementen) aus, der mindestens so viele Pins hat, und wiederholen Sie den Vorgang, bis Sie eine Auslastung von weniger als 50% erreichen.

Dann kaufen Sie ein Demo-Board, das einen Chip hat, der mindestens so groß ist wie der, mit dem Sie letztendlich gebaut haben. Überprüfen Sie, ob es über die Peripheriegeräte und/oder E/A-Anschlüsse verfügt, die Sie benötigen. Es ist nicht ungewöhnlich, eine Tochterkarte zu bauen, die in einen Erweiterungsanschluss gesteckt wird, um fehlende Hardware bereitzustellen.

Nachdem Sie Ihre Hardware ausgewählt haben, ermitteln Sie die tatsächlichen Pinbelegungen und verwenden Sie den Pin-Planer, um die richtigen Signale an die richtigen Pins zu legen. Das Demoboard enthält ein Benutzerhandbuch, das Ihnen mitteilt, welche Pins mit welchen Geräten oder Anschlusspins auf dem Demoboard verdrahtet sind.

Sobald Sie die Pinbelegung erhalten haben, erstellen Sie es erneut, damit es die gewünschten Pins verwendet. Denken Sie daran, dass einige Signale wie Systemuhren dedizierte Eingangspins benötigen (damit sie direkt zu den internen PLLs geleitet werden).

Verwenden Sie den Programmierer, um Ihr Design direkt in das FPGA herunterzuladen (das Schieberegister, das ich vor einiger Zeit erwähnt habe). Jetzt befinden Sie sich im vertrauten Debugging-Zyklus Bearbeiten-Kompilieren-Ausführen. Schlagen Sie darauf, bis es funktioniert.

Sobald es funktioniert, können Sie den Programmierer verwenden, um den Code in das integrierte Konfigurationsgerät herunterzuladen, damit Ihr Programm beim Einschalten geladen und ausgeführt wird.

Das war ziemlich lang, und ich hoffe, es hat einigen geholfen. Es gibt viel zu lernen; es ist nicht so sehr wie das Erlernen einer neuen Programmiersprache, sondern eher wie das Erlernen eines neuen Programmierparadigmas, z. B. der Wechsel von prozeduralen zu funktionalen Sprachen. Verilog ist eine simultane Sprache; Der größte Teil des Codes wird immer ausgeführt.

Viel Glück!

Super, das ist sehr hilfreich. Nur um eines zu überprüfen, ich habe von der schematischen Erfassung gehört. Ist das eine praktikable Alternative zum Erlernen von Verilog? Ich werde es lernen, wenn ich muss, aber wenn es nicht 100% notwendig ist, würde ich es lieber nicht zu der riesigen Liste von Dingen hinzufügen, die ich bereits herausfinden muss. Vielen Dank.
Ehrlich gesagt nicht wirklich. Ein großes Problem ist, dass Sie dem Schaltplan-Erfassungsprogramm ausgeliefert sind: Wenn es Ihren Schaltplan nimmt und ein falsches Verilog generiert, was können Sie tun? Während das Schreiben von Verilog Ihnen die erforderliche Autorität gibt, um alle Fehler zu beheben. Der Hauptgrund ist jedoch, dass es Dinge gibt, die Schematic Capture niemals so gut machen wird wie Verilog: Parametrierte Module und Bus-Splitting und -Merge sind diejenigen, die einem sofort in den Sinn kommen.
Gibt es Tools, die eine etwas "hardwarebeschreibendere" Sprache in Verilog oder VHDL umwandeln können (z. B. wenn ich möchte, dass net Z ein Flip-Flop ist, dessen Dateneingang eine Kombination aus A, B und C ist, die währenddessen asynchron zurückgesetzt wird C und D stimmen, es wäre schön, so etwas sagen zu können, Z:= A & (B # C); Z.ar = C & D;ohne sich um Sensitivitätslisten und dergleichen kümmern zu müssen).
Mit Altera Quartus können Sie Ihr Design als Schaltplan oder AHDL (Alteras Version von VHDL) oder eine beliebige Kombination davon eingeben, wahrscheinlich einschließlich anderer HDLs. (Da ich altmodisch bin, habe ich hauptsächlich die schematische Eingabe für meine CPLD- und FPGA-Projekte mit ein wenig AHDL verwendet.)
Um es klarzustellen, AHDL ist keine Version von VHDL. Sowohl VHDL als auch Verilog sind Inferenzsprachen , bei denen Ihr Code das Verhalten der gewünschten Schaltung beschreibt und der Compiler die Implementierung aus dieser Verhaltensbeschreibung ableiten muss. Dies ist ein Vermächtnis der Tatsache, dass beide als Simulationssprachen begannen und für die Synthese wiederverwendet wurden. AHDL ist eine deklarative Sprache, in der Sie Primitive (z. B. Flip-Flops, Wahrheitstabellen) deklarieren und wie sie verbunden sind, sodass der Compiler nicht raten muss. AHDL stammt aus den 80er Jahren und ist viel näher an ABEL.
Allerdings hat Altera die Verwendung von AHDL für neue Arbeiten eingestellt und unterstützt hauptsächlich VHDL und Verilog. Sie drängen die Leute auch von der schematischen Eingabe ab, die für parametrisierte Designs viel schwieriger zu verwenden ist. FYI, ich habe früher auch Schaltpläne verwendet, mit AHDL für einige Low-Level-Sachen wie Wahrheitstabellenlogik oder Zustandsmaschinen. Der Schaltplan-Editor in der alten MAX+PLUS-Software (Vorgänger von Quartus) war viel besser als der Editor von Quartus. Dies war jedoch, bevor ich viel Code zwischen Projekten wiederverwendete oder die Versionskontrolle durchführte.

Ja, FPGAs sind mit ziemlicher Sicherheit Ihre Lösung!

Sie müssen mit ziemlicher Sicherheit eine der Hardwarebeschreibungssprachen verwenden oder Ihre Schaltpläne in einem anderen Tool erneut eingeben. Ich würde gegen den schematischen Ansatz als empfehlen

  1. Die FPGA-Tool-Anbieter unterstützen sie nicht wirklich gut
  2. Es ist nicht tragbar

Sobald Sie HDL geschrieben haben, haben Sie Code, den Sie fair auf andere Chips portieren können, solange Sie nicht direkt Dinge aus der Bibliothek des Anbieters mit ihren verschiedenen "IP-Assistenten" oder durch direktes Einfügen von Komponenten aus ihren Bibliotheken einfügen einfach (viel mehr als zum Beispiel das Portieren von eingebettetem C IME)

Außerdem haben Sie eine viel bessere Test- und Validierungsumgebung, da Sie Tests schreiben können, die Ihre Funktionalität "verstehen" und die Ergebnisse für Sie überprüfen können, anstatt auf die Wellenformen zu starren, um zu sehen, ob alles in Ordnung aussieht.

Die großen 2 HDLs sind VHDL und Verilog. Vielleicht möchten Sie diese Antwort lesen, um zu erfahren, wie sie sich unterscheiden ...

VHDL oder Verilog?

Ich würde auch sagen, dass MyHDL auch einen Blick wert ist, wenn Sie Python bereits kennen - es bietet Ihnen eine enorme Überprüfungsfähigkeit, aber immer noch den größten Teil der Kontrolle auf niedriger Ebene, die ein "normales" HDL bietet.

Sobald Sie sich für eine HDL entschieden haben und diese dann in einer Simulation zum Laufen gebracht haben (nochmals Entschuldigung!), befinden Sie sich in einem Zustand, in dem Sie sie durch die Tools des Anbieters schieben und den nächsten großen Teil der Aufgabe lernen können - sobald sie simuliert ist Richtig, es ist immer mehr Aufwand als Sie denken, es zu synthetisieren :)

Wenn Sie mit Schaltplänen verheiratet sind und eine Lizenz bekommen können, könnte LabviewFPGA zu Ihnen passen.

Holen Sie sich eine Kopie von Rapid Prototyping of Digital Systems von Hamblen et al:

http://users.ece.gatech.edu/~hamblen/book/bookte.htm

Es verwendet hauptsächlich VHDL, was ich Verilog vorziehe.

Es enthält eine sehr einfache 8-Bit-CPU, den uP3, den ich vor einigen Jahren mit einer früheren Ausgabe des Buchs auf meiner eigenen Altera FLEX 10K-Hardware implementiert habe. Ich werde es auf dieses 25-Dollar-Cyclone-II-Board portieren, wenn ich mein "Frontpanel" -PCB fertig habe. Es enthält auch einen MIPS- und Altera NIOS II-Prozessor. Sie könnten die uP3-Übungen im Buch mit den kostenlosen Altera Quartus II-Tools durcharbeiten, Ihren CPU-Code in VHDL umschreiben und ihn auf einem Cyclone II-Board zum Laufen bringen. Alternativ hat Quartus II einen schematischen Eintrag, und Sie sollten in der Lage sein, Ihren Schaltplan direkt einzugeben, zu simulieren und auf dem Cyclone II auszuführen.

Wenn die Schwierigkeit eine steile Lernkurve mit Werkzeugkenntnissen ist, dann folgen Sie dem einfachsten Weg. Actel (jetzt Microsemi) hat Libero , das Paket von FPGA-Tools, die Null-Lesen erfordern und einfach zu verwenden sind: sofort nach der Installation. Sie können dort Schaltpläne tatsächlich von Hand erstellen und mit wenigen Klicks auf das physische FPGA hochladen, die Bildschirme auf dem Weg dorthin sind sehr selbsterklärend.

Wenn Sie sich entscheiden, eine HDL zu lernen, kann Ihr Standort Einfluss darauf haben, welche die bessere Sprache ist. In Europa ist VHDL beliebter. In den USA ist Verilog beliebter, mit Ausnahme der Verteidigungsindustrie, die VHDL ist. (VHDL wurde ursprünglich vom US-Verteidigungsministerium erstellt) Das bedeutet nur, dass Menschen in Ihrer Nähe möglicherweise besser in der einen oder anderen Sprache helfen können. Wenn Sie jedoch online nach Hilfe suchen, ist dies möglicherweise irrelevant.

Andere in Betracht zu ziehende Bücher sind Rapid Prototyping of Digital Systems: SOPC Edition , das sich auf die Altera DE1- und DE2-Boards bezieht. Es gibt bereits eine Reihe verschiedener Computer, die auf DE1 und DE2 portiert wurden, um Ihnen eine Vorstellung davon zu geben, wie sie funktionieren. Minimigtg68 (Amiga), FpgaGen (Sega Genesis), etc. sind auf dieses Board portiert, um es sich als Beispiele anzusehen.

Wenn Sie nach Xilinx gehen, gibt es zwei Bücher, die ich gerade mag. FPGA-Prototyping von Verilog Beispiele: Xilinx Spartan-3-Version FPGA-Prototyping von VHDL-Beispielen: Xilinx Spartan-3-Version Obwohl ich kein bestimmtes Board kenne, das ich mit diesen empfehlen könnte. Ich freue mich auf ein hoffentlich bald erscheinendes Board, FPGA Arcade , aber ich vergesse, ob es ein Xilinx oder etwas anderes haben wird.

Ich habe diese Variante gefunden, die Logisim weiterentwickelt und jetzt Logisim Evolution heißt. Sie implementierten eine Funktion zum Exportieren von Schaltplänen einer in logisim integrierten Logikschaltung nach VHDL.

Es ist hier zu finden: https://github.com/reds-heig/logisim-evolution

Wisse, dass diese Frage alt ist, aber sie hat mir sehr geholfen, und ich hoffe, sie hilft jemand anderem.