Was ist die Motivation bei der Verwendung von Verilog oder VHDL über C?


12

Ich komme aus einem Programmier-Hintergrund und habe nicht zu viel mit Hardware oder Firmware rumgespielt (höchstens ein bisschen Elektronik und Arduino).

Was ist die Motivation, Hardwarebeschreibungssprachen (HDL) wie Verilog und VHDL gegenüber Programmiersprachen wie C oder einigen Assemblys zu verwenden?

Ist dieses Problem überhaupt eine Frage der Wahl?

Ich habe gelesen, dass Hardware, deren Firmware in einer HDL geschrieben ist, einen klaren Vorteil darin hat, Anweisungen parallel auszuführen. Es überraschte mich jedoch, dass in den Diskussionen Zweifel an der Verwendung von Firmware in C oder Assembly geäußert wurden (wie ist Assembly geeignet, wenn Sie nicht unbedingt eine CPU haben?), Aber ich kam zu dem Schluss, dass dies auch eine Option ist.

Daher habe ich ein paar Fragen (zögern Sie nicht, etwas zu erklären):

  1. Eine Firmware kann wirklich entweder in HDL oder in einer Software-Programmiersprache geschrieben werden, oder ist es nur eine andere Möglichkeit, dieselbe Mission auszuführen? Ich würde gerne Beispiele aus der Praxis sehen. Welche Einschränkungen ergeben sich aus jeder Option?

  2. Ich weiß, dass Firmware häufig anstelle von Software in Hardwarebeschleunigern (wie GPUs, Netzwerkadaptern, SSL-Beschleunigern usw.) verwendet wird. Soweit ich weiß, ist diese Beschleunigung nicht immer notwendig, sondern nur zu empfehlen (zum Beispiel bei SSL und der Beschleunigung komplexer Algorithmen). Kann man in allen Fällen zwischen Firmware und Software wählen? Wenn nicht, würde ich mich über Fälle freuen, in denen Firmware eindeutig und eindeutig angemessen ist.

  3. Ich habe gelesen, dass die Firmware meist auf ROM oder Flash gebrannt hat. Wie ist es dort dargestellt? In Bits wie Software? Wenn ja, was ist der tiefgreifende Unterschied? Liegt es an der Verfügbarkeit angepasster Schaltkreise bei Firmware?

Ich glaube, ich habe hier und da einen Fehler gemacht, bitte vergib mir. Vielen Dank!


14
Programmiersprachen beschreiben Software, Hardwarebeschreibungssprachen beschreiben Hardware.
Ignacio Vazquez-Abrams

1
Sie schreiben keine Firmware mit Verilog oder VHDL - Sie verwenden Verilog oder VHDL, um Chips zu entwerfen, FPGA zu programmieren und Motherboards zu entwerfen. Sie verwenden C oder Assembly, um Firmware zu schreiben. Sie können C / C ++ auch zum Entwerfen von Motherboards verwenden - es gibt eine Bibliothek namens SystemC, die von einem C-Compiler kompiliert werden kann, um ein Programm zu erstellen, das Ihr Design simuliert, aber auch von einem SystemC-Compiler in Schaltkreise kompiliert werden kann.
Slebetman

FWIW: Da Sie Erfahrung mit Arduino haben, wird das Schreiben von Software für ein Arduino als Schreiben von Firmware bezeichnet. Firmware kann ein vollständiges Betriebssystem sein - Linux wird beispielsweise in der Firmware der meisten Router und Windows in der Firmware der meisten Geldautomaten verwendet
slebetman

Antworten:


28

Was ist die Motivation, Hardwarebeschreibungssprachen (HDL) wie Verilog und VHDL gegenüber Programmiersprachen wie C oder einigen Assemblys zu verwenden?

C und Assembly sind gute Sprachen, um einer CPU mitzuteilen, was zu tun ist. Sie beschreiben Aktionen, die sequentiell von einer einzelnen Zustandsmaschine ausgeführt werden müssen.

HDLs sind gute Sprachen zum Beschreiben oder Definieren einer beliebigen Sammlung von digitalen Schaltkreisen. Sie können Operationen, die parallel ausgeführt werden, auf eine Weise ausdrücken, die Programmiersprachen nicht können. Sie können auch Zeitbeschränkungen für die Schnittstellen zwischen Blöcken auf eine Weise beschreiben, die Programmiersprachen nicht können.

Ich war überrascht, dass in den Diskussionen Zweifel darüber lauteten, ob Firmware in C oder in Assembly geschrieben werden soll (wie ist Assembly geeignet, wenn Sie nicht unbedingt über eine CPU verfügen?)

