[[dtpr_versuch_3]]

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_3 [2010/11/29 22:22]
beckmanf Bild eingefügt - Zähler mit Vorteiler
dtpr_versuch_3 [2020/09/28 15:32] (current)
beckmanf Modelsim Images / new gitlab
Line 1: Line 1:
-==== Versuch 3 ====+===== Digitaltechnik Praktikum - Tutorial Simulation mit Modelsim =====
  
-Dieser Versuch führt sequentielle Schaltungen,​ d.h. Schaltungen mit Flipflops ein+In diesem Tutorial lernen Sie den Schaltungssimulator Modelsim kennenAls Beispiel wird die ledsw Schaltung aus [[dtpr_versuch_2|Digitaltechnik Praktikum - Einführung Quartus]] verwendet
  
-=== Zähler ​===+==== Simulation mit Modelsim - Manuelles Aufsetzen des Projektes ====
  
-Die erste sequentielle Schaltung ist ein Modulo 256 Zähler, d.h. ein Zähler, der von +Ähnlich wie bei der Software Quartus gibt es auch bei dem Simulator einen Assistenten um ein Projekt aufzusetzenWechseln Sie dazu in das Verzeichnis "​digitaltechnikpraktikum/​sim/​ledsw"​
-0 bis 255 zählt und dann wieder von vorn mit 0 beginnt. Der Zählerstand soll als hexadezimale +
-Ausgabe auf der 7-Segment Anzeige ausgegeben werden. Gleichzeitig soll der Zählerstand binär auf +
-die roten LEDs ausgegeben werden+
  
-Im ersten Schritt wird der Zähler mit der Taste KEY0 getaktet und kann mit KEY1 zurückgesetzt werden. +<​code>​ 
-Der Code für den Zähler ist hier:  ​+cd 
 +cd digitaltechnikpraktikum 
 +cd sim 
 +cd ledsw 
 +</​code>​
  
-[[dtpr_v3_code_zaehler|Code für den Zähler]]+In diesem Verzeichnis befinden sich schon zwei Dateien, die allerdings erst später bei der make basierten Umgebung verwendet werden. Für die Simulation der Schaltung werden zwei VHDL benötigt:
  
-=== Aufgaben Teil 1 ===+  * [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​ledsw_rtl.vhd|ledsw_rtl.vhd]] 
 +  * [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​t_ledsw.vhd|t_ledsw.vhd]]
  
-  - Erstellen Sie ein Verzeichnis p1 +die sich beide im [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​tree/​master/​src|src Verzeichnis]] ​des Projektes befindenStarten ​Sie jetzt die Modelsim Simulationssoftware im Verzeichnis "​sim/​ledsw"​
-  - Laden Sie den Code in dieses Verzeichnis.  +
-  - Übernehmen Sie bin2seg.vhd aus dem letzten Versuch. Ergänzen Sie die Ziffern a-f +
-  - Simulieren Sie den Code mit Modelsim und erläutern Sie die Funktion +
-  ​Ändern Sie den Code in counter.vhd um die Funktion ​des Zählers zu erhalten +
-  - Simulieren ​Sie die neue Schaltung und überprüfen Sie die Funktion. +
-  - Synthetisieren Sie die Schaltung mit Quartus und laden Sie die Schaltung auf das FPGA.  +
-  - Demonstrieren Sie die Funktion +
-  - Modifizieren Sie die Schaltung und takten Sie die Schaltung mit SW0. +
-  - Überprüfen Sie die Funktion auf dem Board+
  
-=== Zähler mit Enable Signal ===+<​code>​ 
 +vsim  
 +</​code>​
  
-Bislang wird der Zähler direkt mit dem Taster KEY0 getaktetDie Schaltung soll jetzt so umgebaut werden, dass +{{ ::​modelsim01.jpg | Modelsim Start}} ​ 
-als Systemtakt für alle Flipflops ​ein 50 MHz Takt von einem Taktgenerator vom Board verwendet werden soll+Drücken Sie "​Jumpstart"​ 
-Weiterhin soll die Schaltungaber jeweils um eins hochzählen,​ wenn der Taster KEY0 gedrückt wird+{{ ::​modelsim02.jpg | Modelsim Create Project}}  
 +und dann "​Create Project"​.  
 +{{ ::​modelsim03.jpg | Modelsim Project Name}}  
 +Geben Sie als Projektnamen "​ledsw" ​ein.  
 +{{ ::​modelsim04.jpg | Modelsim Add Existing Files}}  
 +Fügen Sie die beiden VHDL Dateien zum Projekt hinzu.  
 +{{ ::​modelsim05.jpg | Modelsim Add File Dialog}}  
 +Geben Sie dazu die Dateien mit den relativen Pfaden anAlso
  
