[[dtpr_versuch_2]]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dtpr_versuch_2 [2010/11/23 08:03]
beckmanf Aufgaben Teil 4 eingefügt
dtpr_versuch_2 [2021/03/29 09:57] (current)
gmo
Line 1: Line 1:
-==== Versuch 2 ==== 
  
-Dieser Versuch behandelt kombinatorische und arithmetische Schaltungen. ​+===== Digitaltechnik Praktikum - Einführung Quartus =====
  
-=== Binär ​zu 7-Segment Umsetzung ===+In diesem Tutorial lernen Sie die FPGA Synthesesoftware Quartus von Altera kennen. Das Ziel ist es das FPGA so zu konfigurieren,​ dass mit Hilfe der Schalter SW die roten Leuchtdioden LEDR einund ausgeschaltet werden können. Sie lernen drei Varianten zum Aufsetzen eines Quartusprojektes kennen ​
  
-Die erste Schaltung ist eine Binär zu 7-Segment Umkodierung "​bin2seg"​Mit einer 7-Segment Anzeige lassen +  * Manuelles Aufsetzen eines Quartusprojektes mit Hilfe des Assistenten.  
-sich die Ziffern 0-9 und mit etwas Phantasie auch die Buchstaben a-f darstellenDie Anzeige dient +  * Aufsetzen ​und Synthese ​mit eine tcl Skript.  
-dazu die Zahlen in der Schaltung in einer dezimalen, lesbaren Form anzuzeigen. Mit den Buchstaben a-f +  ​* Synthese auf Basis von Makefiles
-lässt sich dann eine 4-Bit Zahl auch als hexadezimale Zahl darstellen. ​ +
  
-Der Eingang der Schaltung ist eine vorzeichenlose 4-Bit Binärzahl und der Ausgang ist ein Vektor ​mit  +Dabei wird in den folgenden Versuchen nur die Synthese ​mit Hilfe von Makefiles verwendetAllerdings verwenden Sie die grafische Benutzeroberfläche ​der Software ​"Quartus" ​auch um beispielsweise einen Schaltplan anzuzeigen
-sieben Leitungen, die die einzelnen Segmente ansteuernZu jeder Binärzahl muss deshalb ​die geeignete  +  
-Ansteuerung ​der LEDs in der 7-Segment Anzeige gefunden werden. Wenn also der Eingang auf "0000" ​liegt,  +==== Vorbereitung ====
-dann sollen die LEDs so angesteuert werden, dass eine 0 in der Anzeige erscheintEine Testbench und  +
-ein Gerüst für die Schaltung ist hier: +
  