In dieser Frage wird gefragt: "Wenn Sie Code für einen Mikrocontroller schreiben, gibt es einen echten Unterschied, ob Sie in Assembler oder C oder einer anderen Hochsprache schreiben?".

Da er speziell nach Systemen mit einem Mikrocontroller fragt (einer CPU mit Peripheriegeräten), sind C oder Baugruppen sowohl für die Entwicklung von Firwmares als auch für HDLs eine vernünftige Wahl.

Eine Firmware kann wirklich entweder in HDL oder in einer Software-Programmiersprache geschrieben werden, oder ist es nur eine andere Möglichkeit, dieselbe Mission auszuführen?

Es hängt davon ab, welche Art von Hardware Sie haben. Wenn Sie eine CPU haben, verwenden Sie eine Programmiersprache. Wenn Sie ein FPGA haben oder einen ASIC entwerfen, verwenden Sie eine HDL. Wenn Sie eine sehr große Menge an digitaler Logik entwerfen, können Sie sich eine der Zwischensprachen wie SystemVerilog ansehen.

Ich habe gelesen, dass die Firmware meist auf ROM oder Flash gebrannt hat. Wie ist es dort dargestellt? In Bits wie Software? Wenn ja, was ist der tiefgreifende Unterschied? Liegt es an der Verfügbarkeit angepasster Schaltkreise bei Firmware?

Ich denke, Sie werden auf den Begriff "Firmware" aufgehängt. Dieses Wort bedeutete ursprünglich, dass Code auf einem eingebetteten System ausgeführt werden sollte, auf das der Endbenutzer nicht zugreifen konnte, um Änderungen vorzunehmen. Wenn Sie jemandem einen PC verkauft haben, besteht eine sehr hohe Wahrscheinlichkeit, dass der Benutzer ändert, welche Software darauf ausgeführt wird. Wenn Sie ihnen ein Oszilloskop verkauft haben, möchten Sie nicht, dass sie den Code ändern, der auf dem internen Mikroprozessor ausgeführt wird, also haben Sie ihn als Firmware bezeichnet.

FPGA-Benutzer haben das Wort "Firmware" für die Ausgabe ihrer Designs verwendet, da es veränderlicher ist als Hardware (Dinge, die zusammengelötet sind). Wirklich unterscheidet sich die "Firmware", die ein FPGA konfiguriert, von der "Firmware", die auf einem uC ausgeführt wird. Die uC-Firmware führt den uC durch eine Reihe von Zuständen, um seine Funktion auszuführen. Die FPGA-Firmware definiert eine Reihe von Verbindungen zwischen Logikelementen und Werten, die in Nachschlagetabellen gespeichert werden sollen.

In beiden Fällen wird die Firmware in der Regel als Bit auf einem EEPROM gespeichert (oder auf einem Datenträger auf einem Hostcomputer, der sie bei jedem Neustart des eingebetteten Systems herunterlädt). Aber das macht sie einander nicht ähnlich.


Wenn Sie in VHDL / Verilog schreiben, ist es viel einfacher, die zu implementierende Logik zu visualisieren und somit zu optimieren. Dasselbe gilt nicht für C. Selbst SystemC ist noch so weit von der tatsächlichen physischen Implementierung entfernt, dass unerwartete Syntheseresultate auftreten können
JonRB

@ JonRB, Wenn Sie für eine uC oder uP codieren, ist mir eigentlich keine Möglichkeit bekannt, dies mit einer HDL zu tun. Ich stimme zu, dass bei der Codierung von Logik SystemVerilog oder SystemC für Systeme verwendet werden, die so groß sind, dass es einfach nicht praktisch ist, alles auf der Ebene der einzelnen Gatter zu entwerfen.
Das Photon

2
Beachten Sie, dass VHDL und Verilog auch verwendet werden, wenn Sie überhaupt keine Hardware haben. Sie können direkt zu Schaltkreisen anstelle von FPGA-Bitstream kompiliert werden. Apple hat beispielsweise seine Motherboards mit Verilog anstatt mit GUI-Schaltplanerfassung entworfen, da die Versionskontrolle, das Greifen und das einfache Parsen mithilfe von Skripten besser unterstützt werden, wenn Ihr Design aus einfachem Text statt proprietären Binärzeichnungen besteht.
Slebetman

10

