Ich kenne die Werkzeuge von Xilinx nicht, aber ich kenne die von Altera, also erzähle ich Ihnen von ihnen. Xilinx und andere sollten nicht zu unterschiedlich sein.
Verilog
Als Erstes müssen Sie Verilog lernen . Dies wird Ihren Kopf verletzen, da Verilog (und die etwas ähnliche VHDL) zuerst als Simulationssprache entwickelt wurde und viele Konstrukte (wie zum Beispiel #5
"Warte 5 Zeitschritte", wobei ein Zeitschritt normalerweise eine Nanosekunde ist). Es gibt also eine Reihe von Einschränkungen, die Sie beachten müssen, um Ihren Verilog-Code synthetisierbar zu machen , dh in einen Bitstream für ein FPGA zu kompilieren.
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 leitet die richtige Logik aus Ihrer Beschreibung ab. Wenn Sie nicht aufpassen, können Sie viele böse Bugs 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 eine DFF funktioniert, und der Compiler muss sie analysieren und herausfinden, ob Sie eine DFF wollen. Die @(...)
wird als Sensitivitätsliste bezeichnet. Hierbei handelt es sich um eine Liste von Signalen, die eine Neubewertung des Codeblocks auslösen. Daher Q
ändert sich in diesem Block nur, wenn eine steigende Flanke an RESET
oder CLK
vorliegt (dies ist für einen Aktiv-Hoch-Reset). Wenn Sie etwas in der Empfindlichkeit Liste vergessen (die alle der rechten seitige Variablen ohne enthalten sollten posedge
oder negedge
Modifikatoren für einen kombinatorischen Logikblock) wird die Compiler Riegel synthetisiert nach Bedarf anstattem Aufruf eines Fehler auf . Verrückt, aber so ist es, weil Verilog ursprünglich eine Simulationssprache war, die Implementierungsdetails versteckte (und daher keine benötigte). VHDL ist das gleiche, aber viel ausführlicher.
Schließlich wurde vor einigen Jahren eine neue Version von Verilog mit dem Namen SystemVerilog veröffentlicht, die das Schreiben von synthetisierbarem Code erheblich vereinfacht . Wenn möglich, lernen Sie diese Sprache, da Xilinx ISE und Altera Quartus II sie beide unterstützen. Das Hauptproblem ist der völlige Mangel an gutem Referenzmaterial.
Die SystemVerilog-Version eines DFF räumt ein paar Kleinigkeiten auf:
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. Das or
war verwirrend, da and
ich dort nicht arbeiten konnte. Beachten Sie auch das Ersetzen von 1'b0
(einem einzelnen 0
Bit) durch '0
(ein Symbol, das sich je nach 0
Zuweisung auf so viele Bits erweitert, wie erforderlich ist; viel flexibler bei parametrisierten Modulen). Beachten Sie schließlich das Ersetzen von always
(das für alles verwendet werden kann; Kombinationslogik, Latches und Flip-Flops), bei always_ff
dem der Inhalt zu Flip-Flops synthetisiert werden muss. Es gibt auch eine, always_comb
die die Sensitivitätsliste beseitigt, da sie nur die Sensitivitäten von den Eingängen zum Block berechnet.
Die Design-Software 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 ist, dass ich kein gutes Buch zu diesem Thema gefunden habe. Was ich gelernt habe, habe ich durch Zusammenfügen von Dingen aus mehreren Quellen erhalten, wie Verilog-Büchern, die Ihnen nicht gut sagen, was synthetisierbar ist und was nicht, und Beispielcode. Quartus II verfügt über einen Befehl "Vorlage einfügen", mit dem Vorlagencode für mehrere gängige Strukturen, von D-Flip-Flops bis hin zu Zustandsautomaten, eingefügt werden kann.
Demo-Hardware
Sobald Sie Ihren Prozessor in Verilog implementiert haben, müssen Sie ihn erstellen. Lassen Sie Quartus vorerst den Chip auswählen (Sie müssen die Familie auswählen; ich würde den Cyclone IV empfehlen) und die Pinbelegung. Sobald es sich verhält, wissen Sie, wie viel Chip Sie benötigen. Hier erfahren Sie, wie viele Logikelemente, Flip-Flops, RAM-Bits usw. Sie verwendet haben. Stellen Sie sicher, dass Sie bei keinem von diesen über 50% sind. Wenn ja, schauen Sie sich den Chip an, den der Compiler ausgewählt hat, und wählen Sie manuell den nächstgrößeren (in Logikelementen) Chip mit mindestens so vielen Pins aus. Wiederholen Sie diesen Vorgang, bis die Auslastung unter 50% liegt.
Dann kaufen Sie sich ein Demo-Board mit einem Chip, der mindestens so groß ist wie der, mit dem Sie schließlich gebaut haben. Stellen Sie sicher, dass die Peripheriegeräte und / oder E / A-Anschlüsse vorhanden sind, die Sie benötigen. Es ist nicht ungewöhnlich, eine Tochterkarte zu bauen, die in einen Erweiterungsanschluss eingesteckt 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 den richtigen Pins zu platzieren. Auf der Demo-Karte befindet sich eine Bedienungsanleitung, in der angegeben ist, welche Stifte mit welchen Geräten oder Anschlussstiften auf der Demo-Karte verbunden sind.
Wenn Sie die Pinbelegung festgelegt haben, erstellen Sie sie erneut, sodass die gewünschten Pins verwendet werden. Beachten Sie, dass einige Signale wie Systemtakte dedizierte Eingangspins benötigen (sodass sie direkt zu den internen PLLs geroutet werden).
Verwenden Sie den Programmierer, um Ihr Design direkt in das FPGA (das vor einiger Zeit erwähnte Schieberegister) herunterzuladen. Jetzt befinden Sie sich im vertrauten Debugging-Zyklus zum Bearbeiten, Kompilieren und Ausführen. Schlagen Sie darauf, bis es funktioniert.
Sobald dies funktioniert, können Sie den Code mithilfe des Programmiergeräts in das integrierte Konfigurationsgerät herunterladen , sodass 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 vielmehr wie das Erlernen eines neuen Programmierparadigmas, z. B. der Übergang von prozeduralen zu funktionalen Sprachen. Verilog ist eine Simultansprache. Der Großteil des Codes wird immer ausgeführt.
Viel Glück!