Die FPGA (FPGA) -Technologie erfreut sich derzeit großer Beliebtheit. Die Anzahl der Anwendungen wächst: Neben der Verarbeitung digitaler Signale werden FPGAs auch zur Beschleunigung des maschinellen Lernens in Blockchain-Technologien, Videoverarbeitung und im Internet der Dinge eingesetzt.
Diese Technologie hat ein wesentliches Minus: Für die Programmierung werden recht komplexe und spezifische Beschreibungssprachen digitaler Geräte Verilog und VHDL verwendet. Dies erschwert den Eintritt eines Neuankömmlings in das FPGA und es ist für einen Arbeitgeber schwierig, einen Spezialisten mit diesem spezifischen Wissen auf dem Arbeitsmarkt zu finden. Andererseits macht die beliebte Python-Programmiersprache auf hoher Ebene mit dem
MyHDL- Framework die FPGA-Programmierung einfach und unterhaltsam. Darüber hinaus sind Leute, die Python kennen, mit Verilog / VHDL um eine Größenordnung spezialisierter. Mit einer Reihe von Artikeln möchte ich zeigen, wie einfach es ist, in das FPGA-Wissen über Python einzusteigen und wirklich komplexe FPGA-Projekte in dieser Sprache zu erstellen. Ich stelle fest, dass Python nicht direkt auf dem FPGA ausgeführt wird, sondern ein Tool zum Generieren von Firmware ist.
Zunächst benötigen wir Python Version 3.6 selbst (im Folgenden werden alle Vorgänge unter Ubuntu 18.04 ausgeführt).
Installiere myhdl:
pip3 install myhdl
Als "Hallo Welt!" Wir werden ein einfaches Programm schreiben, das die LEDs aufleuchten lässt, wenn eine Taste gedrückt wird. In der Welt der Mikroprozessoren "Hello World!" Dies ist ein Programm, das mit einer einzigen LED blinkt. In der FPGA-Welt blinkt Hello World mit tausend LEDs. Es gibt nur vier LEDs auf der Platine, daher blinken sie je nach Tastendruck nur. Es ist wichtig zu beachten, dass der gesamte Code im FPGA im Gegensatz zu Mikrocontrollern zur gleichen Zeit ausgeführt wird, alle Dioden zur gleichen Zeit aufleuchten und ausgehen. Und bei Mikrocontrollern nicht sequentiell. Der Test verwendet die WaveShare OpenEPM1270-Karte mit Altera Max II EPM1270T144C5-Karten an Bord.

Erstellen Sie eine neue Python-Datei:
from myhdl import * from random import randrange def led_blinker(input1, led1, led2, led3, led4): @always_comb def on_off_led(): if input1 == 1: led1.next = 1 led2.next = 1 led3.next = 0 led4.next = 0 else: led1.next = 0 led2.next = 0 led3.next = 1 led4.next = 1 return on_off_led
Um herauszufinden, ob unser Code korrekt funktioniert, benötigen Sie ein Überprüfungstool. Tatsächlich ist jedes Programm für FPGA ein digitaler Signalprozessor, daher muss der Entwickler sicherstellen, dass er korrekt angegeben hat, was mit dem Chip zu tun ist. Dies erfolgt durch Simulation. Dazu müssen Sie ein Programm installieren, das die verarbeiteten Signale anzeigt. Es gibt viele solcher Programme, aber meiner Meinung nach die derzeit beste kostenlose GTKWave. Es wird vom Terminal gestellt:
sudo apt-get install gtkwave
Als nächstes sollte in der Datei mit der Firmware die Testumgebung beschrieben werden. Dies ist auch eine Python-Funktion:
def test(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] test = led_blinker(input1, led1, led2, led3, led4) @always(delay(10)) def gen(): input1.next = randrange(2) return test, gen
Hier erzeugt die Testumgebung eine zufällige Folge von Nullen und Einsen (das zufällige Python-Modul wird verwendet).
def simulate(timesteps): tb = traceSignals(test) sim = Simulation(tb) sim.run(timesteps)
Und wir initialisieren den Simulator und ziehen die Umgebungsfunktion test_inverter dorthin. So erhalten wir den russischen Puppenwechselrichter → test_inverter → simulieren (Zeit in willkürlichen Einheiten).
Nach dem Ausführen des Skripts wird im Arbeitsordner eine .vcd-Datei erstellt, die über gtkwave im Terminal übergeben werden sollte: gtkwave test_invereter.vcd.