Für den ersten Teil Ihrer Frage zu den Beweggründen für die Verwendung der einen oder anderen: Es gibt einen grundlegenden Unterschied zwischen C und HDLs (VHDL / Verilog) . C ist eine Software- Programmiersprache (wie Assembly ist), VHDL / Verilog sind Hardware- Beschreibungssprachen. Sie sind nicht für den gleichen Zweck bestimmt.

C wird beim Kompilieren in Assembler-Code (in seiner binären Form, dh Maschinensprache) übersetzt . Dieser Code ist eine Reihe von Anweisungen, die die CPU anweisen, eine Reihe von Grundoperationen auszuführen (Registerwert ändern, Addition durchführen usw.).

Andererseits wird eine HDL zu Hardware synthetisiert . In VHDL könnten Sie beispielsweise Folgendes schreiben:

output <= input1 + input2;

(Siehe auch ein vollständigeres Beispiel hier ). Dies würde zu einem (Hardware-) Addierer synthetisiert. Wenn der Code für ein FPGA synthetisiert wird , würde dies einen Bitstrom bedeuten, der das spezifische FPGA zum Implementieren eines Addierers (als kombinatorische Logik ) konfigurieren kann .

Eigentlich könnten Sie eine CPU in VHDL entwerfen (siehe Softcore-Prozessoren VS Hardcore-Prozessoren ) und die Software dafür in C ...

Über die Firmware: Eigentlich hängt alles davon ab, wie Sie das Wort definieren. EIN Firmware kann ein Programm (Software) sein, das in einem Mikrocontroller läuft (also beispielsweise in C oder Assembler geschrieben), oder es kann ein Bitstream sein, um ein programmierbares (Hardware-) Logikgerät (CPLD oder FPGA) zu konfigurieren. Manchmal kann es sich um ein Paket handeln, das beides enthält: Wenn Sie die Firmware für einige FritzBox-Modelle (ein ADSL-Modem) verwenden, enthalten diese tatsächlich ein ganzes Linux-System (geschrieben in Assembler, C und vielen anderen Programmiersprachen) und einen Bitstream für Konfigurieren Sie ein FPGA (wahrscheinlich aus VHDL oder Verilog synthetisiert).


3
  1. Das hängt von Ihrer Architektur ab. Wenn Sie eine CPU (oder normalerweise einen Mikrocontroller) haben, müssen Sie Firmware in einer normalen Programmiersprache (einschließlich Assembly) schreiben. Wenn Sie so etwas wie ein FPGA haben, muss Ihre Firmware in einer HDL geschrieben werden. HDLs können (meines Wissens) keine Programme generieren, die von einer herkömmlichen CPU effizient ausgeführt werden können, und ein FPGA führt keine herkömmlichen Standardprogramme aus. Sie können Ihr FPGA jedoch als CPU konfigurieren und dann ein herkömmliches Programm damit ausführen. Dies würde zwei Firmware-Schichten erfordern, die untere Schicht, die in eine HDL geschrieben ist, um die CPU zu erstellen, und die höhere Schicht, die in einer herkömmlichen Programmiersprache geschrieben ist, um auf dieser CPU ausgeführt zu werden.
  2. Es gibt keine feste Unterscheidung zwischen Firmware und Software. Auf vielen Geräten wird Firmware z. B. im Flash-Speicher gespeichert, aber auf einem modernen Telefon wird fast alles im Flash-Speicher gespeichert, und die Unterscheidung zwischen Firmware und Software ist unklar (die meisten Leute würden wahrscheinlich den Code zum Programmieren der Firmware des Basisbandprozessors in Betracht ziehen , und die meisten Leute würden über Anwendungsprogramme nachdenken, aber wo ist die genaue Grenze?).
  3. Wie ich in 2 sagte, gibt es keine eindeutige Unterscheidung, außer der Idee, dass die Firmware ein bisschen dauerhafter ist.

3

Hardware-Parallelität ist eine Hauptmotivation.

Elektronen können gleichzeitig in parallelen Drähten fließen, daher möchten wir dies beim Entwerfen von Hardware berücksichtigen.

Wenn Sie in VHDL etwas schreiben wie:

x <= a or b;
y <= a and b;
z <= x xor y;

(Außerhalb eines processoder function, das es explizit als sequentiell markiert), haben Sie die Tatsache codiert, dass:

  • x, y, z, aUnd bsind Drähte
  • aund bsind Eingangssignale
  • xist mit dem Ausgang einer orSchaltung verbunden, die aund bals Eingang nimmt
  • und so weiter für die anderen Zeilen

