This is an old revision of the document!
How to setup a new project
In diesem HowTo wird das Anlegen eines Syntheseprojektes am Beispiel einer Verschaltung von zwei UND Gattern Schritt f眉r Schritt beschrieben.
Funktion der Beispielschaltung
Ein Modul 鈥渁nd5鈥� soll ein UND Gatter mit f眉nf Eing盲ngen und einem Ausgang enthalten. Dieses 鈥渁nd5鈥� Modul soll zweimal instantiiert werden. Die Eing盲nge von and5_i0 werden mit den Schalten SW0 bis SW4 verbunden. Die Eing盲nge des Moduls and5_i1 werden mit den Schaltern SW5 bis SW9 verbunden. Der Ausgang von and5_i0 wird mit der roten Leuchtdiode LEDR0 verbunden. Der Ausgang von and5_i1 wird mit der roten Leuchtdiode LEDR1 verbunden. Wenn die Schalter SW0 bis SW1 alle auf 鈥渙n鈥� geschaltet sind, dann soll die rote Leuchtdiode LED0 leuchten. Entsprechend die LED1. Die Verbindung der beiden UND Gatter mit den Schaltern und den roten Leuchtdioden wird auf dem Toplevelmodul de1_and5 gemacht.
1. Partitionierung in Module
Die Schaltung wird in einzelne Teilschaltungen aufgeteilt. Es gibt immer ein 鈥淭oplevelmodul鈥�, das die oberste Schaltungshierarchie repr盲sentiert. Dieses Modul hat als Ein- und Ausg盲nge die Pins des FPGAs. In diesem Beispiel gibt zwei Module
- Toplevelmodul: de1_and5
- normales Modul: and5
Der Name des Toplevelmoduls soll die Form de1_XXXX haben. Damit wird schon am Namen deutlich, dass es ein Toplevelmodul ist.
2. Erstellen der VHDL Dateien
Jedes Schaltungsmodul kommt in eine eigene VHDL Datei. Das Toplevelmodul repr盲sentiert die oberste Hierarchie in der Schaltung und hat als Ports die Pins des FPGAs, also bei uns die Schalter SWx und die Leuchtdioden LEDRx.
- F眉r das Modul and5 wird eine VHDL Datei 鈥渁nd5_rtl.vhd鈥� angelegt.
- F眉r das Toplevelmodul de1_and5 wird eine VHDL Datei 鈥渄e1_and5_rtl.vhd鈥� angelegt.
Der Dateiname der VHDL Datei eines normalen Moduls hat die Form 鈥淢ODULNAME_rtl.vhd鈥� (hier: and5_rtl.vhd). Der Name der VHDL Datei des Toplevelmoduls lautet 鈥淭OPLEVELMODULNAME_rtl.vhd鈥� (hier: de1_and5_rtl.vhd).
Die VHDL Dateien befinden sich alle in dem Verzeichnis 鈥渟rc鈥�. Zweckm盲脽igerweise kopiert man eine existierende VHDL Datei und benennt sie um.
cd ~/projects/digitaltechnikpraktikum cd src cp cntones_rtl.vhd and5_rtl.vhd cp de1_ledcntsw_rtl.vhd de1_and5_rtl.vhd
Danach kann man die VHDL Dateien mit einem Editor der Wahl an das Projekt anpassen. Zun盲chst sollten minimale Dateien nur mit einer Entity und einer leeren Architecture erstellt werden. Die Datei 鈥渁nd5_rtl.vhd鈥� sollte dann so wie hier aussehen:
- and5_rtl.vhd
library ieee; use ieee.std_logic_1164.all; entity and5 is port ( x_i : in std_ulogic_vector(4 downto 0); y_o : out std_ulogic); end entity and5; architecture rtl of and5 is begin end architecture rtl;
Die Datei hat schon eine korrekte entity mit den richtigen Ports, aber eine leere Architecture. Im Beispiel hier sind die f眉nf Eing盲nge des Moduls 鈥渁nd5鈥� als Typ 鈥渟td_ulogic_vector鈥� mit einer Arrayl盲nge von 5 definiert. Der Ausgang ist ein einzelner Ausgang vom Typ 鈥渟td_ulogic鈥�. Der Name des Eingangs ist 鈥渪_i鈥� und der Name des Ausgangs is 鈥測_o鈥�. Der Name 鈥淴XX_i鈥� deutet schon im Namen auf einen Eingang hin. Beim Namen des Ausgangs 鈥淴XX_o鈥� deutet 鈥淿o鈥� darauf hin, dass es sich um einen Ausgang handelt. Der Entityname ist der Name des Moduls - hier 鈥渁nd5鈥�.
Entsprechend wird die Toplevel VHDL Datei erstellt. Die Portnamen vom Toplevelmodul sind Namen, die auf dem Altera DE1 Modul eine Bedeutung haben. In diesem Beispiel steht der Port 鈥淪W鈥� f眉r die Schalter auf dem Board (鈥淪witches鈥�). Der Port 鈥淟EDR鈥� steht f眉r die roten Leuchtdioden, die direkt 眉ber den Schaltern angeordnet sind. Von den roten Leuchtdioden werden in diesem Projekt nur zwei verwendet.
- de1_and5_rtl.vhd
library ieee; use ieee.std_logic_1164.all; entity de1_and5 is port ( SW : in std_ulogic_vector(9 downto 0); LEDR : out std_ulogic_vector(1 downto 0)); end entity de1_and5; architecture rtl of de1_and5 is begin end architecture rtl;
3. Erstellen des Syntheseprojektes
Nachdem die VHDL Dateien erstellt wurden, kann man den Ordner f眉r das Syntheseprojekt im Ordner 鈥減nr鈥� erstellen. Der Name des Ordners muss der gleiche sein wie der Modulname des Toplevelmoduls. Auch hier kann man am einfachsten ein existierendes Projekt kopieren und dann das Makefile und die Pinkonfigurationsdatei anpassen. Im Beispiel hier kopiere ich die Dateien vom Projekt 鈥渄e1_ledcntsw鈥�.
cd ~/projects/digitaltechnikpraktikum cd pnr cp -R de1_ledcntsw de1_and5 cd de1_and5
Das Verzeichnis 鈥減nr/de1_and5鈥� enth盲lt nun die beiden Dateien 鈥渄e1_ledcntsw_pins.tcl鈥� und 鈥渕akefile鈥�.
caeuser@CAE-Tools-OS:~/projects/digitaltechnikpraktikum/pnr/de1_and5$ ls -la total 16 drwxr-xr-x 2 caeuser users 4096 Apr 2 22:51 . drwxr-xr-x 19 caeuser users 4096 Apr 2 22:51 .. -rw-r--r-- 1 caeuser users 1234 Apr 2 22:51 de1_ledcntsw_pins.tcl -rw-r--r-- 1 caeuser users 247 Apr 2 22:51 makefile caeuser@CAE-Tools-OS:~/projects/digitaltechnikpraktikum/pnr/de1_and5$
Die Pinkonfigurationsdatei muss umbenannt werden in 鈥淭OPLEVELMODULNAME_pins.tcl鈥�. Hier in 鈥渄e1_and5_pins.tcl鈥�.
mv de1_ledcntsw_pins.tcl de1_and5_pins.tcl
In der Pinkonfigurationsdatei wird jedem Portnamen des Toplevelmoduls ein Pin auf dem FPGA zugeordnet. Es m眉ssen genau die Ports aus dem Toplevelmodul aufgef眉hrt werden, d.h. es d眉rfen auch nicht mehr Pins enthalten sein. In diesem Beispiel m眉ssen einige Pindefinitionen gel枚scht werden. Die Pinkonfigurationsdatei muss danach so ausssehen:
- de1_and5_pins.tcl
# Pin Configuration set_location_assignment PIN_L22 -to SW[0] set_location_assignment PIN_L21 -to SW[1] set_location_assignment PIN_M22 -to SW[2] set_location_assignment PIN_V12 -to SW[3] set_location_assignment PIN_W12 -to SW[4] set_location_assignment PIN_U12 -to SW[5] set_location_assignment PIN_U11 -to SW[6] set_location_assignment PIN_M2 -to SW[7] set_location_assignment PIN_M1 -to SW[8] set_location_assignment PIN_L2 -to SW[9] set_location_assignment PIN_R20 -to LEDR[0] set_location_assignment PIN_R19 -to LEDR[1]
Im Makefile muss die Variable PROJECT auf den Namen des Toplevelmoduls gesetzt werden und alle VHDL Dateien, die zum Projekt geh枚ren m眉ssen unter der Variable SOURCE_FILES aufgef眉hrt werden. Nach den Anpassungen muss das Makefile so aussehen:
- makefile
# The PROJECT variable must match the # toplevel VHDL entity name # and should match the directory name in the pnr directory PROJECT = de1_and5 SOURCE_FILES = \ ../../src/de1_and5_rtl.vhd \ ../../src/and5_rtl.vhd include ../makefile
4. Testen des Syntheseprojektes
Jetzt muss man Testen ob die Konfiguration des Syntheseprojektes funktioniert hat. Dazu geht man in Projektordner im Verzeichnis 鈥減nr鈥� und 枚ffnet quartus 眉ber den Makemechanismus.
cd ~/projects/digitaltechnikpraktikum cd pnr make quartus
Mit 鈥渕ake qartus鈥� wird das Syntheseprojekt angelegt und die GUI der Quartussoftware ge枚ffnet. Wenn sich die GUI 枚ffnet, ist es schonmal nicht schlecht. Danach kann man die Synthese starten. Wenn hier noch Syntaxfehler in den VHDL Dateien sind oder noch VHDL Dateien fehlen, dann f盲llt es hier auf.
M枚gliche Fehler
Nicht existierende VHDL Dateien in SOURCE_FILES
Der Schritt 鈥渕ake quartus鈥� schl盲gt fehlt, wenn das makefile nicht korrekt konfiguriert ist. Wenn beispielsweise eine VHDL Datei in 鈥淪OURCE_FIlES鈥� aufgelistet wird, die nicht existiert wie in diesem Beispiel:
- makefile_NON_EXISTING_VHD_FILE
# The PROJECT variable must match the # toplevel VHDL entity name # and should match the directory name in the pnr directory PROJECT = de1_and5 SOURCE_FILES = \ ../../src/de1_and5_rtl.vhd \ ../../src/MICH_GIBT_ES_NICHT.vhd include ../makefile
Dann f眉hrt das zu:
caeuser@CAE-Tools-OS:~/projects/digitaltechnikpraktikum/pnr/de1_and5$ make quartus make: *** No rule to make target '../../src/MICH_GIBT_ES_NICHT.vhd', needed by 'de1_and5.qpf'. Stop. caeuser@CAE-Tools-OS:~/projects/digitaltechnikpraktikum/pnr/de1_and5$
PROJECT und der Name der Pinkonfigurationsdatei passen nicht zusammen
Der erwartete Name der Pinkonfigurationsdatei ist 鈥�$(PROJECT)_pins.tcl鈥�. Wenn das nicht zusammenpasst und die Variable PROJECT im Makefile beispielsweise auf 鈥淧ROJECT = de1_MICH_GIBT_ES_NICHT鈥� gesetzt wird, dann sieht das im Ergebnis so aus:
caeuser@CAE-Tools-OS:~/projects/digitaltechnikpraktikum/pnr/de1_and5$ make quartus make: *** No rule to make target 'de1_MICH_GIBT_ES_NICHT_pins.tcl', needed by 'de1_MICH_GIBT_ES_NICHT.qpf'. Stop.
Entity im Toplevelmodul hat anderen Namen als PROJECT
Wenn der Name der Entity im Toplevelmodul nicht gleich PROJECT (hier 鈥渄e1_XXXX鈥�) ist, dann sieht das bei Start der Synthese so aus:
Error (12007): Top-level design entity "de1_XXXX" is undefined Error: Quartus II 32-bit Analysis & Synthesis was unsuccessful. 1 error, 2 warnings Error: Peak virtual memory: 358 megabytes Error: Processing ended: Sun Apr 2 23:29:52 2023 Error: Elapsed time: 00:00:01 Error: Total CPU time (on all processors): 00:00:01 Error (293001): Quartus II Full Compilation was unsuccessful. 3 errors, 2 warnings