Als Ergebnis wurde eine zufällige Folge von Eingangssignalen input1 erzeugt und wie die led_blinker-Funktion diese Signale verarbeitete.
Nachdem wir sichergestellt haben, dass die Logik genau so funktioniert, wie wir es wollten, sollten wir diese Funktion in das FPGA einbinden. Ich bin es gewohnt, mit Chips von Intel (ehemals Altera) zu arbeiten. Diese Abfolge ist für Chips anderer Hersteller mit geeigneten CAD-Systemen ähnlich. Auf dem FPGA-Chip, der vom Compiler des Chipherstellers erstellt wird, wird eine Binärdatei erstellt, für Intel ist es Quartus, für Xilinx Vivado. Compiler können nur mit Code in VHDL / Verilog arbeiten, daher sollte der Python-Code in eine dieser Sprachen übersetzt werden (egal welche).
def convert(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] toVerilog(led_blinker, input1, led1, led2, led3, led4) convert()
In diesem Beispiel wird der Code in Verilog übersetzt. Das Ergebnis befindet sich in der Datei led_blinker.v, und Quartus muss es angeben, um die FPGA-Firmware zu generieren:
module led_blinker ( input1, led1, led2, led3, led4 ); input input1; output led1; reg led1; output led2; reg led2; output led3; reg led3; output led4; reg led4; always @(input1) begin: LED_BLINKER_ON_OFF_LED if ((input1 == 1)) begin led1 = 1; led2 = 1; led3 = 0; led4 = 0; end else begin led1 = 0; led2 = 0; led3 = 1; led4 = 1; end end endmodule
Bei diesem Ansatz zur Entwicklung der FPGA-Firmware können Sie diese Datei ignorieren und einfach in Quartus ablegen.
Sie können Quartus von
fpgasoftware.intel.com herunterladen. Wir benötigen eine kostenlose Version von Lite. Sie wird für uns ausreichen. Laden Sie die Basisversionsgröße von 9 GB herunter.
Die Installation von Quartus sollte für den durchschnittlichen Linux-Benutzer kein Problem sein. Nach der Installation müssen Sie einige Parameter im System einstellen, damit Sie das Gerät zum Flashen des FPGA-Programms verwenden können - den Programmierer:
1. Erstellen Sie eine udev-Regel. Erstellen Sie dazu eine neue Datei /etc/udev/rules.d/51-altera-usb-blaster.rules mit folgendem Inhalt:
Starten Sie udev mit udevadm neu:
sudo udevadm control --reload
2. Ermöglichen Sie den Zugriff auf das USB-Blaster-Gerät ohne Rootberechtigung. Erstellen Sie dazu die Datei /etc/udev/rules.d/altera-usb-blaster.rules mit der Zeile:
ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666"
Dies gibt rw-rw-rw-Zugriff auf den Programmierer.
3. Konfigurieren Sie jtagd. Quartus verwendet den jtagd-Daemon zum Arbeiten, der Software mit einem Programmiergerät verknüpft. Kopieren Sie die Beschreibung mit Quartus aus Ihrem Verzeichnis:
sudo mkdir /etc/jtagd sudo cp <Quartus install path>/quartus/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts
Führen Sie Quartus aus und erstellen Sie ein neues Projekt. "Datei" - "Assistent für neue Projekte". Geben Sie den Namen des Projekts ein.
Klicken Sie anschließend auf Weiter. Und im Menü Dateien hinzufügen verbinden wir die generierte Verilog-Datei mit der Erweiterung .v. Wenn die Verilog-Datei aus einer Python-Datei heraus bearbeitet wird, wird sie automatisch von Quartus übernommen. Als Nächstes gelangen wir zum Geräteauswahlmenü, in unserem Fall MAX II EMP1270T144C5 und das nächste Mal. Das Projekt wird erstellt.
Gehen Sie im Projektnavigator zum Dateimenü und klicken Sie mit der rechten Maustaste auf unsere Verilog-Datei "Als oberste Entität festlegen".
Wir stellen das Projekt zusammen. Konfigurieren Sie nun im Menü „Assignments-Pin Planner“ die Pins auf dem Chip:

Kompilieren Sie erneut. Jetzt ist alles bereit zum Programmieren: Tools-Programmer. Wir schließen den Programmierer und die Stromversorgung an die Karte an, wählen im Hardware-Setup unseren USB-Blaster aus, setzen die Kontrollkästchen wie in der Abbildung gezeigt und starten.

Nachdem der Programmierer Erfolgreich gemeldet hat. Sie können das Ergebnis auf der Tafel sehen:

Fazit
In dieser Lektion wird beschrieben, wie Sie eine Arbeitsumgebung und das erste einfache FPGA-Projekt in der Programmiersprache Python erstellen.
Überlegt:
- So installieren Sie:
- Konfigurierter USB Blaster-Programmierer in Ubuntu;
- FPGA FPGA-Projekt entwickelt;
- Testen und Verifizieren des Projekts;
- Kompilierte ein Projekt für FPGA;
- Projekt auf FPGA hochgeladen.