Zähler und PWM Generator mit FPGA und VHDL
Aufgabenstellung
Bauen Sie einen Modulo 13 Zähler und einen Ringzähler, die im Sekundentakt hochzählen und einen PWM Generator, bei dem das An/Aus Verhältnis über die Schalter eingestellt werden kann. Beide Schaltungen werden mit dem Logikanalysator vermessen.
Vorbereitung
Projekt aktualisieren
Aktualisieren Sie das dtlab Projekt mit
cd ~/projects/dtlab git pull
VHDL toplevel top_count
Die Datei top_count.vhd beschreibt das Modul “top_count”. “top_count” stellt den toplevel auf dem FPGA dar.
Zähler als Enablegenerator für den Ringzähler
Der Ringzähler aus ringcnt.vhd soll die roten LEDs ansteuern. Bei der letzten Aufgabe Ringzähler haben Sie den Ringzähler schon gebaut und an die roten LEDs angeschlossen. Der Ringzähler wurde dort entweder permanent oder mit dem Flankendetektor enabled. Jetzt soll der Ringzähler autark im Sekundentakt zählen. Das Enablesignal dazu kommt aus dem Zähler cnt1sec.vhd.
- Instantiieren Sie den Ringzähler ringcnt in top_count
- Instantiieren Sie Zähler cnt1sec in top_count
Der Zähler cnt1sec soll jede Sekunde ein Enablesignal liefern, damit der Ringzähler einmal pro Sekunde weiterzählt. Doch zunächst soll die Funktion im Simulator getestet werden. Eine Sekunde Echtzeit zu simulieren dauert in der Simulation sehr lange.
- Bauen Sie den Zähler cnt1sec. cnt1sec soll für die Simulation alle 5 Takte das Enablesignal aktivieren
- Verbinden Sie ringcnt und cnt1sec, damit der Ringzähler alle 5 Takte zählt
Prüfen Sie jetzt im Simulator die Funktion
- Produziert cnt1sec alle 5 Takte ein aktives Enablesignal?
- Zählt ringcnt alle 5 Takte weiter?
- Zeigen die roten LEDs den Zustand vom Ringzähler an, d.h. wird alle 5 Takte die nächste LED angeschaltet?
Testen Sie die Schaltung auf dem FPGA
- Ändern Sie cnt1sec, damit jetzt das Enablesignal einmal pro Sekunde aktiviert wird.
- Synthetisieren Sie das Design und Laden Sie es auf das FPGA
- Wird pro Sekunde einmal die rote LED weitergeschaltet?
Modulo 13 Zähler an HEX0
Jetzt soll zusätzlich der Modulo 13 Zähler eingebaut werden, der an der Siebensegmentanzeige HEX0 angezeigt wird. Der Zähler hat den Eingang “up_i”. Wenn “up_i” = 1 ist, dann soll der Zähler hochzählen und sonst runterzählen.
- Instantiieren Sie den Modulo 13 Zähler cntm13.vhd
- Der Zähler stand soll als Vorwärts-/Rückwärtszähler funktionieren. Steuern Sie die Zählrichtung über KEY1
- Der Zähler soll mit dem Enablesignal von cnt1sec gesteuert werden
Prüfen Sie die Funktion im Simulator
- Zählt der Zähler nur, wenn der Zähler cnt1sec ein Enablesignal liefert?
- Zählt der Zähler hoch, wenn KEY1 auf 1 ist?
- Zählt der Zähler runter, wenn KEY1 auf 0 ist?
- Zählt der Zähler als Modulo 13 Zähler?
PWM Generator
Der PWM Generator soll ein PWM Signal produzieren, dass abhängig von den Schaltern SW[3..0] gesteuert wird.
- Wenn die Schalter SW[3..0] alle aus sind, dann soll der Ausgang permanent auf '0' sein
- Wenn die Schalter SW[3..0] vorzeichenlos die Zahl 4 anzeigen, dann soll der Ausgang für 4 Takte auf '1' und für 11 Takte auf '1' sein.
- Wenn die Schalter SW[3..0] alle eingeschaltet sind, dann soll der Ausgang permanent auf '1' sein.
- Die Periodendauer des Signals soll 15 Takte betragen.
- Zeichnen Sie die Struktur des PWM Generators mit Addierern, Multiplexern, Vergleichern und Registern
- Ergänzen Sie den VHDL Code in pwm.vhd
- Instantiieren Sie pwm in top_count
- Das PWM Signal soll auf dem Expansionport EXP[2] ausgegeben werden
- Das PWM Signal soll gleichzeitig die grüne LED[3] ansteuern
Labor
Stellen Sie im Labor Ihre Ergebnisse vor. Bringen Sie die Zeichnungen und die Screenshots der Simulationen mit.
Nachweis Modulo 13 Zähler am Expansionport
Konfigurieren Sie cnt1sec so, dass alle 5 Takte ein Enablesignal produziert wird. Zeigen Sie die Funktion des Modulo 13 Zählers am Expansionsport.
Nachweis PWM Generator am Expansionport
Zeigen Sie die Funktion des PWM Generators am Expansionport.