-== Die Flankenerkennung ==+  * ../​../​src/​ledsw_rtl.vhd und 
 +  * ../​../​src/​t_ledsw.vhd
  
-Das Problem ist, dass auch ein sehr kurzes Drücken des Tasters KEY0 um Größenordnungen langsamer als die Taktperiode +{{ ::​modelsim06.jpg | Modelsim Project View}}  
-des 50 MHz Taktes istZur Lösung des Problems ​müssen ​Sie eine Schaltung entwerfen, die nur für die Dauer eines Taktsignals ein Signal +Danach erscheinen ​die beiden VHDL Dateien im Projektfenster. ​ 
-erzeugt, wenn sich der Zustand des Signals KEY0 von 0 nach 1 ändert+{{ ::​modelsim07.jpg | Modelsim Compile All}}  
 +Die VHDL Dateien ​müssen für die Simulation zunächst übersetzt werden. Starten Sie Übersetzung mit "​Compile -> Compile All"​. ​ 
 +{{ ::​modelsim08.jpg | Modelsim Library Switch}}  
 +Wechseln Sie dann in Ansicht ​der Library. Dort wird das Ergebnis der Übersetzung der VHDL Quelldateien dargestellt.  
 +{{ ::​modelsim09.jpg | Modelsim Library View}} ​
  
-Die Schaltungsidee ​ist die folgende+Zum Start der Simulation müssen Sie auf t_ledsw / tbench Architecture Doppelklicken. Dann wird der Simulator gestartet und die Daten aus der Library werden geladen. ​Die Simulation ​ist noch nicht gestartet.  
-  - Speichern Sie den Zustand des Signals KEY0 in einem Flipflop, das mit dem Systemtakt von 50 MHz getaktet ​ist.  +{{ ::​modelsim10.jpg | Modelsim Simulation View}} 
-  Am Ausgang dieses Flipflops ist das Signal KEY0 um eine Taktperiode gegenüber dem Eingang des Flipflops verzögert.  +Links in der Simulatoransicht können Sie die Designhierarchie anschauen. Bei diesem einfachen Design ist der toplevel die Testbench "​t_ledsw"​in der das Design "​ledsw_i0"​ instantiiert ​ist. Um nach der Simulation auch den Signalverlauf von Signalen im Design beobachten zu können, müssen Sie die Signale zum Aufzeichnen auswählen.  
-  ​- ​Wenn zwischen dem Ausgang des Flipflops und dem Signal KEY0 ein Unterschied besteht, dann hat sich das Signal KEY0 offensichtlich verändert.  +{{ ::​modelsim11.jpg | Modelsim Add Waves}} 
-  Werten ​Sie diesen Unterschied aus und erzeugen ​Sie ein Signal von der Dauer eines Taktes+Wählen Sie dazu in der Simulatoransicht mit der rechten Maustaste das Kontextmenü bei "​t_ledsw"​ und wählen Sie "Add to -> Wave -> All items in region"​. Damit werden alle Signale in der Testbench "​t_ledsw",​ also die beiden Signale "​switches"​ und "​redleds"​ in das Waveform Fenster übernommen.  
 +{{ ::​modelsim12.jpg | Modelsim Waveform View}} 
 +Wenn Sie das Waveform Fenster anklicken sehen Sie die beiden Signale.  
 +{{ ::​modelsim13.jpg | Modelsim Run -all}} 
 +Jetzt starten ​Sie die Simulation mit "​Simulate -> Run -> Run -all".  
 +{{ ::​modelsim14.jpg | Modelsim Waveform Window maximize}} 
 +Um das Simulationsergebnis im Waveform Fenster anzuschauen,​ können ​Sie das Fenster durch drücken auf den "​+"​ Knopf größer machen.  
 +{{ ::​modelsim15.jpg | Modelsim View Full}} 
 +Um den gesamten Verlauf der Signale zu sehen drücken Sie auf den Knopf mit der Lupe (siehe Pfeil), oder wählen das Menü "Wave -> Zoom -> Zoom Full". Sie können im Waveformfenster auch einfach die Taste "​F"​ auf der Tastatur drücken
  
-== Das Enablesignal ==+Jetzt haben Sie das Simulationsergebnis angeschaut. Im folgenden wird erläutert wie Sie vorgehen müssen um den Inhalt von VHDL Dateien zu ändern und die Simulation neu zu starten. Dazu wird hier als Beispiel ein neuer Simulationsvektor "​1010111111"​ ergänzt. Dazu muss die Datei "​t_ledsw.vhd"​ geändert werden.  
 +{{ ::​modelsim16.jpg | Modelsim back to Project View}} 
 +Gehen Sie dazu zurück in die Projektansicht und doppelklicken Sie auf "​t_ledsw.vhd"​.  
 +{{ ::​modelsim17.jpg | Modelsim Edit t_ledsw.vhd}}  
 +Jetzt ist das Editorfenster innerhalb von Modelsim geöffnet und Sie können den Inhalt der Datei ändern.  
 +{{ ::​modelsim18.jpg | Modelsim Compile All again}} 
 +Nach der Änderung müssen Sie das Projekt neu kompilieren mit "​Compile -> Compile all".  
 +{{ ::​modelsim19.jpg | Modelsim Reload Simulation}} 
 +Danach müssen die Simulationsdaten neu geladen werden. Drücken Sie dazu auf den mit dem Pfeil markierten Knopf "​Restart"​. Alternativ können Sie auch über das Menü "​Simulate -> Restart"​ gehen.  
 +{{ ::​modelsim20.jpg | Modelsim Reload Simulation Window}} 
 +Es erscheint ein Dialogfenster zum Simulationsneustart. Drücken Sie auf "​Ok"​.  
 +{{ ::​modelsim21.jpg | Modelsim Run -all via Button}} 
 +Jetzt ist die Simulation neu geladen und zurückgesetzt. Starten Sie die Simulation über den mit dem Pfeil markierten Knopf oder das Menü "​Simulate -> Run -> Run -all".  
 +{{ ::​modelsim22.jpg | Modelsim Waveform with new Vector}} 
 +Wenn sie danach das Waveformfenster anschauen sehen Sie den zusätzlichen Simulationsvektor.
  
-Jetzt haben Sie ein Signal, dass einen Takt lang aktiv ist, wenn sich das Signal KEY0 von 0 auf 1 ändert. Nun muss der Zähler noch so verändert werden, dass er nur dann zählt, wenn ein "​enable"​ signal aktiv ist. +==== Simulation mit Modelsim - Aufsetzen des Projektes mit Make ====
  
-Der noch nicht ganz fertige Code für die Schaltung ist hier: +Wie bei der Synthese ​mit Quartus kann auch die Simulation ​mit make gestartet ​werden. ​
- +
-[[dtpr_v3_code_zaehler_mit_enable|Code für den Zähler mit Enable und die Flankenerkennung]] +
- +
-=== Aufgaben Teil 2 === +
- +
-  - Erstellen Sie ein neues Verzeichnis p2 und laden Sie die Dateien in dieses Verzeichnis +
-  - Übernehmen Sie counter.vhd und bin2seg.vhd aus dem Verzeichnis p1.  +
-  - Fügen Sie ein neues Signal "​enable_i"​ in die Entity von counter ein.  +
-  - Ergänzen Sie die Funktionalität von counter so, dass er nur noch zählt, wenn dieses "​enable_i"​ Signal "​1"​ ist.  +
-  - Ergänzen Sie das neue Modul edge so, dass die steigende Flanke von key_i erkannt werden.  +
-  - Verbinden Sie auf dem Toplevel das Module edge und den counter.  +
-  - Simulieren Sie die Schaltung +
-  - Laden Sie die Schaltung auf das FPGA +
- +
-=== Zähler mit Vorteiler === +
- +
-Bislang wird der Zähler von dem Schalter KEY0 kontrolliert. Jetzt soll der Zähler autonom im Sekundentakt +
-hochzählen. Dazu soll allerdings weiter der 50MHz Systemtakt vom Board verwendet werden. Deshalb soll jetzt +
-das Enablesignal aus einem neuen Zähler "​counter_long"​ generiert werden, der im Systemtakt ​mit 50 MHz hochzählt  +
-und nach 50 Mio. Takten jeweils ein Enablesignal für einen Takt lang auf "​1"​ setzt. Mit diesem Enablesignal wird +
-dann der bekannte Zähler gesteuert.  +
- +
-{{:​v3-counter.jpg}} +
- +
-Der Code für den Vorteiler ist hier:  +
- +
-[[dtpr_v3_code_vorteiler|Code für den Vorteiler]] +
- +
-=== Aufgaben Teil 3 === +
- +
-  - Legen Sie ein neues Verzeichnis p3 an und kopieren Sie die bisherigen VHDL Dateien in dieses Verzeichnis +
-  - Laden Sie die neue Datei "​counter_long.vhd"​ zusätzlich in dieses Verzeichnis.  +
-  - Modifizieren Sie counter_long.vhd so, dass der Zähler in jeder Sekunde ein enable Signal erzeugt.  +
-  - Integrieren Sie counter_long in den Toplevel. +
-  - Simulieren Sie die Schaltung +
-  - Laden Sie die Schaltung auf das FPGA +
- +
-=== Zähler ​mit Load === +
- +
-Der Zähler soll jetzt so erweitert ​werden, dass mit KEY0 ein Wert in den Zähler geladen wird, der an den +
-Schalter SW(7..0) eingestellt wird. Der Zähler soll also wie bisher im Sekundentakt zählen, aber wenn KEY0 gedrückt wird, dann +
-lädt der Zähler den Wert von SW(7..0) und zählt dann ab diesem Wert weiter.  +
- +
-=== Aufgaben Teil 4 === +
- +
-  - Legen Sie ein neues Verzeichnis p4 an und kopieren Sie die bisherigen VHDL Dateien dorthin.  +
-  - Verändern Sie counter.vhd so, dass die zusätzlichen Signale "​load_i"​ und "​load_data_i"​ in der Entity erscheinen. An load_data_i sollen die zu ladenden Daten für den Zähler anliegen.  +
-  - Integrieren Sie den neuen counter im Toplevel.  +
-  - Testen Sie die Schaltung auf dem FPGA+
  
 +<​code>​
 +cd
 +cd digitaltechnikpraktikum
 +cd sim
 +cd ledsw
 +</​code>​
  
 +Wenn Sie im Simulationsverzeichnis einfach "​make"​ eintippen, dann werden die möglichen make targets gezeigt.
  
 +<​code>​
 +fritz@ubuntu:​~/​projects/​digitaltechnikpraktikum/​sim/​ledsw$ make
 +"​make"​ does intentionally nothing. Type:
 +  "make mproject"​ to create a new modelsim project only
 +  "make compile"​ to compile all VHDL sources in batch mode
 +  "make modelsim"​ to start modelsim with graphical user interface
 +  "make sim" to start modelsim gui with the top testbench of the project
 +  "make clean" to remove all generated files
 +</​code>​
  
 +Sie können das Projekt mit den zugehörigen Dateien aufsetzen und die graphische Benutzeroberfläche mit 
  
 +<​code>​
 +make modelsim
 +</​code>​
  
 +starten. Wenn Sie gleich alle Toplevelsignale in das Waveformfenster übertragen und die Simulation starten wollen, dann können Sie das mit 
  
  
 +<​code>​
 +make sim
 +</​code>​
  
 +Wenn ihr Code allerdings noch Fehler enthält, dann wird die graphische Oberfläche nicht gestartet. Sie können dann besser mit "make modelsim"​ die GUI starten und dann dort mit "​Compile->​Compile All" die VHDL Dateien übersetzen. Mit
  
 +<​code>​
 +make clean
 +</​code>​
  
 +werden alle temporär erzeugten Dateien gelöscht.
  
 +In der Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​sim/​ledsw/​makefile|makefile]] wird der Name des Projektes festgelegt. Aus dem Projektnamen wird ein Name für die Testbench nach dem Muster t_<​project>​.vhd abgeleitet. Zusätzlichen werden alle Dateien, die in der Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​sim/​ledsw/​makefile.sources|makefile.sources]] aufgelistet sind, zu dem Projekt hinzugefügt. Hier müssen also alle Dateien aufgelistet werden, die zu dem Projekt gehören.
  
 +In dem Beispiel hier sind ist die Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​t_ledsw.vhd|t_ledsw.vhd]] die Testbench und [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​ledsw_rtl.vhd|ledsw_rtl.vhd]] die Datei, die später für das FPGA synthetisiert wird.
  • dtpr_versuch_3.1291065734.txt.gz
  • Last modified: 2010/11/29 22:22
  • by beckmanf