Download:
|

vhdl2cpld: Designflow unter Linux für CPLDs mit den Xilinx-WebPack
V0.36 (c) 2005-2007 Joerg Wolfram
1 Allgemeines
Das Programm unterliegt der GPL (GNU General Public Licence)
Version 2 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 nebst Entwicklungsboard geworden.
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 7.1i .
Diese kann unter http://www.xilinx.com
nach einer einfachen Registrationsprozedur heruntergeladen werden.
Die Datei ist etwa 242 Megabytes groß, so sollte man schon über
DSL verfügen oder zumindest jemanden kennen, der welches hat ;-)
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. Das Verzeichnis ist unter
ftp://ftp.xilinx.com/pub/utilities/fpga/linuxdrivers.tar.gz
zu finden. Zusätzlich müssen noch die
Kernelquellen des installierten Kernels installiert werden. Bei mir
ist das die Version 2.4.21-144 , im nachfolgenden Beispiel beziehe
ich mich auf diese Version, mit anderen Kerneln, zumindest 2.4-ern
sollte es ganauso funktionieren.
- Kernelquellen installieren (z.B. als RPM-Paket)
- Wenn nicht vorhanden, einen Link von den Kernelquellen ins Modulverzeichnis legen:
ln -s /usr/src/linux-2.4.21-144-include/default /lib/modules/2.4.21-144-default/build
- Das Kerneltreiberpaket herunterladen und z.B. nach /usr/src entpacken:
tar -zxvf linuxdrivers.tar.gz
- In das Verzeichnis /usr/src/linuxdrivers/windrvr wechseln. Mit:
make && make install
den Treiber übersetzen und installieren. Bricht
make install mit einer Fehlermeldung ab,
dass die Kernelversion nicht gefunden werden kann,
muss das Makefile geändert werden. Dazu sucht man sich die
erste Zeile, die mit CFLAGS beginnt. In dieser Zeile
löscht man -O2 oder ändert es in -O0.
Dies schaltet Optimierungen aus, die den Fehler bei verschiedenen
GCC-Versionen hervorrufen. Nach der änderung muss das
Linux...-Verzeichnis wieder gelöscht werden,
damit das Modul wieder neu übersetzt werden kann.
- In das Verzeichnis /usr/src/linuxdrivers/xpc4drvr wechseln. Mit:
make && make install
den Treiber übersetzen und installieren. Bei meiner GCC-Version (3.4.3) war eine
änderung am Makefile nicht nötig.
- Ins Verzeichnis /lib/modules/misc wechseln und allen Usern, die den Kabeltreiber
nutzen können sollen, Schreibrechte auf die beiden Dateien
windrvr.o und xpcdrvr.o einrichten.
- Ein kleines Script zur Installation erzeugen:
#!/bin/bash
insmod windrvr.so
insmod xpc4drvr.so
|
Da der windrvr auch normalen Usern direkten Zugriff auf die Hardware
ermöglicht, sollte er aus Sicherheitsgründen nur bei Bedarf
geladen werden.
- die Treiber durch Aufruf des
Script installieren. Wer es will, kann natürlich auch die
beiden Module beim Booten mit installieren lassen.
4 Installation und Konfiguration des Scripts
Jetzt muss noch das Shell-Script
vhdl2cpld z.B. nach /usr/local/bin heruntergeladen und konfiguriert
werden. Dazu muss es mit einem Texteditor geöffnet werden. Nach
den Kommentaren wird die Variable $xilinx eingerichtet. Hier muss der
Pfad angegeben werden, wohin das WebPack installiert wurde. Danach
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
meist 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äge 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. |
|
|
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.
7 Changelog
7.1 Aktualisierung vom 12.02.2006
Update für vhdl2cpld, user contraints zu nichtexistierenden Signalen führen nicht
mehr zum Abbruch.
7.2 Aktualisierung vom 16.02.2006
Update für vhdl2cpld, nichtbenutzte Pins werden automatisch mit Ground verbunden, per
default optimiert der CPLD-Fitter nicht mehr für Geschwindigkeit und die Ausgangspins
arbeiten im Low-Power-Mode. über zusätzlich Optionen lässt sich dies aber
ändern.
7.3 Aktualisierung vom 19.02.2006
Weitere Optionen für vhdl2cpld und ein erstes dokumentiertes Projekt (Design)
7.4 Aktualisierung vom 26.02.2006
Downloads jetzt über die Berlios-Projektseite
7.5 Aktualisierung vom 12.03.2006
Ein weiteres dokumentiertes CPLD-Projekt und ein kleines VHDL-Intro
7.6 Aktualisierung vom 30.04.2006
Neue Version von vhdl2cpld, ein paar Ergänzungen im VHDL-Intro
7.7 Aktualisierung vom 09.03.2007
Neue Version (0.36) von vhdl2cpld erzeugt nun auch einen Timing-Report
Die Beschreibung des Demoboards entfernt
erzeugt mit latex2web.pl v0.45 © 2006 Joerg Wolfram
|