|
vhdl2cpld: Designflow unter Linux für CPLDs mit den Xilinx-WebPack
V0.41 (c) 2005-2011 Joerg Wolfram
1 Allgemeines
Das Programm unterliegt der GPL (GNU General Public Licence)
Version 3 oder höher, jede Nutzung der Software/Informationen nonkonform
zur GPL oder ausserhalb des Geltungsbereiches der GPL ist untersagt!
Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß
es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, auch
ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT
FÜR EINEN BESTIMMTEN ZWECK.
2 Warum?
Nachdem ich schon längere Zeit
nach einer Möglichkeit, VHDL zu lernen und auch praktisch
anzuwenden, bin ich auf die freie Linux-Version des Xilinx-Paketes
gestossen. Nach etwa 10 Stunden Download (ISDN) war die erste Hürde
genommen. Die Installation hat dann auch geklappt, aber mit dem
Hinweis, dass die Kabeltreiber als root installiert werden müssen.
Nach dem oder besser beim Start kam dann schnell die Ernüchterung.
Auf meinem Laptop (IBM Thinkpad 600 mit Pentium II-300, Linux auf Basis
von SuSE 9.0) dauerte dieser schon ein paar Minuten. Und auch jede
Änderung dauerte ewig, der Schematic Editor liess sich gar nicht nutzen.
Mit dem VHDL-Editor ging es schon etwas besser, wegen dem fehlenden
Kabeltreiber kam ich nur bis zur .jed Datei, aber das war schon OK.
Wesentlich ärgerlicher war, daß ich beim nächsten Start mein Projekt
nicht mehr öffnen konnte. Das Internet war auch keine große Hilfe,
bis ich dann von Kommandozeilentools gelesen und mir die verschiedenen
Dokumentationen im Xilinx-Verzeichnis durchgelesen habe. Ein paar
Versuche mit der schonmal erfolgreich übersetzten VHDL-Datei
haben mich dann zum Shell-Script vhdl2cpld gebracht,
welches das Ganze weitestgehend automatisiert. Inzwischen ist daraus
daraus ein eigenes Projekt.
Warum CPLD's und keine FPGA's?
Das hie beschriebene Vorgehen kann bei kleinen Änderungen am Script
auch für FPGA's verwendet werden, aber gerade mit den 44-Pin-CPLD's
lassen sich auch noch Projekte mit einlagigen Leiterplattenlayouts
(oder auch Lochrasterplatten) realisieren, was die Gestaltung und den
Nachbau von Projekten erheblich erleichtert.
Das Projekt befindet sich noch im Fluss und erhebt keinen Anspruch
auf Vollständigkeit. Für Hinweise und Anregungen bin ich jederzeit dankbar.
3 Installation der Software
Zuallererst brauchen wir die Linux-Version von ISE WebPack
Diese kann unter http://www.xilinx.com nach einer einfachen Registrationsprozedur heruntergeladen werden.
Ich benutze noch immer die "alte" Version 7.1i, die für den vorgegebenen Zweck
völlig ausreicht und auch vom Speicherverbrauch her noch recht moderat ist.
Außerdem lässt sich das Programmverzeichnis problemlos und
Installationsprozedere von einem Rechner auf den nächsten kopieren.
Die Datei ist etwa 242 Megabytes groß, ausgepackt belegt das Ganze auf der Festplatte etwa 670MB.
Damit die Programme auch ihre Librarys finden können, muss der genaue
Pfad mit den Binarys (.../Xilinx/bin/lin) in die Datei /etc/ld.so.conf
eingetragen und ldconfig aufgerufen werden.
Desweiteren werden noch die Kabeltreiber benötigt. Da es unter Kernel 2.6.x
Glückssche ist, den Jungo-Driver kompiliert zu bekommen und dieser auch noch
propietärer Art ist, habe ich das Ganze auf den USB-DRIVER.HEAD umgestellt.
Dieser wird einfach nach Anleitung kompiliert und installiert und funktioniert
sowohl mit den USB- als auch mit den Parallelportkabeln.
4 Installation und Konfiguration des Scripts
Jetzt muss noch das Shell-Script
vhdl2cpld z.B. nach /usr/local/bin kopiert und konfiguriert
werden. Dazu muss es mit einem Texteditor geöffnet werden. Zuerst
muss der Pfad zur USB-driver library festgelegt werden. Wenn der
Driver selbst kompiliert wurde, sollte der angegebene Pfad bereits
stimmen. Danach wird die Variable $xilinx eingerichtet. Hier muss der
Pfad angegeben werden, wohin das WebPack installiert wurde.
Es folgen die Einträge $errview und $logview. hier muss angegeben
werden, mit welchem Programm die Fehlermeldungen angezeigt werden
sollen. Arbeitet man lieber nur auf der Konsole, dürfte ein
cat genügen, ansonsten z.B. xemacs, bei Bedarf
auch mit Parametern.
5 Eine VHDL-Datei
VHDL-Tutorials und Referenzen gibt es im Internet zuhauf, deshalb will ich nur die
für die CPLD-Entwicklung notwendige Syntax und ein paar Eigenheiten des
User Constraint Files (ucf) erklären. Doch zuerst einmal ein VHDL-Quellfile:
---Company:
---Engineer: Joerg Wolfram
---Create Date: 10:19:45 06/09/05
---Design Name: testlogik
---Module Name: main1 - Behavioral
---Project Name: Demoprojrkt
---Target Device: XC9536-5-44PC
---Tool versions: XILINX Webpack 7.1 (linux) + vhdl2cpld
---Description:
---Dependencies:
---Revision:
---Comments:
IEEE;
IEEE.STD_LOGIC_1164.ALL;
IEEE.STD_LOGIC_ARITH.ALL;
IEEE.STD_LOGIC_UNSIGNED.ALL;
entity testlogik is
Port ( in1 : in std_logic_vector(1 downto 0);
result : out std_logic);
end testlogik;
architecture program of testlogik is
begin
process (in1)
begin
if (in1 =
result
else
result
end if;
end process;
end program;
configuration main of testlogik is
for program
end for;
end configuration main;
|
Kommentare in VHDL-Dateien beginnen immer mit zwei Minuszeichen (--) und gehen
bis zum Ende der Zeile. Eine detaillierte Beschreibung findet sich im VHDL-Projekte
Verzeichnis.
Eine weitere wichtige Komponente ist das User-Constraints-File
mit der Endung .ucf mit dem zum Beispiel die IN und OUT-Signale zu
physikalischen Pins fest zugeordnet werden können. Existiert ein
derartiges File nicht, so werden die Pins vom CPLD-Fitter willkürlich
bestimmt. Das gilt auch für Signale, die nicht explizit an Pins
gebunden werden.
Der Bereich zur Pin-Zuordnung steht im Beispiel zwischen den Kommentaren
#PINLOCK_BEGIN und #PINLOCK_END.
dazwischen stehen die Pinzuweisungen in folgender Form:
- NET "Signalname" LOC="PINxx";
Nach NET steht der Signalname, wie er auch in der VHDL-Datei steht.
Im zweiten Teil steht nach LOC= die Pinnummer.
Um Strom zu sparen, kann man für bestimmte Ausgänge ein langsameres
Timing wählen:
- NET "Signalname" pwr_mode=low;
Oder, für hohe Geschwindigkeit (und hohen Stromverbrauch):
- NET "Signalname" pwr_mode=std;
Diese Einstellungen haben natürlich nur für Ausgänge Sinn.
Bei Register-Ausgängen kann der Zustand nach der Initialisierung (Einschalten)
festgelegt werden:
- NET "Signalname" INIT='0';
- NET "Signalname" INIT='1';
setzt das Register auf den entsprechenden Wert.
<br>
Mittels des "Pipe"-Zeichens können auch mehrere Festlegungen zu einem
Signal getroffen werden:
- NET "Signalname" LOC="PINxx" | INIT='0';
Die Datei m.ucf für unser Demo hat folgenden Inhalt:
#PINLOCK_BEGIN
NET "in1<0>" LOC="PIN1";
NET "in1<1>" LOC="PIN2";
NET "result" LOC="PIN3";
#PINLOCK_END
|
Jetzt geht's ans übersetzen. Wenn als CPLD ein XC9536 im PLCC-44
Gehäuse benutzt wird, brauchen keine Optionen eingegeben werden.
vhdl2cpld -noburn
Mit der Option "-noburn" wird verhindert, dass Impact zum Brennen des CPLD's
gestartet wird, weitere Optionen können mit
vhdl2cpld --help
angezeigt werden. Die Bedeutung der Optionen ist im Einzelnen:
--help |
Anzeige der möglichen Optionen |
-nogen |
Die Datei "project.jed" wird ohne vorherige Compilierung gebrannt. |
-noburn |
Das Projekt wird nur compiliert (ohne Impact zum Brennen) |
-detail |
Es wird ein detaillierter Timingreport erzeugt. |
-top name |
Festlegung des toplevel-Elements (optional). |
-type Typ |
Auswahl eines anderen CPLD-Types anstelle XC9536-5-PC44 |
-position num |
Position des zu programmierenden CPLD's in der Kette (default 1) |
-speed |
XST und der CPLD-Fitter werden mit Optimierung für Geschwindigkeit aufgerufen.
Für zeitkritische Designs, ohne diese Option lässt sich aber
oft mehr Logik im Chip unterbringen. |
-highpower |
Ausgänge werden per default im Standard-Mode betrieben.
Dadurch werden sie zwar schneller, aber auch dei Stromaufnahme steigt an. |
-startconfig |
Programmlauf ohne XST (Compiler), unm z.B. bei fehlgeschlagenem Fitten
die Pins anders zu verteilen, ohne das Design neu übersetzen zu müssen. |
-inputs num |
Begrenzung der Anzahl der Funktionsblock-eingänge für Logikgleichungen
(CPLD-Fitter-Option).
Diese Option kann benutzt werden, falls der Fitt-Vorgang fehlgeschlagen ist. |
-pterms num |
Begrenzung der Anzahl der Produkt-Terme für Logikgleichungen (CPLD-Fitter-Option).
Diese Option kann benutzt werden, falls der Fitt-Vorgang fehlgeschlagen ist. |
-optlevel 1/2 |
Einstellung für den Optimierungs-Level. Standardmäßig wird 1 für Optimierung nach
Geschwindigkeit (-speed) und 2 für Optimierung nach Fläche voreingestellt. |
-svf |
Impact erzeugt eine SVF-Datei mit dem Namen project.svf diese kann z.B. mit
anderen JTAG-Programmern benutzt werden. |
-xsvf |
Impact erzeugt eine XSVF-Datei mit dem Namen project.xsvf diese kann z.B. mit
anderen JTAG bzw. XILINX-Programmern benutzt werden. |
-sim |
Es werden Dateien für eine Post-Fit-Simulation erzeugt. |
Für Hinweise empfehle ich xapp444.pdf "CPLD-Fitting, Tips and Tricks",
das Dokument kann bei Xilinx heruntergeladen werden.
6 To be continued...
Der Beitrag soll zuerst einmal dazu dienen, die ersten Hürden bei der CPLD-Entwicklung
mit Linux etwas kleiner zu machen. Einzelne VHDL-Projekte und ein kleines Intro in VHDL gibts
bei den VHDL-Projekten.
created with latex2web.pl v0.58 © 2006-2010 Joerg Wolfram
|