Inhaltsverzeichnis:

Arduino als günstiges Breadboard FPGA - Gunook
Arduino als günstiges Breadboard FPGA - Gunook

Video: Arduino als günstiges Breadboard FPGA - Gunook

Video: Arduino als günstiges Breadboard FPGA - Gunook
Video: Arduino with built in FPGA: MKR Vidor 4000 Unboxing and initial setup 2024, November
Anonim
Arduino als günstiges Breadboard FPGA
Arduino als günstiges Breadboard FPGA

Das Entwerfen von Hardware-Logikschaltungen kann Spaß machen. Der alte Weg, dies zu tun, war mit NAND-Gattern auf einem Brotbrett, das mit Überbrückungsdrähten verdrahtet war. Dies ist noch möglich, aber es dauert nicht lange, bis die Anzahl der Tore außer Kontrolle gerät. Eine neuere Option ist die Verwendung eines FPGA (Field Programmable Gate Array). Diese Chips können sich selbst zu einer beliebigen digitalen Logikschaltung umverdrahten, die Sie entwerfen können, sind jedoch nicht billig und leicht verfügbar. Ich werde zeigen, wie dieses FPGA durch einen billigen Atmega-Chip von einem Arduino UNO ersetzt werden kann, wodurch die digitale Schaltung effektiv in ein DIP-Paket gesteckt wird, das sehr Breadboard-freundlich ist.

Schritt 1: Entwerfen Sie die Schaltung, die das "FPGA" darstellen wird

Entwerfen Sie die Schaltung, die die
Entwerfen Sie die Schaltung, die die
Entwerfen Sie die Schaltung, die die
Entwerfen Sie die Schaltung, die die
Entwerfen Sie die Schaltung, die die
Entwerfen Sie die Schaltung, die die

Ich werde einen 2 Bit + 2 Bit Addierer bauen. Es nimmt zwei Paare von Logikeingangspins und gibt ein Triplett von Ausgangspins aus.

Um dies mit NAND-Gattern zu tun, siehe den Schaltplan im Bild. Es benötigt 14 NAND-Gatter. Ich habe 4 Quad-NAND-Gate-TTL-Chips verwendet und sie auf der Brotplatine verdrahtet.

Ich habe einige LEDs hinzugefügt (vergessen Sie nicht die Strombegrenzungswiderstände), um anzuzeigen, wann die Eingangs- und Ausgangspins eingeschaltet waren (hoch) und wann sie ausgeschaltet waren (niedrig). Um die Eingangspins anzusteuern, habe ich sie entweder auf die Masseschiene oder die positive Stromschiene gesteckt.

Diese Schaltung funktioniert, nimmt aber bereits 4 TTL-Chips auf und ist ein Rattennest aus Drähten. Wenn mehr Bits benötigt würden, gäbe es mehr Steckbretter und mehr Jumper. Sehr schnell würde die Größe der Schaltung außer Kontrolle geraten.

Nebenbei bemerkt, wenn mit TTL-Gates gearbeitet wird, geben sie nicht genau 0V oder 5V aus, wie man es erwarten würde. Sie geben oft etwa 3 V für "hoch" aus, aber die genaue Spannung liegt in einem sehr weiten Bereich. Die gleiche Schaltung, die die CMOS-äquivalenten Chips verwendet, hätte besser genau 0 V bis genau 5 V Schwingungen.

Schritt 2: Geben Sie das FPGA ein

Betreten Sie das FPGA
Betreten Sie das FPGA
Betreten Sie das FPGA
Betreten Sie das FPGA

Ein FPGA ist ein fantastischer Chip, der buchstäblich eine beliebige Kombination von Logikgattern werden kann, die in beliebiger Kombination miteinander verdrahtet sind. Man entwirft die "Schaltung" in einer Hardware-Designsprache (HDL). Es gibt mehrere solcher Sprachen, von denen eine Verilog heißt. Die.v-Datei im Bild ist das Verilog-Äquivalent des Zwei-Bit-Addierers. Die darunter liegende.pch-Datei wird auch benötigt, um die in der Verilog-Datei genannten Eingangs- und Ausgangspins echten Hardware-Pins auf dem Chip zuzuordnen.