-[[Binär ​zu 7-Segment Kodierer Code]]+Im [[https://​www.hs-augsburg.de/​~beckmanf/​restricted/​DE1_V.1.0.1_CDROM/​DE1_user_manual/​DE1_UserManual_v1.2.1.pdf|User Manual]] für das Altera DE1 Board finden Sie auf den Seiten 24 bis 27 eine Beschreibung der LEDs, der Schalter SW und der Taster KEYS. Im [[https://​www.hs-augsburg.de/​~beckmanf/​restricted/​DE1_V.1.0.1_CDROM/​DE1_schematics/​de1_v11a.pdf|Schaltplan]] des DE1 Boards können Sie nachschauen an welchen Pins die LEDs und die Schalter angeschlossen sind. Diese Anschlüsse sind auch im Handbuch in Tabellen 4.1 bis 4.3 angegeben. Beispielsweise ist LEDR0 an Pin R20 des FPGA angeschlossen. Auf der [[https://​www.hs-augsburg.de/​~beckmanf/​restricted/​DE1_V.1.0.1_CDROM|CDROM]],​ die zu dem Altera DE1 Board gehört, befindet sich eine Tabelle [[https://​www.hs-augsburg.de/​~beckmanf/​restricted/​DE1_V.1.0.1_CDROM/​DE1_lab_exercises/​DE1_pin_assignments.csv|DE1_pin_assignments.csv]], in denen diese Zuordnung von Signalnamen wie LEDR0 zu den Pins des FPGA aufgeführt ist. 
  
-Die Schaltung ist in einen Toplevel "​top"​ eingefügt, der die Signalnamen gemäß den Konventionen 
-auf dem Board hat. Also SW für die Schalter und HEX0 für die erste 7-Segment Anzeige. Der Toplevel 
-ist so aufgebaut, dass die Schalter 3-0 an den Eingang des Umsetzers geführt werden. ​ 
  
-Das Ziel der Gesamtschaltung ist es, dass eine 4-Bitzahl an den Schaltern SW(3-0) eingestellt werden kann +==== Starten einer Shell unter Ubuntu ====
-und die entsprechende Ziffer an der 7-Segmentanzeige HEX0 ausgegeben wird. +
  
-=== Process und Case Statement ===+{{ ::​dtpr-start-terminal.jpg | Start des Terminal}}
  
-In der VHDL Beschreibung für "bin2seg" ​sind die Konstrukte "​process"​ und "​case"​ neu.+Starten Sie das Terminal über das Menu "System Tools -> LX Terminal"​. ​
  
-== Der Prozess ​== +{{ ::​dtpr-terminal.jpg | Fenster mit Terminal}} 
-<code vhdl> + 
-  ​signal a,b,c,d : std_ulogic; ​ +Jetzt haben Sie ein geöffnetes Terminalprogramm. 
-     + 
-  ​name_pprocess(c,​d) +=== Überblick über einige Unix Shellbefehle === 
-  begin + 
-    a <'​1';​ +^ Befehl ^ Beispiel ^ Beschreibung ^ 
-    b <c; +|ls| ls -la | Anzeige der Dateien im aktuellen Verzeichnis| 
-    if d '​1'​ then +|pwd| pwd | Anzeige des Pfads vom aktuellen Verzeichnis| 
-      a <c; +|mkdir| mkdir projects| Erzeugen eines neuen Verzeichnisses "​projects"​ | 
-    else +|cd| cd projects | Wechsel in das Verzeichnis "​projects"​ | 
-      a <= not c; +|cd| cd .. | Wechsel in das höhere Verzeichnis ausgehend vom aktuellen Verzeichnis| 
-    end if;  +|man| man ls | Aufruf des Handbuchs für den Befehl "​ls"​ | 
-  ​end process;+|rm| rm hallo.txt| Löschen der Datei "​hallo.txt"​ | 
 +|less| less hallo.txt| Anschauen der Datei "​hallo.txt"​. Beenden mit "​q"​| 
 +|[[http://​heather.cs.ucdavis.edu/​~matloff/​UnixAndC/​Editors/​ViIntro.html|vi]]| vi hallo.txt| Editor starten für die Datei hallo.txt| 
 + 
 +==== Laden der Designdaten vom git Server ==== 
 + 
 +Die Designdaten für das Digitaltechnikpraktikum sind auf dem [[https://​gitlab.elektrotechnik.hs-augsburg.de|git Server der Fakultät Elektrotechnik]]. Der Zugriff erfolgt über das git Programm. Auf dem git server befindet sich das [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum|Projekt Digitaltechnikpraktikum]] mit den Dateien für das Praktikum. 
 + 
 +{{ ::​dtpr-mkdir-projects.jpg | Anlegen des Projektverzeichnisses}} 
 + 
 +Richten Sie ein Verzeichnis "​projects"​ in Ihrem home directory ein. Das Homedirectory ist "/​home/​caeuser"​. Wechseln Sie in das Verzeichnis "​projects"​ und laden Sie mit "​git"​ die Designdaten vom git Server. ​  
 + 
 +<​code>​ 
 +mkdir projects 
 +cd projects 
 +git clone https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum.git 
 +ls -la
 </​code>​ </​code>​
-  
-Alle Anweisungen in einem Prozess werden hintereinander ausgeführt,​ aber alle Signalzuweisungen 
-werden erst am Ende des Prozesses aktiv! Es ist auch immer nur die letzte Zuweisung relevant. ​ 
-Dies ist also fundamental anders als beispielsweise in einem C Code. Dort wird jede Anweisung sofort ausgeführt. ​ 
-In diesem Beispiel ist also die Reihenfolge von "​a<​='​1'"​ und "​b<​=c"​ gleichgültig. "​b"​ ändert sich also nicht 
-zeitlich später als a. Allerdings ist die Anweisung "​a<​='​1'"​ nicht relevant, da am Ende des Prozesses 
-der Wert von "​c"​ oder "not c" zugewiesen wird.  
  
-== Wichtige Regeln für die Synthese ==+Das sollte dann so aussehen: ​
  
-  * Ein Prozess wie oben dargestellt führt zu rein kombinatorischer Logik mit den Eingängen c und d und den Ausgängen a und b +{{ ::​dtpr-git-clone.jpg | Projektverzeichnis nach Download}}
-  * Alle Eingänge müssen oben in der "​sensitivity list" (= Parameter des Prozesses) angegeben sein.  +
-  * Jedem Ausgangssignal muss in jedem Durchlauf des Prozesses ein Wert zugewiesen werden. Wenn dies nicht befolgt wird, entstehen bei der Synthese Latches  +
-  * Ein Ausgangssignal darf in dem Prozess nicht gelesen werden, da dann eine kombinatorische Loop entsteht+
  
-== How to make and avoid a latches ==+Wechseln sie dann in das Verzeichnis "​digitaltechnikpraktikum"​ und dann in das Verzeichnis "​src"​. Starten Sie dort einen Editor und schauen sich die Datei "​ledsw_rtl.vhd"​ an. 
  
-Durch diesen Code entsteht bei der Synthese ein Latch:  +<​code>​ 
-<​code ​vhdl+cd digitaltechnikpraktikum 
-  ​signal a,b,c : std_ulogic; ​ +cd src 
-     +ls -la 
-  name_p: process(b,​c) +emacs ledsw_rtl.vhd
-  begin +
-    if b = '​1'​ then +
-      a <= c; +
-    end if;  +
-  end process;+
 </​code>​ </​code>​
  
-Solche Latches sind in der Regel nicht gewolltDeshalb sind Default Zuweisungen am Anfang des Prozesses ein guter Weg um +{{ ::​dtpr-emacs.jpg | emacs mit ledsw_rtl.vhd}}
-solche Latches auszuschließen+
  
-== Die Case Anweisung ==+Im Emacs Editor werden nach dem Start zwei "​Buffer"​ angezeigt. Tippen Sie <​code>​ctrl-x 1</​code>​ um nur den Buffer mit der VHDL Datei anzuzeigen. ​
  
-<code vhdl> +{{::dtpr-emacs-onebuf.jpg| emacs nach dem Umschalten auf einen Buffer mit ctrl-x 1}} 
-  signal a,b std_ulogic;  + 
-  signal number_i ​std_ulogic_vector(3 downto 0); +Die VHDL Datei beschreibt ein Design mit 10 Eingängen "​SW"​ und 10 Ausgängen "​LEDR"​. In der Architektur werden die Eingänge "​SW"​ auf die Ausgänge "​LEDR"​ geschaltet. Damit sollen die roten LEDs abhängig von den Schaltern "​SW"​ ein- und ausgeschaltet werden. 
-   +==== Synthese mit Altera Quartus - Manuelles Aufsetzen des Projektes ===
-  ​trans_p:​ process(number_i) + 
-  ​begin +Im ersten Anlauf wird das Projekt manuell mit Hilfe des Assistenten aufgesetzt. Im Projekt gibt es ein Verzeichnis ​"pnr". Dieser Name steht für "Place And Route" ​und umfasst die Designdaten für die Synthese einer Schaltung für das FPGA. Wechseln Sie in das Verzeichnis "​ledsw-manual"​. 
-    a <'​0';​ + 
-    b <'​0';​ +<code
-    case number_i is  +cd 
-      when "​0000" ​=> a <'​1';​ +cd projects 
-                     b <'​0';​ +cd digitaltechnikpraktikum 
-      ​when ​"0001"|"1000" ​=b <= '​1';​ +cd pnr 
-      when others => b <= '​0';​  +cd ledsw-manual
-    end case; +
-  end process;+
 </​code>​ </​code>​
  
-Mit der Case Anweisung können abhängig vom Wert eines Signals unterschiedliche +In diesem Verzeichnis befindet sich eine Datei "​ledsw_pin_assignments.csv"Diese Datei enthält ​die Pinkonfiguration für die Schalter ​"SW" ​und die Leuchtdioden ​"LEDR" ​Sie können sich die Datei mit 
-Anweisungen ausgeführt werdenEs müssen alle möglichen Werte des Signals aufgeführt +
-werdenUm dies sicherzustellen,​ ist die "others" ​Variante vorgeschrieben. Mehrere +
-Alternativen können durch "|" ​zusammengefasst werden. ​+
  
-In diesem Beispiel wird b der Wert '​1'​ zugewiesen, wenn number_i "​0001"​ oder "​1000"​ ist+<​code>​ 
 +less ledsw_pin_assignments.csv 
 +</​code>​
  
-=== Die Typen signed und unsigned: Zahlendarstellungen ===+anschauen. Zum Verlassen von "​less"​ drücken Sie "​q"​. Starten Sie jetzt die Altera Quartus Software mit "​quartus"​
  
-In der "​bin2seg"​ Schaltung wird der Typ "​unsigned"​ verwendet. Der Typ "​unsigned"​ leitet sich von dem +<​code>​ 
-Typen "​std_logic_vector"​ ab, der im ersten Versuch eingeführt wurde. "​std_logic_vector"​ stellt einen Bus +quartus 
-dar und die einzelnen Leitungen des Busses können Werte annehmen, die in einer Schaltung vorkommen können. +</​code>​
-Das sind beispielsweise '​0',​ '​1'​ oder auch '​U'​ für undefined. ​+
  
-Auch "​signed"​ und "​unsigned"​ sind also Busse mit einzelnen Leitungen, die jeweils typische Schaltungszustände +Es erscheint folgendes Fenster
-annehmen können. ​Es wird jedoch der Typ "​signed"​ oder "​unsigned"​ verwendet, um zu kennzeichnen,​ dass dieser +
-Bus eine Zahl darstellt. Wenn ein Bus als "​signed"​ oder "​unsigned"​ definiert wird, dann kann man mathematische +
-Operatoren auf den Bus anwenden, die sich auf einen Bus vom Typ "​std_logic_vector"​ nicht anwenden lassen, da sie +
-keinen Sinn ergeben. Die "​signed"​ und "​unsigned"​ Typen sind im package [[http://​www.cs.umbc.edu/​portal/​help/​VHDL/​packages/​numeric_std.vhd|numeric_std]] definiert+
  
-== Operatoren und Zuweisungen für signed und unsigned ==+{{ ::​dtpr-quartus-start.jpg | Startbildschirm Quartus}}
  
-Für die Typen "signed" ​und "​unsigned"​ sind unter anderem folgende Operatoren und Zuweisungen definiert:+Drücken Sie "Create a new project"
  
-<code vhdl> +{{ ::dtpr-quartus-projectname.jpg | Quartus Projektname}}
-signal a,b,c unsigned(7 downto 0); -- Ebenso mit signed +
-signal vergleich ​Boolean; ​         ​-- Der Typ Boolean kann die Werte "​true"​ oder "​false"​ annehmen+
  
-c <= a + b;  +Wählen Sie als Projektnamen ​"ledsw" ​und als Namen für die Toplevelentity auch "ledsw". Achten Sie darauf, dass das working directory "​digitaltechnikpraktikum/​pnr/​ledsw-manual"​ ist. In diesem Verzeichnis werden die (u.a. temporäre) Projektdateien gespeichert. ​
-c <= a + 1; -- Addition mit einer Zahl +
-c <= a - b; +
-c <= a - 1;  +
-c <= "00000000"+
-c <= "10101010"+
  
-vergleich <= a > b;  ​-- Dem Signal "​vergleich"​ wird das Ergebnis des Vergleichs zugewiesen +{{ ::dtpr-quartus-add-file-1.jpg | Quartus VHDL Datei auswählen}}
-vergleich <= a < b; +
-vergleich <= a <= b;  +
-vergleich <= a >= b;  +
-vergleich <= a = b;  +
-vergleich <= a > 5;  ​+
  
 +Im nächsten Schritt müssen dem Projekt die VHDL Dateien hinzugefügt werden. In diesem Projekt gibt es nur die eine Datei "​ledsw_rtl.vhd"​. Wählen Sie die Datei aus und klicken Sie auf "​ADD"​. ​
 +
 +{{ ::​dtpr-quartus-add-file-2.jpg | Quartus VHDL Datei hinzufügen}}
 +
 +Danach muss der FPGA Typ auswählt werden, der sich auf der Platine befindet. Wählen Sie als Familie "​Cyclone II" und als Baustein "​EP2C20F484C7"​. ​
 +
 +{{ ::​dtpr-quartus-select-fpga.jpg | Quartus Select FPGA Device}}
 +
 +Danach können Sie beim Assistenten immer auf "​Weiter"​ klicken und dann den Assistenten beenden. Das Projekt sollte dann so aussehen: ​
 +
 +{{ ::​dtpr-quartus-edit-view.jpg | Quartus Projekt eingerichtet ohne Pins}}
 +
 +Starten Sie jetzt die Übersetzung der VHDL Datei mit "​Processing -> Start Compilation"​. ​
 +
 +{{ ::​dtpr-quartus-start-compilation.jpg | Quartus Start Compilation}}
 +
 +Die Synthese sollte durchlaufen. Allerdings treten zwei wichtige Warnmeldungen auf. 
 +
 +{{ ::​dtpr-quartus-warnings.jpg | Quartus Warnungen bei Synthese}}
 +
 +Die eine Meldung sagt aus, dass für Ein- und Ausgänge keine Pins auf dem FPGA festgelegt sind. Die andere Meldung besagt, dass alle ungenutzten Pins vom FPGA als "​Output driving Ground"​ geschaltet sind. Das ist nicht gut, wenn an diesem Pin z.B. ein Schalter angeschlossen ist, der auf VDD geschaltet ist. Dann gibt es einen Kurzschluss. ​
 +
 +Man kann die nicht angeschlossenen Pins auch im "Pin Planner"​ anschauen.
 +
 +{{ ::​dtpr-quartus-start-pinplanner.jpg | Quartus Pin Planner starten}}
 +
 +Dort sieht man, dass für die Anschlüsse "​LEDR"​ und "​SW"​ noch keine Pinfestlegung erfolgt ist. Das "​Location"​ Feld ist noch leer.
 + 
 +{{ ::​dtpr-quartus-pinplanner-nolocation.jpg | Quartus Pin Planner ohne Zuordnung der Pins}}
 +
 +Um die Pins festzulegen wird jetzt mit "​Assignments -> Import Assignments"​ die Datei "​ledsw_pin_assignments.csv"​ eingelesen. ​
 +
 +{{ ::​dtpr-quartus-import-assignments.jpg | Quartus Import Assignments}}
 +{{ ::​dtpr-quartus-select-assignmens.jpg | Quartus Pin Assignment Datei}}
 +
 +Wenn man dann den "Pin Planner"​ nochmal öffnet, sieht man die Zuordnung der Ein- und Ausgänge zu den Pins auf dem FPGA.
 +
 +{{ ::​dtpr-quartus-pinplanner-withpins.jpg | Quartus Pin Planner o.k.}}
 +
 +Jetzt muss noch festgelegt werden, dass unbenutzte Pins als Eingänge geschaltet werden. Wählen Sie dazu "​Assignments -> Device"​. ​
 +
 +{{ ::​dtpr-quartus-device-options-1.jpg | Quartus Device Options}}
 +
 +und dann "​Device and Pin Options"​
 +
 +{{ ::​dtpr-quartus-device-options-2.jpg | Quartus Device and Pin Options}}
 +
 +Wählen Sie dann bei "​Unused Pins" die Option "As input tri-stated"​. ​
 +
 +{{ ::​dtpr-quartus-unused-pins.jpg | Quartus Unused pin options}}
 +
 +** Sie müssen dann die Synthese nochmal neu starten mit "​Processing -> Start Compilation"​.** Nach erfolgreicher Synthese können Sie den "​Programmer"​ starten mit "Tools -> Programmer"​.
 +
 +{{ ::​dtpr-quartus-programmer-start.jpg | Quartus Programmer starten}}
 +
 +Im Programmer muss man dann die Programmierschnittstelle zur Programmierung des FPGA auswählen. Das funktioniert nur, wenn auch tatsächlich ein FPGA Board über USB am Rechner angeschlossen ist. Falls Sie mit einer virtuellen Maschine arbeiten, muss der USB Port der virtuellen Maschine zugeordnet werden. ​
 +
 +{{ ::​dtpr-quartus-hardware-setup.jpg | Quartus Programmer}}
 +
 +Wenn das FPGA Board angeschlossen und die virtuelle Maschine richtig konfiguriert ist, dann kann man **USB-Blaster [2-2.2]** auswählen.
 +
 +{{::​dtpr-quartus-hardware-select.jpg| Quartus USB Blaster}}
 +
 +Nach dem Kompilieren steht die FPGA Konfigurationsdatei "​ledsw.sof"​ zur Verfügung. Diese Datei muss man mit "Add File" auswählen. Danach kann man den Download der Konfigurationsdatei mit "​Start"​ beginnen.
 +
 +{{::​dtpr-quartus-programmer-file.jpg| Quartus Programmer mit USB Blaster}}
 +
 +Wenn der Download erfolgreich war, dann sieht man das am grünen "​Progress"​ Balken.
 +
 +{{::​dtpr-quartus-programmer-success.jpg| Quartus Programmer nach erfolgreichem Download}}
 +
 +Danach kann man auf dem FPGA die roten LED's über die Schalter darunter ein- und ausschalten.
 +
 +==== Synthese mit Altera Quartus - Projekt aufsetzen mit Skript ====
 +
 +Alternativ zum Aufsetzen mit der interaktiven GUI kann man das Projekt auch mit einem Skript konfigurieren. Der Vorteil dieses Verfahrens ist, dass immer klar ist wie das Projekt konfiguriert wurde. Man kann zu jedem Zeitpunkt auf Basis der VHDL Dateien und der Skripte das Projekt neu aufsetzen. Jede einigermaßen professionelle Entwicklung nutzt deshalb Skripte als Basis. Eine häufig verwendete Skriptsprache für CAE Software ist tcl. Auch Altera verwendet tcl um die Verwendung der GUI zu vermeiden. Wechseln Sie in das Verzeichnis ledsw-scripted. ​
 +
 +<​code>​
 +cd
 +cd projects
 +cd digitaltechnikpraktikum
 +cd pnr
 +cd ledsw-scripted
 </​code>​ </​code>​
-Diese Operatoren können auch mit Zahlen (integer) als Operanden durchgeführt werden. Einem "​signed"​ oder 
-"​unsigned"​ Bus kann jedoch keine Zahl direkt zugewiesen werden.  ​ 
  
-In der Schaltung "​bin2seg"​ ist der Eingang "​number_i"​ vom Typen "​unsigned"​In der Testbench ist das +In diesem Verzeichnis befinden sich zwei tcl Skripten.  
-Signal "​number"​ vom Typ "​unsigned"​. In der Testbench wird auch die Addition verwendet.  ​+ 
 +=== Erzeugen und Konfigurieren des Projektes ===
  
-== Typumwandlungen signed, unsigned ​ == +Das Skript [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​pnr/​ledsw-scripted/​create_quartus_project_settings.tcl|create_quartus_project_settings.tcl]] sorgt für die folgenden Schritte beim Aufsetzen des Quartusprojektes. ​
  
-"​signed"​ und "​unsigned"​ sind direkt vom Typen "​std_logic_vector"​ abgeleitet. Man kann deshalb durch 
-einfache casts diese Typen ineinander umwandeln. Das geht so:  
  
-<code vhdl> +  * Konfigurieren des Projektnamens 
-signal a : signed (7 downto 0);  +  * Festlegen des FPGA Typen 
-signal b : unsigned (7 downto 0); +  * Hinzufügen der VHDL Dateien 
-signal c : std_ulogic_vector(7 downto 0);+  * Konfigurieren der Pins
  
-a <= signed(b);  +Das Skript wird ausgeführt mit: 
-a <= signed(c);​ +
-b <= unsigned(a);​ +
-b <= unsigned(c);​ +
-c <= std_ulogic_vector(a);​ +
-c <= std_ulogic_vector(b); ​+
  
 +<​code>​
 +quartus_sh -t create_quartus_project_settings.tcl
 </​code>​ </​code>​
  
-Bei diesen Umwandlungen wird nur der Typ umdefiniert. Es ändert ​sich nichts am Zustand der Leitungen, d.h. hier wird +Nachdem das Skript gelaufen ist, befindet ​sich in dem Verzeichnis die Quartus Projektdatei "ledsw.qpf"Sie können das Projekt mit der Quartus GUI anschauen mit: 
-keine Schaltung o.ä. generiert+
  
-=== Aufgaben Teil 1 ===+<​code>​ 
 +quartus ledsw.qpf 
 +</​code>​
  
-  - Laden Sie die drei VHDL Dateien aus [[Binär zu 7-Segment Kodierer Code]] in ein Verzeichnis "​v2"​.  +=== Starten der Synthese ​===
-  - Starten Sie Modelsim und erstellen Sie ein neues Projekt +
-  - Simulieren Sie die Schaltung und vollziehen Sie die Funktion nach.  +
-  - Ergänzen Sie die Schaltung in der Datei "​bin2seg.vhd"​ um eine vollständige Kodierung zu erstellen. +
-  - Simulieren Sie die Schaltung erneut und prüfen Sie die Funktion +
-  - Starten Sie Quartus und erstellen Sie ein Projekt +
-  - Synthetisieren Sie die Schaltung  +
-   +
-=== Die Additionsschaltung ​=== +
  
-Wenn die 7-Segment Anzeige läuft, dann kann die Schaltung um eine Additionsschaltung erweitert werdenDas Ziel der  +Das Skript [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​pnr/​ledsw-scripted/​quartus_project_flow.tcl|quartus_project_flow.tcl]] sorgt für die Schritte
-Schaltung ist es, an den Schaltern zwei 4-Bit unsigned Zahlen einzugeben und die Summe der beiden Zahlen zu berechnen +
-Die Summanden und die Summe soll auf der 7-Segment Anzeige ausgegeben werden. ​+
  
-[[Code für die Additionsschaltung]]+  * Analyse und Elaborieren des VHDL Codes 
 +  * Starten der Synthese und Fitting auf das FPGA 
 +  * Erzeugen des Synthesereports "​flowsummary.log"​
  
-In dieser Schaltung werden zwei vorzeichenlose Zahlen addiert und das Ergebnis ausgegeben. ​+Starten Sie das Skript mit 
  
-=== Aufgaben Teil 2 ===+<​code>​ 
 +quartus_sh -t quartus_project_flow.tcl 
 +</​code>​
  
-  - Kopieren Sie den bisherigen Stand des Projektes in ein eigenes ​Verzeichnis ​"​p1"​ +Nach diesem Schritt befindet sich im Verzeichnis die Datei "flowsummary.log" ​mit dem Synthesebericht und die Datei "ledsw.sof". Die sof Datei ist die Konfigurationsdatei für das FPGA, die jetzt mit dem Programmer ​auf das Board geladen werden kann
-  - Laden Sie den Code für die Additionsschaltung zusätzlich in ihr Verzeichnis +
-  - Starten Sie Modelsim und fügen Sie die Datei "adder.vhd" dem Projekt hinzu +
-  - Erweitern Sie die Schaltung ​"top" ​und instantiieren Sie den Addierer in der Schaltung "​top"​ +
-  - Schließen Sie den Eingang a an die Schalter 3-0 und den Eingang b an die Schalter 8-5 an.  +
-  - Instantiieren Sie zwei zusätzliche bin2seg Konverter +
-  - Geben Sie den Summanden a auf dem Ausgang HEX0 aus. +
-  - Geben Sie den Summanden b auf dem Ausgang HEX1 aus. +
-  - Geben Sie die Summe auf dem Ausgang HEX2 aus.   +
-  - Simulieren Sie die Schaltung und prüfen Sie die Funktion +
-  - Synthetisieren Sie die Schaltung mit Quartus+
  
-=== Die Abstimmungsschaltung ​=== +=== Download der FPGA Konfigurationsdatei mit dem Programmer ​===
  
-Diese Schaltung soll eine LED einschalten,​ wenn mehr als die Hälfte der Schalter SW +Danach können Sie das Board programmieren mit
-eingeschaltet sind. Insgesamt gibt es zehn Schalter. Grundsätzlich lässt sich diese +
-Aufgabe analog wie die Kodierschaltung für die 7-Segment Anzeige lösen: ​+
  
-<​code ​vhdl+<​code>​ 
-signal schalter : std_ulogic_vector(9 downto 0);  +quartus_pgm -c USB-Blaster --mode jtag --operation="​p;ledsw.sof"​ 
-signal led : std_ulogic; ​+</​code>​
  
-process(schalter) +Jetzt können mit den Schaltern "​SW"​ die roten Leuchtdioden auf dem Board an- und ausgeschaltet werden. Die Variante mit dem Skript kommt ohne GUI aus. Allerdings ist es nicht notwendig jedesmal wenn sich beispielsweise der Code in der VHDL Datei geändert hat auch das Projekt komplett neu aufzusetzen. Das gezielte Ausführen der jeweils notwendigen Skripten wird mit dem im folgenden beschriebenen Make basierten Verfahren gewährleistet. 
-begin +  
-  case schalter is +==== Synthese mit Altera Quartus - Make basiert ==== 
-    when "​1111110000"​| + 
-         ​"1111101000"+Nach der skriptbasierten Synthese der Schaltung wird jetzt die endgültige Variante basierend auf dem Tool "make" ​eingeführt. Alle folgenden Projekte werden mit make aufgesetzt. Das Verfahren mit make ist ähnlich dem Verfahren mit den Skripten - auch bei Make werden solche Skripte aufgerufen. Bei dem Skriptverfahren gibt es zwei Skripte. Ein Skript erstellt das Projekt und ein Skript startet die Synthese. Für das Tool make gibt man in einer Datei "makefile" ​an welche Dateien von einem Skript erzeugt werden und welche Dateien für den Schritt gebraucht werden (die Abhängigkeiten). Make überwacht dann diese Abhängigkeiten und wenn sich irgendeine Datei ändert (z.B. eine VHDL Datei), dann ruft make alle notwendigen Schritte auf um das Projekt zu aktualisieren. ​ 
-         "1111100100"| + 
-         -- many more here +Die makefiles im Digitaltechnikpraktikum sind aufgeteilt. Es gibt jeweils ein makefile pro Projekt und ein makefile für alle Projekte, da die meisten Schritte in jedem Projekt gleich sind und sich nur die VHDL Dateien und die Pins vom FPGA ändern. 
-         ​"0000111111" ​=> led <= '​1';​ + 
-    when others => led <= '​0';​ +Wechseln Sie in das Verzeichnis ​"digitaltechnikpraktikum/​pnr/​ledsw-make".  
-  end case;  + 
-end process; ​+<code> 
 +cd 
 +cd projects 
 +cd digitaltechnikpraktikum 
 +cd pnr 
 +cd ledsw-make
 </​code>​ </​code>​
  
-Das Problem sind die zehn Schalter...+In diesem Verzeichnis [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​tree/​master/​pnr/​ledsw-make|ledsw-make]] befinden sich zwei Dateien. Die Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​pnr/​ledsw-make/​makefile|makefile]] ​ enthält ​die Informationen für das Tool "​make"​. Die Liste der VHDL Dateien für die Synthese wird aus der Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​sim/​ledsw/​makefile.sources|../​../​sim/​ledsw/​makefile.sources]] aus dem Simulationsverzeichnis geladen. Danach wird das allgemeine makefile für alle Syntheseprojekte [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​pnr/​makefile|pnr/​makefile]] mit "​include ​../​makefile"​ geladen
  
