Inhaltsverzeichnis:
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
Willkommen bei der Anleitung zum Bau einer Stoppuhr mit grundlegendem VHDL und Basys 3-Board. Wir freuen uns, unser Projekt mit Ihnen zu teilen! Dies war ein letztes Projekt für den Kurs CPE 133 (Digital Design) bei Cal Poly, SLO im Herbst 2016. Das Projekt, das wir gebaut haben, ist eine einfache Stoppuhr, die die Zeit startet, zurücksetzt und anhält. Es nimmt drei Taster auf der Basys3-Platine als Eingaben auf und die Uhrzeit wird auf der vierstelligen Sieben-Segment-Anzeige der Platine angezeigt. Die verstrichene Zeit wird im Format Sekunden: Zentisekunden angezeigt. Es verwendet die Systemuhr des Boards als Eingabe, um die verstrichene Zeit zu verfolgen und gibt die Zeit an die vier Stellen der Siebensegmentanzeige aus.
Schritt 1: Materialien
Die Materialien, die Sie für dieses Projekt benötigen:
- 1 Computer mit installiertem Vivado Design Suite WebPack von Xilinx (bevorzugen Sie Version 2016.2)
- 1 Digilent Basys3 Xilinx Artix-7 FPGA-Board
- 1 USB-Anschlusskabel
Schritt 2: Ein- und Ausgänge einstellen
Die obige Abbildung zeigt ein Blockschaltbild der obersten Ebene des Hauptmoduls der Stoppuhr. Die Stoppuhr nimmt die Eingänge "CLK" (Uhr), "S1" (Start-Taste), "S2" (Pause-Taste) und "RST" (Reset) auf und hat einen 4-Bit-Ausgang "Anodes", einen 7-Bit Ausgang "Segment" und einen Einzelbit-Ausgang "DP" (Dezimalpunkt). Wenn Eingang "S1" hoch ist, beginnt die Stoppuhr mit dem Zeitzählen. Wenn "S2" niedrig ist, hält die Stoppuhr die Zeit an. Wenn "RST" hoch ist, stoppt die Stoppuhr und stellt die Zeit zurück. Es gibt vier Submodule innerhalb der Schaltung: den Taktteiler, den Ziffernzähler, den Sieben-Segment-Anzeigetreiber und den Sieben-Segment-Anzeige-Encoder. Das Hauptmodul Stoppuhr verbindet alle Untermodule miteinander und mit den Ein- und Ausgängen.
Schritt 3: Uhren herstellen
Das Taktteilermodul nimmt einen Systemtakt auf und verwendet einen Teilereingang, um einen Takt mit einer Geschwindigkeit zu erzeugen, die nicht höher als die des Systemtakts ist. Die Stoppuhr verwendet zwei verschiedene Taktmodule, eines, das einen 500-Hz-Takt erzeugt und ein anderes, das einen 100-Hz-Takt erzeugt. Das Schema für den Taktteiler ist in der obigen Abbildung dargestellt. Der Taktteiler nimmt einen Einzelbit-Eingang "CLK" und einen 32-Bit-Eingang "Divisor" und den Einzelbit-Ausgang "CLKOUT" auf. "CLK" ist der Systemtakt und "CLKOUT" ist der resultierende Takt. Das Modul enthält auch ein NOT-Gatter, das das Signal "CLKTOG" umschaltet, wenn der Zähler den Wert des Divisors erreicht.
Schritt 4: Zählen bis Zehn
Der Ziffernzähler zählt jede Ziffer von 0 bis 10 und erzeugt einen weiteren Takt, damit die nächste Ziffer funktioniert, die oszilliert, wenn der Zählerstand 10 erreicht. Das Modul nimmt 3 Einzelbit-Eingänge "S", "RST" und "CLK" auf " und führt zu einer Einzelbit-Ausgabe "N" und einer 4-Bit-Ausgabe "D". Eingang "S" ist die Freigabe im Eingang. Die Uhr schaltet sich ein, wenn "S" hoch ist, und aus, wenn "S" niedrig ist. "RST" ist der Reset-Eingang, so dass die Uhr zurückgesetzt wird, wenn "RST" hoch ist. "CLK" ist der Takteingang für den Ziffernzähler. "N" ist der Taktausgang, der zum Eingangstakt für die nächste Ziffer wird. Ausgang "D" zeigt den Binärwert der Stelle an, an der sich der Zähler befindet.
Schritt 5: Zahlen anzeigen
Der Sieben-Segment-Anzeigecodierer codiert die vom Sieben-Segment-Anzeigetreibermodul empfangene Binärzahl und wandelt sie in einen Bitstrom um, der als '1' oder '0'-Werte für jedes Segment der Anzeige interpretiert wird. Die Binärzahl wird vom Modul als 4-Bit-Eingang „Ziffer“empfangen und ergibt den 7-Bit-Ausgang „Segmente“. Das Modul besteht aus einem Single-Case-Prozessblock, der jedem möglichen Eingabewert von 0 bis 9 einen bestimmten 7-Bit-Stream zuweist. Jedes Bit in den 7-Bit-Streams repräsentiert eines der sieben Segmente der Ziffern auf dem Display. Die Reihenfolge der Segmente im Stream ist „abcdefg“, wobei „0“die Segmente darstellen, die für die angegebene Nummer aufleuchten.
Schritt 6: So zeigen Sie die Stoppuhr an
In dem Sieben-Segment-Anzeigetreibermodul gibt es vier 4-Bit-Eingänge "D0", "D1", "D2" und "D3", die jeweils die vier anzuzeigenden Ziffern darstellen. Eingang "CLK" ist der Takteingang des Systems. Der Einzelbit-Ausgang "DP" stellt den Dezimalpunkt auf der Siebensegmentanzeige dar. Der 4-Bit-Ausgang „Anoden“bestimmt, welche Stelle der Siebensegmentanzeige angezeigt wird und der 4-Bit-Ausgang „temp“hängt vom Zustand des 2-Bit-Steuereingangs „SEL“ab. Das Modul verwendet 4 Multiplexer für den Steuereingang „SEL“und die drei Ausgänge; "Anoden", "Temp" und "DP".
Schritt 7: Alles zusammenbringen
Ein 'if'-Prozessblock, der vom 500-Hz-Takt abläuft, wird verwendet, um die Start- und Pause-Schaltflächen zu erstellen. Verknüpfen Sie anschließend alle Submodule im Stoppuhr-Hauptmodul, indem Sie die Komponenten jedes einzelnen Submoduls deklarieren und verschiedene Signale verwenden. Die Ziffern-Submodule nehmen den Taktausgang des vorherigen Ziffern-Submoduls auf, während das erste den 100-Hz-Takt aufnimmt. Die „D“-Ausgänge der Digit-Submodule werden dann die „D“-Eingänge des Siebensegment-Anzeigetreibermoduls. Und schließlich wird der "temp"-Ausgang des Siebensegment-Anzeigetreibermoduls zum "temp"-Eingang des Siebensegment-Encodermoduls.
Schritt 8: Einschränkungen
Verwenden Sie 3 Taster (W19, T17 und U18) für die Eingänge "RST", "S1" und "S2". W19 ist die Reset-Taste, T17 ist die Start-Taste (S1) und U18 ist die Pause-Taste (S2). Bei Verwendung von Port W5 ist auch eine Einschränkung für den Takteingang erforderlich. Denken Sie auch daran, diese Zeile zur Taktbeschränkung hinzuzufügen:
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK}]
Verknüpfen Sie auch die Anoden und Segmente mit der Platine, damit die Stoppuhr auf der Sieben-Segment-Anzeige angezeigt wird, wie in der Einschränkungsdatei zu sehen.
Schritt 9: Testen
Stellen Sie sicher, dass Ihr Gerät funktioniert, indem Sie mit den drei Tasten spielen: Drücken und halten Sie sie in jeder möglichen Reihenfolge, um mögliche Probleme mit Ihrem Code zu finden.