Denken beim Arbeiten mit VHDL oder Verilog

Alle meine Erfahrungen gehören zu Allzweck-Programmiersprachen, zB; c/c++ usw., wo alle Anweisungen nacheinander ausgeführt werden, aber es scheint, dass in VHDL/Verilog alle Anweisungen auf einmal ausgeführt werden (parallele Prozesse)

Ich frage mich nur, ob es für Programmierer allgemeiner Sprachen eine Ressource gibt, um zu verstehen, wie VHDL funktioniert.

Referenz: http://en.wikibooks.org/wiki/Programmable_Logic/Parallel_Execution

Das VHDL-Handbuch? Irgendwo gibt es doch bestimmt eine Anleitung!
Nein, es gibt kein VHDL-Handbuch. Ich habe mir viele, viele VHDL-Bücher angesehen und sie sind alle scheiße. Es ist unglaublich. Sie sind alle von Akademikern geschrieben und lehren auf die gleiche Weise ... wie man Dinge falsch macht, auf die nicht synthetisierbare Weise.
@Olin - Andrew hat Recht, es gibt wirklich nicht viele anständige HDL-Bücher, die sich auf gute FPGA-Designpraktiken und synthetisierbaren Code konzentrieren. Ich erinnere mich, genau dasselbe für Verilog gedacht zu haben. Ich denke, es liegt vielleicht daran, dass beide (IIRC) Sprachen ursprünglich nicht für diesen Zweck gedacht waren, sondern nur eine Simulation. Später wurde die Unterstützung für die Synthese hinzugefügt.
Am nächsten kommt immer noch Ashendens "Designer's Guide to VHDL" (entweder eine Neuauflage, oder die alte ergänzt um "VHDL-2008 - just the new stuff")
Mein Dozent an der Universität hat ein kurzes Buch namens "VHDL for Synthesis" geschrieben, das im Wesentlichen das Lehrbuch des Kurses war. Es ist kurz und unkompliziert, mit vielen Beispielen, die alle synthetisierbar sind. Es ist hier erhältlich: lulu.com/gb/en/shop/david-binnie/vhdl-for-synthesis/ebook/…

Antworten (5)

Bei HDL-Sprachen müssen Sie verstehen, dass Sie Hardware und nicht Software beschreiben. Ich denke, das ist grundlegend, um "den Dreh raus zu bekommen". Die Reihenfolge des Codes in Ihrem Modul spielt keine Rolle, es passiert alles auf einmal.
Es ist nicht so schlimm, sobald Sie losgelegt haben - nachdem Sie ein paar einfache Module entworfen haben (z. B. Zähler, Addierer, Mux usw.), sollte sich Ihr Geist ganz natürlich an den Prozess anpassen.

Das beste Buch, das ich gelesen habe, um mit HDL loszulegen, ist Pong Chus „FPGA-Protoyping by Verilog-Beispiele“ (ich verwende Verilog, aber es gibt auch eine VHDL-Version dieses Buchs). Es konzentriert sich hauptsächlich auf die synthetisierbaren Sachen, was Sie wollen für FPGAs zu wissen, abgesehen von zB Testbench-Code, dem auch ein eigenes Kapitel gewidmet ist. (Ich gehe davon aus, dass Sie daran interessiert sind, HDL für FPGAs/CPLDs zu verwenden.)

Abgesehen davon sind ein paar gute Netzressourcen, die ich im Laufe der Zeit mit einem Lesezeichen versehen habe:

FPGA4Fun.com

Edaboard PLD-Forum

ASIC-Welt

Mit den obigen Links (insbesondere dem ersten) und dem Buch sollten Sie in kurzer Zeit "up to speed" sein.