-Deshalb sollen zunächst die eingeschalteten Schalter für fünf Schalter gezählt werden +In diesem [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​pnr/​makefile|pnr/​makefile]] sind verschiedene ​"Targets" ​angegeben. Targets können Dateien oder Namen seinEin Target ​ist beispielsweise ​die Datei "​flowsummary.log"​. In Zeile 40 steht, dass das Target "​flowsummary.log"​ abhängt von der Quartusprojektdatei ledsw.qpf und dem Skript ../​../​scripts/​quartus_project_flow.tcl. Die Datei ledsw.qpf ist wieder ein eigenes Target. In Zeile 28 steht das "ledsw.qpf" ​von den VHDL Dateienvon dem Skript [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​scripts/​create_quartus_project_settings.tcl|create_quartus_project_settings.tcl]] und der Pinkonfigurationsdatei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​-/​blob/​master/​pnr/​ledsw-make/​ledsw_pins.tcl|ledsw_pins.tcl]] abhängt. In den folgenden Zeilen 29 bis 35 steht, wie die Projektdatei ledsw.qpf erzeugt wird. Daneben gibt es noch "PHONY Targets" ​wie z.B. qproject. Dieses Target hängt von ledsw.qpf ab
-Dazu wird eine Schaltung ​"cntsw" ​verwendet, die fünf Schalter als Eingang hat und +
-einen Ausgang cnt_o mit 3-BitAm Ausgang ​ist die Anzahl ​der eingeschalteten Schalter +
-abzulesenWenn also am Eingang beispielsweise ​"01011" ​anliegtdann kommt am Ausgang ​der Wert +
-"011" ​(=3) heraus +
  