Es ist leicht zu erkennen, wie dies zu tatsächlicher Hardware synthetisiert xund ygleichzeitig ausgewertet wird.

        +-----+
A--+----+     |  X
   |    | OR  +-----+
B----+--+     |     |  +-----+
   | |  +-----+     +--+     |
   | |                 | XOR +-- Z
   | |  +-----+     +--+     |
   | +--+     |  Y  |  +-----+
   |    | AND +-----+
   +----+     |
        +-----+

Wenn es an der Zeit ist, die Schaltung zu simulieren, simuliert der Simulator (normalerweise ein sequentielles Programm) die Physik der Schaltung folgendermaßen:

  • hat aoder bgeändert? Ja? Hey, kommt xdrauf an a. Lass uns aktualisieren x.
  • ykommt auch drauf an a. Aktualisieren Sie das auch.
  • zhängt davon ab x. Aktualisieren Sie es, weil xes aktualisiert wurde.
  • Wurde etwas aktualisiert , das xvon ( aoder abhängt b)? Nein? Gleiches gilt für yund z. OK, wir sind mit diesem Schritt fertig.

Dies führt zu "interessanten" möglichen Ergebnissen, die kein sequentielles Analogon haben, aber mögliche physikalische Situationen darstellen:

  • x <= not xwürde zu einer unendlichen Rekursion der Simulation führen. Simulatoren können erst nach einer bestimmten Tiefe abschneiden.
  • x <= 0; x <= 1führt zu einem Fehler (Kurzschluss). Dies ist einer der Gründe, warum es std_logicexistiert.

Obwohl VHDL die Hardware genauer modelliert als C, ist es selbst keine vollkommen detaillierte Beschreibung davon:

Am Ende bietet VHDL ein ausgewogenes Verhältnis zwischen der vom Menschen verständlichen Schaltungsfunktionalität auf höherer Ebene und der Synthesefähigkeit auf niedrigerer Ebene.

C hingegen konzentriert sich mehr darauf, nacheinander mit der CPU zu sprechen.

Sie können natürlich eine Schaltung mit C-Strukturen, Aufzählungen und Arrays codieren und sie dann genau wie VHDL simulieren (dies ähnelt in etwa dem von System C) , ich habe es jedoch noch nie versucht).

Aber Sie würden einen VHDL-Simulator im Wesentlichen neu implementieren und eine ausführlichere Sprache verwenden. Das richtige Werkzeug für den richtigen Job, denke ich.

Es gibt auch Tools, die C in VHDL konvertieren /programming/8988629/can-you-program-fpgas-inc-like-languages, aber eine geringere Leistung erwarten, da dies harte Konvertierungen auf höherer Ebene sind.


0

HDLs werden verwendet, um Hardware zu beschreiben (zu synthetisieren), wobei als Programmiersprache die bereits synthetisierte Hardware, dh die CPU, programmiert wird.

Sie können Softcore-Versionen von CPU als VHDL oder Bitstream erhalten, um diese CPU auf einem FPGA zu synthetisieren.


-1

Ein Prozessor verwendet eine bescheidene Menge an Schaltkreisen, um eine große Anzahl von Operationen sequentiell auszuführen, indem ermöglicht wird, dass die meisten Komponenten verwendet werden, um unterschiedliche Operationen zu unterschiedlichen Zeiten auszuführen.

Ein FPGA enthält eine Reihe von Schaltkreisen, die - zumindest einzeln - keine besonders komplexen Vorgänge ausführen können, die jedoch alle gleichzeitig und unabhängig voneinander agieren können.

Angenommen, man möchte einen Chip haben, der eine Reihe von Aufgaben ausführt, darunter die Überwachung von 15 Eingängen und:

  • Setzen Sie einen Ausgang immer auf High, wenn alle Eingänge mindestens 21 ms lang stabil waren, und die Anzahl der High-Eingänge ist ein Vielfaches von drei
  • Setzen Sie den Ausgang jedes Mal auf LOW, wenn alle Eingänge mindestens 21 ms lang stabil waren, und die Anzahl der hohen Eingänge ist kein Vielfaches von drei
  • Ändern Sie den Ausgang in beliebiger Weise zwischen dem Zeitpunkt, an dem sich der Eingang ändert, und dem Zeitpunkt, an dem alle Eingänge mindestens 20 ms lang stabil waren.