Pong Chu mag auf Verilog in Ordnung sein, aber ich habe kürzlich ein ziemlich ekelhaftes (aber technisch korrektes) Stück VHDL voller stilistischer Anfängerfehler gesehen, das hier gepostet wurde; es wurde aus dem Pong Chu-Buch gehoben! Ich vermute, das Problem ist, dass er Verilog in beiden Sprachen geschrieben hat.
@BrianDrummond - Ah okay, danke für die Info - ich habe nur das Verilog-Buch gelesen, das sehr gut ist (obwohl ich seinen Verilog-Stil nicht verwende, da es für ein großes Projekt etwas langatmig ist, ist das Buch auf jeden Fall lesenswert beim Start)
Ich mag Chus-Bücher. Aber die allgemeine Idee ist, dass Sie kein Programm schreiben, sondern eine Schaltung entwerfen. Denken Sie darüber nach, wie die Logikgatter funktionieren, wie sie auf Eingaben im Verhältnis zueinander reagieren und wie sich Drähte verhalten. Das tun Sie in Ihrem Code. Nun, sim testbench ist eher ein Programm, kann aber immer noch teilweise wie Schaltungsdesign sein. Aber Designcode, den Sie in FPGA oder Silizium bauen möchten, ist alles Schaltungsdesign. Ich musste aus der Programmiermentalität herauskommen, um dieses Zeug wirklich zu bekommen.

"Alle Anweisungen werden auf einmal ausgeführt" ist auch nicht ganz so...

Ich denke, eine sehr gute Beschreibung, wie die Planung von "Anweisungen" (als "Aktualisierungen von Werten" gesehen) hier zu finden ist:

http://www.sigasi.com/content/vhdls-crown-jewel

Sobald Sie verstanden haben, wie Signal- und Variablenaktualisierungen funktionieren, können Sie sich darauf konzentrieren, in kleineren Abschnitten zu beschreiben, was passieren soll, wobei Signale zwischen ihnen kommunizieren

Stellen Sie sicher, dass Sie in dieser Phase häufig synthetisieren und simulieren, da Sie feststellen werden, welche Teile der Sprache nicht in einen Chip gesteckt werden können. Darüber hinaus werden Sie auch entdecken, welche Arten von Codierungsstilen lange Logikketten produzieren, die dem Erhalt eines funktionierenden Chips "im Weg stehen". Hardware-Typen sagen gerne Dinge wie „Du musst lernen, in Hardware-Begriffen zu denken“. Sie vergessen, wie schwierig das ist, es sei denn, Sie können es bereits - aber Ihren Code zu nehmen, ihn zu synthetisieren und die Ergebnisse im Schaltplan-Viewer anzusehen, ist wahrscheinlich, wie wir es alle vor vielen Jahren tatsächlich gelernt haben, und es wird auch für Sie funktionieren.

(Eine andere Sache, die Nicht-Elektronik-Typen übersehen, bis es sie beißt, ist, dass Sie an den Pins des Geräts darauf achten müssen, Signale in das Innere des Chips zu synchronisieren. Es gibt hier irgendwo andere Fragen dazu!)

In C oder C ++, Java usw. erstellen Sie im Wesentlichen eine Abfolge von Ereignissen, die der Reihe nach ablaufen. Verstehen Sie, dass Sie in einem HDL nur ein sequentielles Programm in der Testbench durchführen, um eine zeitliche Abfolge von Signalwerten zu erhalten.

Der gute Teil der Codierung in HDL besteht tatsächlich darin, eine Schaltungsnetzliste zu entwerfen, kein Programm. Stellen Sie sich ein Gehäuse oder einen Schalterblock als Multiplexer vor. Eingänge sind Drähte, Ausgänge sind Drähte, in der Mitte ist kombinatorische Logik. auf Silizium oder auf einem Steckbrett, ein Draht wartet nicht darauf, dass er an der Reihe ist, was er tun soll. Ein 74xx-Nand-Gate wartet nicht darauf, dass man ihm sagt, was es tun soll. Es ist immer ein Nand-Gatter, und es ist immer ein Nand, solange der Strom eingeschaltet ist. Ein Multiplexer multiplext immer. Ein Wechselrichter invertiert immer. Dann floppen Flops immer an jeder Taktflanke, und ein Latch rastet immer bei seiner Freigabe ein. Genauso, als ob Sie einen Schaltplan gezeichnet hätten. Module und Entitäten sind dasselbe wie ein hierarchisches Schema. Es machte für mich viel mehr Sinn, als ich aufhörte, es als Programm zu betrachten, und stattdessen anfing, die Schaltung zu sehen.

Meine Lieblingsreferenz ist Chus RTL Hardware Design Using VHDL. Sogar Verilog-Leute würden von dem Konzeptzeug profitieren, aber es ist alles VHDL-Syntax. http://www.amazon.com/gp/aw/d/0471720925/ref=mp_s_a_1?qid=1360628255&sr=8-1&pi=SL75