-[[Code für die Abstimmungsschaltung]]+Um ein Target zu erzeugen muss man make aufrufen. Wenn man kein Target angibt, wird das erste Target genommen, dass gefunden wird. Das ist hier "​help"​ und zeigt die möglichen Targets an. 
  
-Dann wird diese Schaltung zweimal instantiiert und jeweils für die Schalter +<​code>​ 
-SW(4..0) und SW(9..5) eingesetzt. Das Zählergebnis für die Schaltergruppen +make 
-wird dann addiert. Anhand der Summe der eingeschalteten Schalter, soll dann +</​code>​
-die LEDR(0) eingeschaltet b.z.w. ausgeschaltet werden. ​+
  
-== Tip: ==+Um das Quartusprojekt zu erzeugen, muss man make mit dem Target "​qproject"​ aufrufen. ​
  
-Für das Einschalten der LED können Sie ein if...then...else Konstrukt verwenden:+<​code>​ 
 +make qproject 
 +</​code>​
  
-<code vhdl> +Man sieht wie jetzt quartus mit dem Skript zum Erzeugen eines Projektes gestartet wird. Der Sinn von make wird deutlich, wenn man danach "make qproject"​ ein zweites Mal aufruft. ​
-signal zahl : unsigned(9 downto 0); +
-signal led  : std_ulogic; ​+
  
-process(zahl) +<code
-begin +caeuser@vcae:​~/​projects/​digitaltechnikpraktikum/​pnr/​ledsw-make$ make qproject 
-  if zahl 354 then +make: Nothing to be done for `qproject'.
-    led <= '​1';​ +
-  ​else +
-    led <= '0'; +
-  end if; +
-end process; ​+
 </​code>​ </​code>​
  
-=== Aufgaben Teil 3 ===+Das Programm make hat erkannt, dass das Projekt schon erzeugt ist und neuer ist als alle abhängigen Dateien. Deshalb muss quartus nicht noch einmal gestartet werden, denn das Projekt ist aktuell. Wenn Sie jetzt beispielsweise die Datei "​ledsw_pins.tcl"​ ändern und nochmal "make qproject"​ starten, dann wird Quartus wieder gestartet um das Projekt neu zu bauen. Sie können das ausprobieren wenn Sie mit dem Programm "​touch"​ die Datei "​leds_pins.tcl"​ mit einem neuen Änderungszeitstempel versehen, so als ob Sie die Datei geändert hätten. ​
  
-  - Kopieren Sie den bisherigen Stand des Projektes in ein Verzeichnis p2 +<​code>​ 
-  - Laden Sie die zusätzlichen VHDL Dateien aus dem [[Code für die Abstimmungsschaltung]] in Ihr Verzeichnis +touch ledsw_pins.tcl 
-  - Vervollständigen Sie die Schaltung "​cntsw"​ und prüfen Sie die Funktion im Simulator+make qproject 
-  - Bauen Sie eine Schaltung "​decide",​ die die Summe der beiden Schalterzähler berechnet und auf Basis dieser Summe die LED einschaltet. +</​code>​
-  - Geben Sie die Ausgaben der "​cntsw"​ Schaltungen auf HEX0 und HEX1 aus und die Gesamtsumme auf HEX2.  ​ +
-  - Synthetisieren Sie die Schaltung für das FPGA+
  
-=== Aufgaben Teil 4 ===+Mit "make clean" können alle erzeugten Dateien gelöscht werden. Mit "make prog" wird die Belegungsdatei ledsw.sof auf das FPGA geladen. make sorgt dafür, dass alle notwendigen Schritte (Projekt konfigurieren / Synthese starten) vorher ausgeführt werden. Mit
  
-  - Ermitteln Sie die Anzahl der genutzten Logic Elements (LE) auf dem FPGA für die Schaltung +<​code>​ 
-  - Ermitteln Sie die Anzahl der LE für die einzelnen Module +make quartus 
-  - Laden Sie die zusätzlichen Dateien {{:​v2-vhdl.zip|}} in ihr Verzeichnis  +</​code>​
-  - Verändern Sie den Toplevel derart, dass die Schaltung "​decide_logic"​ verwendet wird. +
-  - Ermitteln Sie die Anzahl der LE für diese Variante. Vergleichen Sie mit der ersten Lösung.  +
-  - Verändern Sie den Toplevel derart, dass jetzt die Schalter SW und die blauen KEY zusammen (das sind 14 Schalter) ausgewertet werden sollen. Nutzen Sie dafür die Schaltung "​decide_big"​. +
-  - Ermitteln Sie die Zeit, die für die Synthese benötigt wird und den Anzahl der benötigten LE. +
-  - Nutzen Sie jetzt die alternative Variante "​decide_smart"​ für die Auswertung der 14 Schalter.  +
-  - Vergleichen Sie die Anzahl der benötigten LE für diese Lösung+
  
 +wird das Projekt erzeugt und Quartus mit der graphischen Benutzeroberfläche gestartet. ​
  
  
  
 + 
  
  
Line 286: Line 307:
  
  
 + 
  
  
  • dtpr_versuch_2.1290495823.txt.gz
  • Last modified: 2010/11/23 08:03
  • by beckmanf