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
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:
Mit den obigen Links (insbesondere dem ersten) und dem Buch sollten Sie in kurzer Zeit "up to speed" sein.
"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!!
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).
Olin Lathrop
Kohlschmied
Oli Glaser
user_1818839
Al Bennett