wiki:FPGAProjekte

FPGA-Projekte

Diese Seite soll anhand von Beispielen die Möglichkeiten des FPGA-Moduls zeigen. Für einige Anwendungen ist die DACRAM-Aufsteckkarte (erscheint in c't 4/2009, Vorabversion im Repo-Browser) nötig. Genauere Beschreibung der Beispiele und wie man sie mit Xilinx ISE implementiert finden sich dort auch. Die in den ZIP-Archiven abgelegten *.BIN- oder *.BIT-Files können direkt auf die Konfigurations-SD-Karte kopiert werden, wenn Sie sich nicht mit dem Xilinx-Entwicklungssystem befassen wollen.

Die FPGA-ZIP-Files (entpacken als Ordner!) enthalten neben den Sourcen und der ISE-Projektdatei ggf. auch zusätzliche Dateien (INI-, BIT- und MEM-Files, PicoBlaze-Sourcen) sowie ggf. LabVIEW-Beispielprogramme in den entsprechenden Unterordnern. Zusätzlich ist oft eine LogicPort-Datei enthalten, die mit der LogicPort-Software (Demo kostenlos, siehe Wiki-Eintrag) betrachtet werden kann.

Ports

Grundlegende SPI-Implementation, Empfangs- und Senderegister werden auf FPGA-Portleitungen geführt, die über c't-Lab-Befehle (oder mithilfe des Panels) gelesen und beschrieben werden können. Param 0 (untere 16 Bit, "Port 0") beschreibt die Portleitungen FP20 bis FN141, Bit 0 von Param 1 steuert die LED neben dem FPGA. Strobe-Signal (2 SysClks? kurz) für Port 0 liegt auf FN132. Gegenüber der Veröffentlichung in c't 4/2009 platzsparend vereinfacht. Timing kann in der LogicPort-Datei ct-Ports.LPF betrachtet werden.

QVGA Video-Interface

Beschreibung in c't 4/2009 S. 192: QVGA-Grafik (320 x 240 Punkte), ansprechbar über LabScript-Befehle (siehe Syntax-Tabelle). Monitor wird direkt am VGA-Stecker des FPGA-Moduls angeschlossen. Benötigt 32 KByte SRAM (z.B. 62256-10) auf der FPGA-RAM- (Layout zum Selberätzen hier, Schaltplan hier) oder der FPGA-DACRAM-Karte. Demo als DEMOVGA.INI im Firmware-Bereich zur FPGA-Karte im Verzeichnis SD-CARD.

Frequenzzähler

browser:Bilder/FrequZ-VI.png

Praktische Anwendung der Frequenzzähler-Konfiguration: Das LabVIEW-Progrämmchen steuert den Puls- und Frequenzgenerator im FPGA und liest kontinuierlich den Frequenzzähler-Stand aus.

Beschreibung in c't 4/2009 S. 192: Einfacher Frequenzzähler bis 200 MHz, zusätzlich Timer/Impuls?-Generator mit 5ns Auflösung und DDS-gesteuerter Rechteck-Generator bis 100 MHz (nur Rechteck) in einem (leicht modifizierten) Design unseres Lesers Klaus Philipp. Basisadresse SubCh 16, siehe auch zugehörige LabVIEW-Demo FPGA-FrequZ.vi.

Eingang Frequenzzähler auf FN100, Ausgang DDS-Generator auf FP99, Ausgang Impulsgenerator auf FP97, alles LVTTL-Pegel. Achtung: 5V-Pegel können das FPGA beschädigen! Verwenden Sie hierfür immer einen 220R-Vorwiderstand.

Auf der DACRAM-Karte ist ein einfacher Vorverstärker (schneller Komparator ADCMP600) für den Frequenzzähler enthalten.

AMDDS

browser:Bilder/AMDDS-VI.png

Mit dem simplen LabVIEW-Programm FPGA-AMDDS.vi kann man den FPGA-Messsender fernsteuern. Das Oszillogramm zeigt simuliert die Auswirkung der Pegel- und Modulationseinstellung.

Beschreibung in c't 4/2009 S. 192: Amplitudenmodulierbarer Messsender 0 Hz bis 10 MHz (theor. 60 MHz in Verbindung mit TxDAC-Option). Benötigt einen der DACs auf der DACRAM-Karte. Das zugehörige LabVIEW-VI heißt FPGA-AMDDS.vi. Ein wenig DSP-Technik kommt mit den schnellen Multiplizierern (in den Sinusgenerator-Blöcken enthalten) ins Spiel. Mit kleinen Erweiterungen wäre diese FPGA-Anwendung übrigens ebenso in der Lage, frequenzmodulierte Signale oder beliebige (ladbare) Wellenformen zu erzeugen, etwa zur Anwendung als Arbiträrgenerator oder als elektronisches Musikinstrument.

DDSFGEN

Erweiterung des vorgenannten DDS-Generators auf zwei getrennte Wellenformen, auswählbar Sinus/Dreieck/Sägezahn/Rechteck?, die auf den zwei Kanälen des AD5447-DACs ausgegeben werden. Auch hierzu existiert ein einfaches LabVIEW-Steuerprogramm namens FPGA-DDSFGEN.vi.

PicoBlazeDemo

Demonstrationsprojekt für den in c't 4/2009 nur am Rande erwähnten PicoBlaze-Softcore von Ken Chapman, Xilinx. Anwendung wird durch den neuen MEM-Support der Modul-Firmware 2.1 extrem vereinfacht.

Um die Beispiel-Applikationen ausführen zu können, muss die FPGA-Konfiguration \ct-PicoBlazeDemo\main\main.bit ins FPGA geladen werden. pb_blink.MEM ist ein PicoBlaze-Programm, das dann die LED auf dem Modul schnell blinken lässt. Einfach mit main.bit zusammen auf die SD-Karte kopieren, main.bit laden und danach pb_blink.MEM auswählen.

Etwas komplexer ist die Anwendung pb_ADA.MEM, die eine auf CONN3 eingesteckte A/D-Wandler-Karte AD16-8 (siehe hierzu auch ADA-IO-Modul) ausliest. Mit PARAM 0 auf dem Panel (oder Befehl an SubCh 0) gibt man den gewünschten Kanal vor (0 bis 7), auf VALUE 0 (oder Abfrage von SubCh 0) erhält man das Messergebnis in Rohform (16-Bit-Wert mit Offset 8000h direkt vom Wandler). Benötigt ebenfalls obige main.bit-Konfiguration (die natürlich für beide Beispiele nur einmal geladen werden muss). Die FPGA-Innenschaltung ist aus dem ISE-Schaltplan main.sch ersichtlich. Der PicoBlaze-Core wird hier über ein DCM mit 100 MHz getaktet und erreicht damit 50 MIPS.

Die PicoBlaze-Sourcen (Textdateien) haben die Endung .psm, sie können mit der Batch-Datei pmake.bat assembliert werden. Der Batch löscht alle nicht benötigten, von KCPSM3.EXE erzeugten Dateien. KCPSM3.EXE erhalten Sie auf der PicoBlaze-Download-Seite bei Xilinx. Die ROM_form-Vorlagen müssen sich zusammen mit KCPSM3.EXE im gleichen Verzeichnis wie die PicoBlaze-Sourcen befinden, auch wenn sie für das hier beschriebene Verfahren nicht von Belang sind (hier in \ct-PicoBlazeDemo\picoblaze).

PicoBlazeADA

Vollständige Ansteuerung der AD16-8- und DA12-8-Karten über PicoBlaze-Core. Sie unterstützt bislang allerdings nur die 16-Bit-Version der DA12-8 mit LTC1655.

Zwei Ansteuerungsoptionen: PicoBlaze-Core ADA16.MEM belegt 16 SubChannels wie ADA-IO (10 bis 17: A/D-Wandler, 20 bis 27: DA-Wandler), allerdings ohne Skalierung und Offset (Raw-Werte zum/vom Wandler). ADA4.MEM wurde so modifiziert, dass die Kanäle über das Panel eingestellt und ausgelesen werden können (Param 0/SubCh 0: DAC-Wert, Param 1/SubCh 1: gewünschter DAC-Kanal, Value 2/SubCh 2:ADC-Ergebnis, Param 3/SubCh 3: gewünschter ADC-Kanal). Es darf (ohne selbstgemachte Riser-Card) nur jeweils eine der Wandlerkarten eingesetzt werden. Bitte beachten Sie auch unbedingt die Ergänzungen und Berichtigungen zum FPGA-Modul.

Das ISE-Projekt enthält eine modifizierte SPI-Implementation, bei der die Basisadressen über den PicoBlaze-Code vorgegeben werden, nicht mehr über eine Konstante im ISE-Schaltbild (siehe Sourcen).

Oben erwähntes Testprogramm PB_BLINK.MEM läuft auch auf der PicoBlazeADA-Konfiguration (für Testzwecke), allerdings nur mit 50 MHz Takt (langsameres Blinken).

Timing kann in der LogicPort-Datei PicoBlazeADA.LPF betrachtet werden. Im Projekt-ZIP ist ebenfalls eine einfache LabVIEW-Demo enthalten.

RAMloadDemo

Zeigt die Verwendung der neuen AutoIncrement-Funktionen für DAT-, MEM- und DEC-Files. MEM-Files (Textdateien mit einer Hexadezimalzahl 8 bis 32 Bit pro Zeile) können nicht nur zum Laden von PicoBlaze-Cores verwendet werden, sondern auch ganz allgemein zum Laden von Datenblöcken in FPGA-interne BlockRAMs. Mit Firmware-Version 2.3 können sogar mehrere BlockRAMs getrennt beschickt werden, indem das zu selektierende BlockRAM vor dem Laden mit dem AIS-Parameter vorbestimmt wird. Die INI-Scripte im Ordner "sdcard" zeigen die Syntax.

Mit Version 2.31 der Firmware werden auch Textfiles mit dem Suffix .DEC angenommen, hier muss in jeder Zeile eine Dezimalzahl stehen (HEX-Zahlen bei MEM-Dateien), was den Export z.B. aus Excel erleichtert. Die erste Zahl gelangt an Speicherstelle 0, die letzte Speicherstelle ist abhängig von der Länge der Datei (Anzahl der Zeilen, max. 1024 Werte bei einem 2KByte-BlockRAM mit 16 Bit Breite).

In diesem Beispiel wird der Inhalt vom ersten BlockRAM (AIS=0) mit einer 16-Bit-Sinuswelle geladen (sinus.DEC oder sinus.MEM), die über einen simplen Zähler kontinuierlich an die DACRAM-Karte ausgegeben wird (funktioniert auch ohne, nur dann sieht man nichts). In das zweite BlockRAM (AIS=1) gelangt eine DAT-Binärdatei von 2 KByte Länge, die im FPGA durch das Dual-Port-BlockRAM auf 16 Bit Breite umsortiert wird. Die Little-Endian-Folge entspricht übrigens dem Atmel-Controller: LSB first, d.h. aus der Datei-Bytefolge 55h, AAh wird am Ausgang des BlockRAMs der Wert AA55h. Binärfiles werden vom FPGA-Controller übrigens deutlich schneller von SD-Karte geladen als die zu interpretierenden Textdatei-Typen MEM und DEC.

Auf dem Panel kann man nach dem Laden eines DAT-Files den BlockRAM-Inhalt mit Param 0 (Adresse) und Value 1 (Dateninhalt in 16-Bit-Breite) kontrollieren.

VGA_Test und VGA_BounceBall

Zum Test der VGA-Buchse. Keine weitere Peripherie nötig, aber auch keine weitere Funktionalität.

Nomen est Omen. Zum schnellen Test des FPGA-Moduls auf grundsätzliche Funktion: Wenn die Datei fehlerfrei von SD-Karte geladen und ins FPGA kopiert wurde, blinkt die LED neben dem FPGA.

Mini-Asteroids

Beschreibung in c't 4/2009 S. 192: Implementation des Spieleklassikers wie in c't 4/2009 beschrieben. Zur Anzeige ist ein Oszilloskop mit XY-Darstellung und Z-Eingang nötig, natürlich kann auch mit entsprechenden Kenntnissen eine "nackte" Oszilloskopröhre über eine selbstgebaute Ablenkschaltung angesteuert werden. Die XYZ-Signale und das Audio-Signal liegen am Ausgang der DACRAM-Karte an. Wird in der vorliegenden Version über 12 Bits in den c't-Lab-Parametern 0 und 1 "gespielt", ist aber auch leicht auf externe Buttons umzurüsten (FPGA-Signale nach draußen führen). Umschaltbar auf analoge Uhrendarstellung und invertiertes Z-Signal.

browser:Bilder/asteroids-tisch.jpg

Asteroids aus dem Jahre 1979, hier die so genannte "Cocktail"-Tischversion, war einer der größten Videospiel-Erfolge aller Zeiten. Steuern Sie das Ein-Mann-Raumschiff im Kampf gegen Gesteinsbrocken und fiese UFOs! Im Originalspiel arbeitet ein 6502-Prozessor mit rund 70 TTL-ICs auf einer A3-großen Hauptplatine.

browser:Bilder/asteroids-sp.jpg

Asteroids-Nachbau, entwickelt mit dem c't-Lab-FPGA-Modul. Die eingebaute "analogoide" Uhr wird mit dem DCF77-Zeitzeichen synchronisiert.

Ein voll funktionstüchtiger Asteroids-Spielautomat mit den Abmessungen 18 x 20 cm ist hier nach den Originalplänen von 1979 im Spartan-3-FPGA verwirklicht, einschließlich 6502-CPU, Sound-Emulation und 12K ROM (belegt etwa 30% der FPGA-Logik und 60% des Block-RAM eines XC3S400). Das Steampunk-Design gewinnt durch die alte Oszilloskop-Röhre (7 cm Durchmesser, natürlich mit "Modulated Beam Full Vector Rendering", um im Duktus der Unterhaltungselektronik-Hersteller zu bleiben) und eine Ablenkschaltung mit ECC83-Trioden. Für die Spielpausen ist noch eine Uhr (Bild unten) eingebaut – die auf einem eigenen „Mikroprozessor“ im FPGA läuft, einer 8051-Emulation mit 24 MHz. Ein YouTube-Video zeigt das Gerät in Aktion, der Film kann auch als QuickTime-MOV downgeloadet werden (20 MByte). Die Uhr berücksichtigt auch einen angeschlossenen DCF77-Empfänger (Fertigprodukt von Conrad).

Unser Muster arbeitet nicht mit der c't-Lab-FPGA-Platine, sondern mit dem platzsparenden, aber leider recht teuren FPGA-Modul EFM01 von CeSys, das den Nachbau extrem vereinfacht - alle Bauteile finden auf einer Eurokarte (100 x 160 mm) Platz. Die Stromversorgung erfolgt über ein 12V/2A-Steckernetzteil. Die (bislang unveröffentlichte) Platine enthält Hochspannungserzeugung, Differenz-Endsufen mit zwei Röhren ECC83 und ein FPGA-Modul.

Space Invaders

Das klassische Arcade-Game in einer Anpassung für das FPGA-Modul, Original stammt von Mike Johnson, der die Webseite FPGAarcade betreibt. Das ISE-Projekt ct-Invaders benötigt nur das FPGA-Modul, keine Peripherie, da das bescheidene Video-RAM als BlockRAM im FPGA realisiert ist. Wenn die DACRAM-Karte gesteckt ist, dient ein DA-Kanal (oder der TxDAC) als Sound-Ausgang. Monitor an VGA-Buchse anschließen, wird wie im Original hochkant betrieben. Zum Test sind die Spiel-Buttons an SPI-Register (SubCh) 0 angeschlossen, auf dem Panel mit Param 0 zugänglich. Fünf Hex-Stellen steuern die Buttons über das jeweils niederwertigste Bit (1 und 0).

browser:Bilder/invaders.jpg

Enthält aus Urheberrechtsgründen keine ROMs, diese können hier bezogen werden: Space Invaders ROM Download

Das ROM-ZIP enthält Binärdateien für mehrere Arcade-Plattformen, die für unsere Emulation geeigneten heißen "invaders.e" bis "invaders.h".

Um sie in die Synthese einzubauen, sind die vier Dateien in das Projekt-Verzeichnis "romgen/roms/" zu kopieren. Dann die Batch-Datei "build_invaders_roms.bat" ausführen, die die ROMs in VHDL konvertiert und in den "source"-Ordner kopiert. Dann die Synthese des gesamten Invaders-Projekts durchlaufen lassen und das entstandene BIT-File auf die SD-Karte kopieren.

Als Editor für Binärdateien empfehle ich das kostenlose HxD von Maël Hörz.

BASIC Terminal-Computer

In das Spartan-3-FPGA des c't-Lab-FPGA-Moduls passt ohne weiteres ein kompletter "Heimcomputer" wie ein Apple II oder ein C64 (eigentlich sogar drei gleichzeitig). Ich habe hier einmal einen 6502-BASIC-Rechner implementiert, der ohne weiteres einfache Steuer- und Anzeigeaufgaben übernehmen kann und mit dem c't-Lab kommuniziert. Dieses FPGA-Projekt finden Sie wegen seines Umfangs auf einer eigenen Seite.

browser:Bilder/basic1aus.jpg

Last modified 9 years ago Last modified on Apr 7, 2009, 4:58:51 PM