In diesem Fall verwende ich ein iCEstick-Entwicklungsboard von Lattice Semiconductors (https://www.latticesemi.com/icestick). Der eigentliche FPGA-Chip ist ein iCE40HX-1k mit etwas über 1000 Gattern, die jedes beliebige Logikgatter werden können. Das bedeutet, dass jedes Gatter ein NAND-Gatter oder ein ODER-Gatter, ein NICHT-Gatter, NOR, XOR usw. sein kann. Zusätzlich kann jedes Gatter mehr als zwei Eingänge verarbeiten. Dies ist herstellerspezifisch, aber beim iCE40 kann jedes Gate 4 Eingänge verarbeiten. Somit ist jedes Gatter wesentlich leistungsfähiger als die NAND-Gatter mit 2 Eingängen.

Ich musste die 4 Eingangspins und die 3 Ausgangspins den physischen Pins 91, 90, 88, 87, 81, 80 bzw. 79 zuweisen. Dies ist spezifisch für den fpga-Chip und die Breakout-Platine, auf der er sich befindet, und wie diese Pins mit dem PMOD-Port verdrahtet sind. Dies ist in den Datenblättern für dieses FPGA-Board verfügbar.

Lattice bietet eine eigene Toolchain zum Synthetisieren (das FPGA-Äquivalent zur Kompilierung für CPUs) von Schaltungen von Verilog, aber ich habe die kostenlose Open-Source-Toolchain icestorm (https://www.clifford.at/icestorm/) verwendet. Die Installationsanweisungen sind auf dieser Site verfügbar. Wenn icestorm installiert ist und die verilog- und pcf-Datei sind die Befehle zum Laden dieser Schaltung auf das FPGA:

yosys -p "synth_ice40 -blif twoBitAdder.v" twoBitAdder.blif

arachne-pnr -d 1k -p iCEstick.pcf twoBitAdder.blif -o twoBitAdder.asc

icepack twoBitAdder.asc twoBitAdder.bin

iceprog twoBitAdder.bin

Dies funktioniert hervorragend, aber inklusive Versand kostet dieser iCEstick etwa 30 US-Dollar. Dies ist nicht die billigste Art, eine digitale Schaltung aufzubauen, aber es ist leistungsstark. Es hat über 1000 Tore und für diese winzige Schaltung verwendet es nur 3 davon. Das NAND-Gatter-Äquivalent verwendet 14 Gatter. Dies liegt daran, dass jedes Gate zu jeder Art von Gate werden kann und jedes Gate tatsächlich ein 4-Eingangs-Gate ist. Jedes Tor kann mehr. Wenn Sie mehr Gates benötigen, hat der iCEstick einen größeren Bruder mit 8000 Gates, der etwa das Doppelte kostet. Andere Hersteller haben andere Angebote, aber der Preis kann ziemlich steil werden.

Schritt 3: Von FPGA zu Arduino

Von FPGA zu Arduino
Von FPGA zu Arduino

FPGAs sind großartig, können aber teuer und schwer zu bekommen sein und sind nicht sehr Breadboard-freundlich. Ein Breadboard-freundlicher und günstiger Chip ist der Atmega 328 P, der in einem ordentlichen DIP-Paket geliefert wird, perfekt zum Breadboarden. Es ist auch für etwa 4 US-Dollar zu haben. Dies ist das Herzstück des Arduino UNO. Sie können natürlich die ganze UNO verwenden, aber billig sein, wir können den Atmega 328 P von der UNO ziehen und alleine verwenden. Ich habe das UNO-Board jedoch als Programmierer für den Atmega verwendet.

An dieser Stelle benötigen Sie

1. Ein Arduino UNO mit der abnehmbaren Atmega 328P CPU.

2. Ein weiterer Atmega 328P mit vorgebranntem Arduino-Bootloader, um den zu ersetzen, den wir gleich aus der UNO nehmen werden. (Optional vorausgesetzt, Sie möchten immer noch eine verwendbare UNO haben).

Das Ziel ist es, die Verilog-Datei in ein Arduino-Projekt zu konvertieren, das in den 328P geladen werden kann. Arduino basiert auf C++. Praktischerweise gibt es einen Übersetzer von Verilog nach C++, genannt Verilator (https://www.veripool.org/wiki/verilator). Verilator soll von Hardware-Designern verwendet werden, die ihre Designs simulieren müssen, bevor sie diese Designs auf teure Hardware festlegen. Verilator Cross kompiliert das Verilog nach C++, dann stellt der Benutzer einen Test-Harness bereit, um simulierte Eingangssignale bereitzustellen und die Ausgangssignale aufzuzeichnen. Wir werden es verwenden, um das Verilog-Design mit der Arduino-Toolkette in den Atmega 328P zu stopfen.

Installieren Sie zuerst Verilator. Folgen Sie den Anweisungen unter

Installieren Sie auch die Arduino IDE und testen Sie, ob sie über USB mit dem Arduino UNO verbunden werden kann.

Wir verwenden die gleiche Verilog-Datei wie für das FPGA, außer dass die Namen der Pins geändert werden müssen. Ich habe jeweils am Anfang einen Unterstrich (_) hinzugefügt. Dies ist erforderlich, da die Arduino-Bibliotheken eine Header-Datei enthalten, die Dinge wie B0, B001 usw. in Binärzahlen übersetzt. Die anderen Namen der Eingangspins wären so wie sie sind in Ordnung gewesen, aber B0 und B1 hätten dazu geführt, dass der Build fehlgeschlagen ist.

Führen Sie in dem Verzeichnis, das twoBitAdder.v und iCEstick.pcf enthält, Folgendes aus:

verilator -Wall --cc twoBitAdder.v

Dadurch wird ein Unterverzeichnis namens obj_dir erstellt, das mehrere neue Dateien enthält. Wir benötigen nur die Header- und cpp-Dateien, VtwoBitAdder.h, VtwoBitAdder.cpp, VtwoBitAdder_Syms.h und VtwoBitAdder_Syms.cpp.

Erstellen Sie in der Arduino-IDE eine neue Skizze namens twoBitAdder.ino. Dadurch wird die ino-Datei in einem neuen Verzeichnis, auch twoBitAdder genannt, in Ihrem Arduino-Skizzenbuchverzeichnis erstellt. Kopieren Sie Ihre VtwoBitAdder.h- und VtwoBitAdder.cpp-Dateien in diesen twoBitAdder-Ordner in Ihrem Arduino-Ordner.

Kopieren Sie nun die Header-Dateien aus der Verilator-Installation.

cp /usr/local/share/verilator/include/verilated*.

Kopieren Sie schließlich die std c++-Bibliothek von https://github.com/maniacbug/StandardCplusplus. Laut ihrer Installationsanleitung Dies wird wie eine normale Arduino-Bibliothek installiert. Entpacken Sie den Inhalt der Distribution in den Ordner 'libraries' unter Ihrem Skizzenbuch. Mein Skizzenbuch befindet sich beispielsweise unter /home/maniacbug/Source/Arduino, also diese Bibliothek befindet sich in /home/maniacbug/Source/Arduino/libraries/StandardCplusplus.

Stellen Sie sicher, dass Sie Ihre Arduino IDE nach der Installation zurücksetzen."

Ersetzen Sie nun den Inhalt von twoBitAdder.ino durch den in diesem Schritt bereitgestellten. Dies ist ein Testkabelbaum, den Verilator erwartet, der die Eingangs- / Ausgangspins einrichtet, dann in der Schleife die Eingangspins liest, sie dem VtwoBitAdder (der übersetzten Version unserer Schaltung) zuführt, dann die Ausgänge von VtwoBitAdder liest und anwendet sie zu den Ausgangspins.

Dieses Programm sollte auf dem Arduino UNO kompiliert und ausgeführt werden.

Schritt 4: Vom Arduino zum DIP-Chip auf einem Brotbrett

Vom Arduino zum DIP-Chip auf einem Brotbrett
Vom Arduino zum DIP-Chip auf einem Brotbrett

Da das Programm nun auf dem Arduino läuft, brauchen wir das Arduino-Board selbst nicht mehr. Alles was wir brauchen ist die CPU.

Entfernen Sie den Atmega 328P vorsichtig aus dem Arduino UNO-Sockel und setzen Sie optional seinen Ersatz ein.

Setzen Sie den Atmega 328P auf das Steckbrett. Legen Sie das Ende mit der Kerbe nach oben auf das Brotbrett. Pin 1 ist der obere linke Pin. Pin 2 ist der nächste unten, und so weiter zu Pin 14, der sich unten links befindet. Dann ist Pin 15 unten rechts und die Pins 16 bis 28 zählen die rechte Seite des Chips zurück.

Verbinden Sie die Pins 8 und 22 mit Masse.

Verbinden Sie Pin 7 mit VCC (+5V).

Schließen Sie einen 16Mhz Quarzkristall zwischen Pin 9 und 10 an. Außerdem einen kleinen Kondensator (22pF) zwischen Pin 9 und Masse und zwischen Pin 10 und Masse. Dadurch erhält der Atmega 328P die 16Mhz Taktrate. Es gibt an anderer Stelle Anweisungen, wie man dem 328P beibringt, stattdessen seinen internen 8-MHz-Takt zu verwenden, was ein paar Teile sparen würde, aber das würde den Prozessor verlangsamen.

Die Arduino GPIO-Ports 5, 6, 7 und 8, die wir für die Eingangspins verwendet haben, sind eigentlich die physischen Pins 11, 12, 13, 14 des Atmega 328P. Das wären die vier unteren Pins auf der linken Seite.

Die Arduino GPIO-Ports 11, 10 und 9, die wir für die Ausgangspins verwendet haben, sind eigentlich die physischen Pins 17, 16, 15 des Atmega 328P. Das wären die unteren drei Pins auf der rechten Seite.

Ich habe die LEDs wie zuvor an diese Pins angeschlossen.

Schritt 5: Fazit

Abschluss
Abschluss

TTL-Chips funktionieren, aber es braucht viele davon, um etwas zu bauen. FPGAs funktionieren wirklich gut, sind aber nicht billig. Wenn Sie mit weniger IO-Pins und niedrigerer Geschwindigkeit leben können, ist ein Atmega 328P möglicherweise der richtige Chip für Sie.

Einige Dinge, die Sie beachten sollten:

FPGA:

Profi

- Kann Hochgeschwindigkeitssignale verarbeiten. Da es keine CPU gibt, die die Verarbeitung bis hin zu einer Anweisung auf einmal unterbindet, ist der begrenzende Faktor die Ausbreitungsverzögerung durch die Gatter auf der gegebenen Schaltung. In vielen Fällen kann dies viel schneller sein als der mit dem Chip gelieferte Takt. Für mein Design hätte die berechnete Verzögerung es dem twoBitAdder ermöglicht, auf etwa 100 Millionen Änderungen der Eingangswerte pro Sekunde (100Mhz) zu reagieren, obwohl der On-Board-Takt nur ein 12-MHz-Kristall ist.

- Wenn das Design komplexer wird, nimmt die Leistung der bestehenden Schaltungen nicht (sehr) ab. Da das Hinzufügen von Schaltkreisen zum Fabric einfach etwas Neues in ungenutzte Immobilien bringt, hat es keinen Einfluss auf bestehende Schaltkreise.

- Je nach FPGA kann die Anzahl der verfügbaren IO-Pins sehr hoch sein und sie sind im Allgemeinen nicht auf einen bestimmten Zweck festgelegt.

Kon

- Kann teuer und/oder schwer zu bekommen sein.

- Wird normalerweise in einem BGA-Paket geliefert, das eine Art Breakout-Board erfordert, um mit dem Chip in jedem Amateurprojekt zu arbeiten. Wenn Sie es in ein Design mit einer benutzerdefinierten mehrlagigen SMT-Platine einbauen, ist dies kein Problem.

- Die meisten FPGA-Hersteller bieten ihre eigene Closed-Source-Designsoftware an, die in einigen Fällen Geld kosten kann oder ein Ablaufdatum der Lizenz hat.

Arduino als FPGA:

Profi

- Günstig und leicht zu bekommen. Suchen Sie einfach nach atmega328p-pu auf Amazon. Sie sollten ungefähr 4 $ / Stück kosten. Mehrere Verkäufer verkaufen sie in Losen von 3 oder 4.

- Dies ist ein DIP-Paket, was bedeutet, dass es mit seinen externen Pins perfekt auf ein Steckbrett passt.

- Dies ist ein 5V-Gerät, das die Verbindung mit anderen 5V-Geräten einfach machen kann.

Kon

- Der ATMEGA328P verfügt über eine begrenzte Anzahl von IO-Pins (23), von denen einige für bestimmte Aufgaben reserviert sind.

- Mit zunehmender Komplexität der Schaltung steigt die Menge an Code, die in der Arduino-Schleifenmethode ausgeführt wird, was bedeutet, dass die Dauer jedes Zyklus länger ist.

- Auch wenn die Komplexität der Schaltung gering ist, erfordert jeder Zyklus viele CPU-Befehle, um die Eingangspinwerte abzurufen und Ausgangspinwerte zu schreiben und zum Anfang der Schleife zurückzukehren. Bei einem 16-MHz-Kristall wird die Schleife selbst bei einem Befehl pro Taktzyklus nicht mehr als 1 Million Mal pro Sekunde (1Mhz) ausgeführt. Für die meisten Amateur-Elektronikprojekte ist das jedoch viel schneller als nötig.

Empfohlen: