% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[utf8]{inputenc} \usepackage{multicol,babel} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} \renewcommand{\reftextbefore}{auf der vor\-herigen Seite} \renewcommand{\reftextfacebefore}{auf der gegen\-über\-lie\-genden Seite} \renewcommand{\reftextafter}{auf der näch\-sten Seite} \renewcommand{\reftextfaceafter}{auf der gegen\-über\-lie\-genden Seite} \renewcommand{\reftextfaraway}[1]{auf Seite~\pageref{#1}} \begin{document} % \renewcommand{\figurename}{Tabelle} \title{Forth im FPGA — Teil 1, der Einstieg} %\ifx\shorttitle\undefined\else %\shorttitle{Forth im FPGA} %\fi \author{Ulrich Hoffmann} \maketitle Einen Forth--Prozessor in Hardware zu realisieren, ist ein Wunsch, den wohl jeder Forth--Programmierer schon einmal gehabt hat. Musste dieser Wunsch in der Vergangenheit häufig unerfüllt bleiben --- Halbleiterentwurf ist teuer und aufwändig --- so bietet heute die Verfügbarkeit von FPGAs und kostengünstigen Entwicklungsboards die Möglichkeit, dass jeder sich an die Erfüllung dieses Wunsches machen kann. Aber es gilt, die Enstiegsschwelle zu überwinden. Zwar haben Bernd Paysan und Klaus Schleisiek, die beruflich mit FPGAs arbeiten, mit ihren Forth--Prozessoren {\sf b16} [6] und {\sf MicroCore} [7] zwei FPGA--fähige Forth--Prozessoren vorgestellt, aber diese Prozessoren selber auf einem FPGA--Board zum Laufen zu bekommen, ist immer noch eine Herausforderung. Dieser Herausforderung stellt sich die Artikelserie \emph{Forth im FPGA}. Im vorliegenden ersten Teil wird eine geeignete Zielplattform, das DE1--Entwicklungsboard von Altera, vorgestellt und die darauf befindlichen Schalter und LEDs angesprochen, um eine Idee davon zu bekommen, wie Hardware--Programmierung mit FPGAs abläuft. Das Ansprechen weiterer Hardware des Boards und die Portierungen von {\sf b16} und {\sf Microcore} sind für die weiteren Teile von \emph{Forth im FPGA} vorgesehen. \begin{multicols}{2} \section{Einleitung} Eine der Besonderheiten von Forth ist, dass es auf einer virtuellen Maschine beruht, deren zwei Stacks direkt in der Programmiersprache sichtbar sind. Diese virtuelle Maschine ist so einfach, dass sie sich geradezu anbietet, direkt in Hardware realisiert zu werden und Forth so zur Maschinensprache eines Mikroprozessors zu machen. Zahlreiche Ansätze [1][2][3] für Forth--orientierte Mikroprozessoren, so genannte \emph{Forth--Maschinen}, nicht zuletzt durch Charles Moore selbst, verfolgen diese Idee. Klassischerweise werden Mikroprozessoren in einem kundenspezifischen und damit kostspieligen Entwurfsprozess hergestellt und ihr Entwurf ist damit für kleine Firmen oder versierte Laien unerschwinglich. Aber die Zeiten haben sich geändert: Prozessoren lassen sich heute in FPGAs realisieren. \section{FPGAs} Die so genannten \emph{Field Programmable Gate Arrays} [8], kurz FPGA, sind allgemeine digitale Schaltungen, die durch eine gezielte Konfiguration spezielle Schaltungen realisieren können. Dazu sind allgemeine, vielseitige \emph{Logik\-elemente} mit einem vorgegebenen Vorrat an digitalen Elementarfunktionen (UND, ODER, NICHT, usw., oder mit kleinen Funktionstabellen) in einer Matrix angeordnet. Die Konfiguration legt die Funktionalität jedes Logikelements und auch die Verbindungen zwischen den Elementen fest. Auf diese Weise entstehen Schaltnetze und Schaltwerke (rückgekoppelte Schaltnetze). Nach dem Einschalten lädt ein FPGA typischerweise die Konfiguration in Form eines Bitstroms aus einem seriellen Flash--Speicher. Das Definieren jedes einzelnen Bits der Konfiguration ist extrem mühsam, deswegen werden heute \emph{Hardware--Beschreibungssprachen} (etwa VHDL oder Verilog) verwendet, um die Schaltungen --- den \emph{Entwurf} (Design) --- auf abstrakter Ebene zu beschreiben. Die \emph{Hardware--Synthese} gewinnt dann die Konfiguration aus dem Entwurf. Moderne FPGAs besitzen eine Vielzahl von Logikelementen --- das von uns verwendete Altera--FPGA Cyclone II 2C20 besitzt 20000 Logikelemente, genug um einen Mikroprozessor aufzunehmen --- und außerdem auch spezielle Einheiten etwa zur Datenspeicherung (Block RAM) oder zur schnellen Multiplikation. Während der Synthese wird auf die speziellen Fähigkeiten des FPGAs Rücksicht genommen, der Entwurf selbst muss hingegen auf die Eigenheiten des jeweiligen FPGAs nur wenig Einfluss nehmen. \section{Das Altera--DE1-Entwicklungsboard} Mit dem Board DE1 von Altera/Terasic [4][5][9] steht ein kostengünstiges FPGA--Entwicklungssystem zur Verfügung, das jedermann Experimente mit FGPAs ermöglicht. Quartus, die Entwicklungsumgebung mit Projektverwaltung und Synthese für Altera--FPGAs, kann von der Altera--Webseite geladen werden und liegt dem System auf DVD bei. \begin{figure*}[t] \begin{center} \includegraphics[width=1.0\textwidth]{2009-01/de1-board} \caption{\label{fpga:de1-board}Anschlüsse des Altera--DE1--Entwicklungsboards [13]} \end{center} \end{figure*} Das DE1--Board (siehe Abbildung \vref{fpga:de1-board}) enthält ein Cyclone II 2C20 FPGA mit zugehörigem Konfigurations--Flash EPCS4. Ebenfalls auf dem Board vorhanden ist Speicher: 8 MB SDRAM, 512 KB SRAM und 4 MB Flash. Für den Mikrocontroller--Board--Interessierten ist das nichts Besonderes. Auf einem FPGA--Board muss man aber geeignete An\-steu\-er\-ungs\-schal\-tun\-gen in seinem Entwurf selbst definieren, bevor man den Speicher überhaupt ansprechen kann --- sicher ein Thema, mit dem wir uns in Zukunft auseinandersetzen werden. Zur Taktung von Schaltungen können 3 Oszillatoren mit 24, 27 bzw.\ 50 Mhz verwendet werden. Als Verbindungen zur Außenwelt stehen zum einen Schiebeschalter, Taster, rote/grüne LEDs und eine vierstellige 7--Segment--Anzeige zur Verfügung, die sich besonders gut für eigene Experimente eignen. Zum anderen gibt es Schnittstellen, die sich an typischen PC--Schnittstellen orientieren: VGA zur Videoausgabe, RS232 zur seriellen Kommunikation, PS/2 zum Anschluss von PC--Tastaturen, Klinkenbuchsen zur Audio--Ein-- und Ausgabe (Line/Mikrofon, 24--Bit--Codec) und ein Steckplatz für SD--Karten als Massenspeicher. Auch hier sind die Anschlüsse zwar vorhanden, aber die Schnittstellen benötigen passende Ansteuerungsschaltungen, um sie zum Leben zu erwecken. Eigene Elektronik lässt sich über zwei Steckverbinder anschließen. \begin{figure*} \begin{center} \includegraphics{2009-01/de1-package} \caption{\label{fpga:de1-package}Lieferumfang des Altera--DE1--Entwicklungssystems [12]} \end{center} \end{figure*} Abbildung \vref{fpga:de1-package} zeigt den Lieferumfang des DE1--Systems. Neben dem Board selbst findet sich ein Steckernetzteil, ein USB--Verbindungskabel zur Kommunikation und zum Programmieren des FPGAs, eine DVD mit Dokumentation, Software und Beispiel--Entwürfen und ein kleines Anleitungsheftchen (nicht auf dem Bild zu sehen). Das Steckernetzteil unterstützt 110V und auch 220V, hat aber einen amerikanischen Stecker. Das Netzteil und damit ein Adapter für deutsche Steckdosen wird aber erst benötigt, wenn man Erweiterungen an das Board anschließt: Das Board alleine vesorgt sich auch problemlos über das USB--Kabel vom angeschlossenen PC. Sehr nett. Um ein FPGA zu programmieren, wird in der Regel ein JTAG--Programmieradapter benötigt. Beim DE1 ist dieser Adapter, Altera nennt ihn \emph{USB-Blaster}, jedoch bereits auf dem Board integriert, so dass das Board direkt per USB an einen PC angeschlossen werden kann und dann direkt über dieses Kabel programmiert wird. Auch sehr nett. \section*{Inbetriebnahme} Schließt man das DE1 also über das mitgelieferte USB--Kabel an einen PC an und schaltet es ein, so wird die im Konfigurations--Flash befindliche vordefinierte Standard--Schaltung (\verb|CII_Starter_Default|) in das FPGA geladen und aktiviert: Die 7--Segment--Anzeige zählt, die LEDs zeigen Lauflichter und auf VGA und Lineout werden Testsignale produziert. Einige Taster führen einen Reset durch. So kann man schnell feststellen, ob das Board im Prinzip funktioniert. \section*{Alteras FPGA--Entwicklungssystem Quartus} Lange Zeit war FPGA--Entwurfssoftware --- ihre Hauptaufgaben sind eben die Umsetzung des Hardware--Entwurfs in die Konfigurationsinformation des FPGAs und die Simulation des Entwurfs --- teure Spezialwerkzeuge für den Hardware--Ingenieur. Erfreulicherweise hat sich dieses Bild geändert: Alle gängigen FPGA--Anbieter, wie Xilinx, Altera oder Lattice, bieten neben den Profi--Versionen ihrer Entwurfswerkzeuge auch freie Einstiegsversionen an. Häufig ist es nötig, dennoch eine (kostenfreie) Lizenz beim Anbieter anzufordern --- Accounts auf den jeweiligen Hersteller--Web--Seiten sind unabdingbar. Hier nimmt Altera, deren Entwicklungswerkzeug \emph{Quartus II} heißt, derzeit (März 2009) eine Vorreiterrolle ein: Dem DE1--Board liegt, wie oben beschrieben eine DVD mit der kostenfreien Quartus Variante \emph{Quartus II Web Edition} [10] in der Version 7.2 bei. Zur Benutzung ist, wie eben erwähnt, eine kostenfreie Lizenz von Altera erforderlich, die alle 150 Tage erneuert werden muss. Aber Altera entwickelt Quartus nicht nur technisch weiter. Mittlerweile gibt es die Version 9 zum Download auf der Altera--Homepage und für ihren Betrieb ist keine Lizenz mehr nötig. Nett. Quartus Web Edition läuft unter Windows XP oder Vista (die Profi--Version auch unter Linux). Es stellt eine integrierte Entwicklungsumgebung klassischen Zuschnitts mit Editor, Projekt-- und Versionsverwaltung und zahlreichen Konfigurationsdialogen bereit und integriert die Entwurfswerkzeuge unter einer einheitlichen Oberfläche (siehe Abbildung \vref{fpga:quartus}). \begin{figure*}[t] \begin{center} \includegraphics[width=0.7\textwidth]{2009-01/quartus} \caption{\label{fpga:quartus}Ein Blick auf den Hauptbildschirm der Altera--Hardware--Entwicklungsumgebung Quartus [10]} \end{center} \end{figure*} Quartus verarbeitet Hardware--Entwürfe in Verilog und in VHDL. Wir werden im Verlauf der Artikelserie beide näher kennenlernen. Doch zunächst wollen wir uns auf Verilog konzentrieren. Zur Vertiefung bietet sich das Buch \emph{Digital Design} [11] von Morris Mano an, das eine gute Einführung in den Entwurf digitaler Systeme und zugehörige Beispiele in Verilog enthält. Nach der Quartus--Installation, eine einfache Click-Click-Click--Installation, schließen wir das Board an den PC an. Es muss der USB--Treiber für den USB--Blaster installiert werden. Er findet sich im Verzeichnis ...\verb|\quartus\drivers\usb-blaster|. \section*{Ansteuern der Schalter und LEDs} Unser allererster Verilog--Entwurf soll die Schiebeschalter auf dem Board auslesen und ihren Zustand auf den darüber befindlichen roten Leuchtdioden ausgeben. Außerdem lassen wir die grünen Leuchtdioden binär zählen. Zunächst gilt es, ein passendes Quartus--Projekt anzulegen. Der \emph{New Project Wizard} führt uns durch die notwendigen Schritte: Als Projektnamen wählen wir \texttt{DE1LEDs} und auch unsere Schaltung trägt diesen Namen. Als anzusteuerndes FPGA wählen wir unter den zahlreichen FPGA--Varianten den auf dem DE1 befindlichen \texttt{Cyclone II EP2C20F484C7} als \emph{Device}. Als Synthese--Werkzeug verwenden wir den \emph{Design Compiler}, einen Simulator und ein Werkzeug zur Analyse der Signallaufzeiten benötigen wir im Moment noch nicht. Das FPGA ist an die unterschiedlichen Schnittstellen des Boards abgeschlossen. Welcher Pin des FPGAs mit welcher Schnittstelle verbunden ist, kann je nach verwendetem Board natürlich variieren. Wie die Zuordnung im konkreten Fall aussieht, wird durch das \emph{PIN--Assignment} festgelegt. Für das DE1--Board importieren wir das Pin--Assignment \verb"CII_Starter_Default.qsf" aus den Beispiel--Entwürfen. Ein Verilog--Entwurf besteht aus einer Hierarchie von Modulen, die jeweils eine Schnittstelle mit Eingangs-- und Ausgangs--Signalen besitzen. Das Innere der Module legt die Verknüpfung der Schnittstellensignale fest. Ein ausgezeichnetes Haupt--Modul besitzt schließlich die Schnittstelle zur Board--Peripherie. Unsere erste Schaltung besteht nur aus diesem Hauptmodul. Wir definieren die Schnittstelle, versetzen die als \texttt{inout} gekennzeichneten Signale in den Tri--State--Zustand, dann definieren wir unsere eigentliche Schaltung: \begin{verbatim} reg [27:0] Cont; always@(posedge CLOCK_50) Cont <= Cont+1'b1; assign LEDG = Cont[27:20]; assign LEDR = SW; \end{verbatim} Wir definieren ein 28 Bit breites Register \texttt{Cont}. Immer wenn das Eingangs--Signal \verb|CLOCK_50|, das mit dem 50 Mhz Oszillator verbunden ist, eine positive Flanke hat, wird dieses Register um $1$ erhöht. (Die Konstante \verb|1'b1| beschreibt eine 1 Bit breite Binärzahl mit dem Wert 1.) Dann verbinden wir die 8 grünen LEDs (\texttt{LEDG}) mit den Bits 27 bis 20 des \texttt{Cont}--Registers. Die grünen LEDs werden passend binär zählen. Schließlich verbinden wir die Schiebeschalter (\texttt{SW}) mit den roten Leuchtdioden (\texttt{LEDR}). Der vollständige erste Verilog--Entwurf ist im Listing \vref{fpga:listing} abgedruckt. Dieses Listing nehmen wir in das oben angelegte Projekt auf und starten mit \emph{Start Compilation} die Synthese. Haben wir alles richtig gemacht, entsteht dabei die FPGA--Konfiguration in Form des Files \texttt{DE1LEDs.sof}. Dieses \mbox{File} können wir jetzt auf das DE1--Board laden. Das geschieht über den Menüpunkt \emph{Programmer}. Wir wählen beim ersten Mal den USB--Blaster als unser Programmiergerät (\emph{Hardware Setup}) und dann kann mit \emph{Start} der Download beginnen. Die Standard--Anwendung auf dem Board verschwindet und nach kurzer Zeit fangen die grünen Leuchtdioden an zu zählen. Ein bisschen Schieben der Schalter zeigt uns, dass auch die LEDs richtig mit den Schiebeschaltern verbunden sind. Es ist geschafft. Unser erster Verilog--Entwurf läuft im FPGA! \section*{Ausblick} Nun wollen wir ja nicht nur Leuchtdioden blinken lassen. Die auf dem Board integrierte 7--Segment--Anzeige können wir gut als Debugging--Werkzeug für die Suche nach Fehlern in unseren Schaltungen brauchen. Sie soll unsere Lupe in das FPGA werden. Wenn wir Zweifel über den Wert bestimmter Signalleitungen haben, so können wir versuchen, diese auf der 7--Segment--Anzeige darzustellen und so unseren Entwurf bestätigen oder Ungereimtheiten finden. Auch unsere Forth--Prozessoren werden sich über diese Anzeige bemerkbar machen können. Die Ansteuerung der 7--Segment--Anzeige soll unsere nächste Aufgabe sein, die wir im kommenden Teil 2 bearbeiten. \end{multicols} \vspace*{-7mm} \section*{Literatur} \vspace*{-2mm} \begin{small} {}[1] \url{http://www.colorforth.com/} Homepage von Charles Moore, Forth--Prozessor {\sf 25x}\\ {}[2] \url{http://www.intersil.com/cda/deviceinfo/0,1477,HS-RTX2010RH,0.html} Produktseite des RTX2010 bei Intersil\\ {}[3] \emph{Stack Computers: The New Wave}, Phillip Koopman, Ellis Horwood, 1989, \\ \hspace*{\fill}auch online unter \url{http://www.ece.cmu.edu/~koopman/stack_computers/index.html}\\ {}[4] \url{http://www.altera.com} Homepage von Altera\\ {}[5] \url{http://www.terasic.com} Homepage von Terasic, dem DE1-Board Hersteller\\ {}[6] \url{http://www.jwdt.com/~paysan/b16.html} Bernd Paysans Forth--Prozessor {\sf b16}\\ {}[7] \url{http://www.microcore.org} Klaus Schleisieks Forth--Prozessor {\sf MicroCore}\\ {}[8] \url{http://http://de.wikipedia.org/wiki/Field_Programmable_Gate_Array} Wikipedia--Eintrag zu FPGAs\\ {}[9] \url{http://www.altera.com/products/devkits/altera/kit-cyc2-2C20N.html} Beschreibung/Resourcen für das DE1--Board\\ {}[10] \url{http://www.altera.com/products/software/quartus-ii/web-edition/qts-we-index.html} Quartus II Web--Edition\\ {}[11] \emph{Digital Design, 3rd edition}, Morris Mano, Prentice Hall, 2001\\ {}[12] \emph{DE1 Development and Education Board --- Introduction}, DE1--Doku im File \texttt{DE1\_introduction\_box.pdf} siehe [9]\\ {}[13] \emph{DE1 Development and Education Board --- User Manual}, DE1--Doku im File \texttt{DE1\_UserManual\_v1018.pdf} siehe [9] \end{small} \newpage \begin{quote} \begin{small} \label{fpga:listing} \listinginput[1]{1}{2009-01/DE1LEDs.v} \end{small} \end{quote} \end{document}