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):
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?
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.
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!
Antworten:
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.
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.
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 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.
quelle
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:
(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).
quelle
quelle
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:
(Außerhalb eines
process
oderfunction
, das es explizit als sequentiell markiert), haben Sie die Tatsache codiert, dass:x
,y
,z
,a
Undb
sind Drähtea
undb
sind Eingangssignalex
ist mit dem Ausgang eineror
Schaltung verbunden, diea
undb
als Eingang nimmtEs ist leicht zu erkennen, wie dies zu tatsächlicher Hardware synthetisiert
x
undy
gleichzeitig ausgewertet wird.Wenn es an der Zeit ist, die Schaltung zu simulieren, simuliert der Simulator (normalerweise ein sequentielles Programm) die Physik der Schaltung folgendermaßen:
a
oderb
geändert? Ja? Hey, kommtx
drauf ana
. Lass uns aktualisierenx
.y
kommt auch drauf ana
. Aktualisieren Sie das auch.z
hängt davon abx
. Aktualisieren Sie es, weilx
es aktualisiert wurde.x
von (a
oder abhängtb
)? Nein? Gleiches gilt füry
undz
. 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 x
würde zu einer unendlichen Rekursion der Simulation führen. Simulatoren können erst nach einer bestimmten Tiefe abschneiden.x <= 0; x <= 1
führt zu einem Fehler (Kurzschluss). Dies ist einer der Gründe, warum esstd_logic
existiert.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.
quelle
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.
quelle
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:
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.
quelle