Ich habe festgestellt, dass eine vorteilhafte Möglichkeit, Prozeduren in VHDL auszudrücken, darin besteht, die endliche Zustandsmaschine zu berücksichtigen. Indem Sie Ihren Algorithmus als Zustände in einem FSM visualisieren, können Sie damit beginnen, Ihren Code in etwas umzugestalten, das auf einmal ausgeführt werden kann und nur Schritt für Schritt aufgrund des FSM ausgeführt wird.

Ich sage nicht, dass Sie für jede Zeile ähnlich funktionierenden C++-Codes einen Zustand erstellen müssen (obwohl das theoretisch funktionieren würde), aber Sie können damit beginnen, Dinge wie Zuweisungen und Berechnungen zu gruppieren und sie an einen Zustand zu übergeben, der gleichzeitig ausgeführt werden soll die FSM tritt in diesen Zustand ein.

Jetzt wird Ihr "Programm" zu einem FSM, das in VHDL eine große Case-Switch-Anweisung (basierend auf dem Status des FSM) und eine Logik dafür ist, wie der Status aktualisiert werden muss, um zum nächsten Status zu wechseln Ihr Algorithmus.

Hoffe das hilft!!

Beachten Sie, dass ein FSM viel kombinatorische Logik (was werden alle nächsten Ausgangssignale sein und was der nächste Zustand sein wird) plus eine relativ kleine Menge an sequentieller Logik ist, um den neuen aktuellen Zustand, neue Ausgangswerte usw. zu erfassen, wenn die Taktflanke kommt.
In der Hardware, stimmt. Und das ist tatsächlich das Endergebnis auf dem FPGA oder was auch immer Sie verwenden. Mit den modernen Compilern, die heutzutage verfügbar sind, ist es jedoch nicht erforderlich, all diese Logik explizit zu definieren. Alles, was Sie wirklich brauchen, ist ein wenig Testlogik (wenn ... dann, nicht UND ODER), um zu entscheiden, was als nächster beabsichtigter Zustand gespeichert werden soll. Von einem Hardware-Standpunkt aus gesehen ist es sinnvoll, aber die Frage fragt nach Dingen in Bezug auf c/c++, von der sequentiellen Programmierung zu VHDL, nicht von Hardware zu VHDL.

VHDL und Verilog wurden ursprünglich als Sprachen entwickelt, um Hardware für die Simulation zu beschreiben. Sie wurden später als Sprachen zur Beschreibung von Hardware für die Synthese wiederverwendet.

Es gibt zwei Strategien zur Beschreibung von Hardware, Verhalten und Struktur. Bei der Verhaltensbeschreibung verwenden wir Programmcode, um zu beschreiben, wie sich unsere Hardware verhält. In der strukturellen Beschreibung beschreiben wir unsere Hardware in Bezug auf kleinere Hardware.

Die meisten praktischen Designs verwenden eine Mischung aus beidem. Sie haben also kleine Verhaltensblöcke (immer Blöcke in Verilog, Prozesse in VHDL) innerhalb eines strukturellen Gesamtentwurfs.

Normalerweise haben wir zwei Haupttypen von Verhaltensblockaden. "kombinatorische" Blöcke definieren eine kombinatorische Funktion ihrer Eingaben. Logischerweise werden sie ausgeführt, wenn sich eine Eingabe ändert, und sie haben keinen Speicher.

Sequentielle Blöcke werden normalerweise geschrieben, um zu definieren, was nach der Taktflanke im Hinblick darauf passiert, was vor der Taktflanke passiert ist. Auf diese Weise schaffen wir es, ein deterministisches Design aufrechtzuerhalten, obwohl alle Blöcke, die von derselben Taktflanke getriggert werden, in einer nicht deterministischen Reihenfolge im Simulator und gleichzeitig in der synthetisierten Hardware ablaufen.

Wenn Sie vorhaben, Ihren Code zu synthetisieren, müssen Sie darüber nachdenken, was die Dinge strukturell bedeuten, selbst wenn Sie sie verhaltensmäßig definieren, denn das erste, was der Synthesizer tun wird, ist Ihre Verhaltensbeschreibung in eine strukturelle zu übersetzen. Schleifen werden entrollt, arithmetische und logische Anweisungen werden zu arithmetischen und logischen Hardware-Blöcken. Flusssteuerungsanweisungen werden zu Multiplexern (möglicherweise sehr breite).