Wenn man einen Mikrocontroller hat, der andere Aufgaben ausführt, aber alle 20 ms einige Mikrosekunden für die Prüfung dieser Eingaben und die Einstellung der Ausgabe einsparen kann, kann der größte Teil der Schaltung, die der Mikrocontroller zur Ausführung anderer Aufgaben verwendet, auch zur Ausführung der angegebenen Aufgabe verwendet werden oben, so dass sehr wenig Schaltkreise (außer einigen ROMs und vielleicht RAMs) für diese Aufgabe benötigt werden. Andererseits kann es eine Weile dauern, bis sich eine Eingabe ändert und die Ausgabe sie richtig wiedergibt.

Mit Verilog oder VHDL könnte man eine Hardwareschaltung aufbauen, die die 15 Eingänge kontinuierlich überwacht und die angegebene Berechnung durchführt. Solch ein Gerät wäre wahrscheinlich in der Lage, die Ausgabe innerhalb von 100 ns korrekt anzuzeigen - Größenordnungen schneller als der Mikrocontroller -, aber der für diese Aufgabe vorgesehene und für andere Zwecke unbrauchbare Schaltungsaufwand wäre viel größer.


Dies scheint kein besonders anschauliches Beispiel zu sein, um eine Unterscheidung zu verdeutlichen - es gibt genug umstrittene Punkte in den Details, die möglicherweise nicht wirklich dazu beitragen, jemanden bekannt zu machen, der noch nicht vertraut ist. Jemand, der realistisch mit diesem Problem konfrontiert ist, würde sich wahrscheinlich für eine moderne MCU mit einem breiten Datenwort und guten PIN-Wechsel-Interrupts entscheiden. Um zu entscheiden, welche Lösung mehr Logik erfordert, müssen Sie entscheiden, ob Sie die zahlreichen nicht verwendeten Peripheriegeräte auf der MCU oder die unberührten Slices auf dem FPGA zählen. Ersteres wird deutlich billiger sein.
Chris Stratton

@ ChrisStratton: Vielleicht hätte ich vorschlagen sollen, dass sich die Dinge ändern können, wenn die Timing-Anforderungen enger werden. Die Anforderung, dass eine CPU alle 20 ms einige Mikrosekunden zur Verfügung hat, erfordert möglicherweise keine Änderung des zugrunde liegenden Systems. Wenn jedoch eine Antwortzeit von 200 us erforderlich ist, ist möglicherweise eine schnellere CPU erforderlich, als dies ansonsten erforderlich wäre Unter 20us kann es notwendig sein, eine zusätzliche CPU hinzuzufügen, um damit fertig zu werden. Unter 200ns ist dies mit einer CPU möglicherweise überhaupt nicht möglich.
Supercat

Das liegt daran, dass Sie die Funktionen der MCU nicht nutzen. Starten Sie am Pinwechsel-Interrupt einen Hardware-Timer-Block, der den Ausgang 20 ms später setzt. Dann entscheiden, in der Freizeit , wenn das tatsächlich gerechtfertigt ist, und wenn nicht, abbrechen. Es ist nicht wirklich ein großartiges Beispiel FPGA - Punkt zu machen , weil es so viel gegenseitige Abhängigkeit ist - der einzige Teil , dass wirklich parallel läuft die Ereigniserkennung ist, und eine moderne MCU bereits gibt Ihnen die in weitgehend parallelen Hardware. In der Zwischenzeit ist der Rest praktisch sequentiell, sodass Sie eine ultraschnelle Zustandsmaschine bauen, die eine sehr langsame Uhr überwacht?
Chris Stratton

@ChrisStratton: Wenn ein geeignetes Pin-Change-Interrupt-Feature vorhanden ist und nicht bereits für etwas anderes verwendet wird, kann dies die Notwendigkeit einer ständigen Abfrage vermeiden. Wenn jedoch viele Dinge gleichzeitig passieren, müssen sie unabhängig von der Geschwindigkeit sequenziell verarbeitet werden Die CPU kann damit umgehen.
Supercat

Die sequenzielle Verarbeitung ist kein Problem, da die Problemstellung zwischen Eingabe und Antwort eine enorme Verzögerung verursacht. Und selbst wenn die aktuelle MCU zu ausgelastet wäre, würde das Hinzufügen einer zu diesem Zweck einen Bruchteil der Kosten für das Hinzufügen eines FPGAs bedeuten. Realistisch gesehen ist die einzige Möglichkeit, dieses Problem in einem FPGA zu lösen, entweder, weil es bereits einen mit Ersatz-Slices und den dazu geleiteten Signalen gibt, oder als künstliches Projekt in einem Bildungs- oder Hobbykontext.
Chris Stratton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.