Versuch 05: Digitaler Entwurf mit einem FPGA Board
Eine Finite State Machine zum Verschieben einer Zahl auf einer 4 stelligen 7-Segment-Anzeige wird realisiert.
Eine modm Zählerschaltung ersetzt den Zähler, um die Tastenabfrage zu verbessern.


Länge: 35:20
0:0:40 Aufgabenbeschreibung

0:1:20 Anweisungen an

0:2:50 Kopieren des process

0:4:10 btn(2), btn(3)

0:5:0 Case Anweisung btn(2)

0:6:30 Case Anweisung btn(3)

0:8:0 Dokumentation

0:9:45 Simulation

0:10:20 btn(2) setzen

0:11:30 btn(3)

0:12:0 Simulationsergebnis weiter/länger simulieren

0:14:30 Diskussion des Ergebnisses

0:16:0 Implementierung

0:17:25 Program device

0:17:50 Test der Buttons

0:19:40 Submit

Evaluation Vorlesung Digitaltechnik


Bitte folgen Sie, falls noch nicht geschehen, folgendem Link und führen Sie erst eine Evaluierung der Vorlesung Digitaltechnik durch!

→ Evaluation

Hinweise zur Durchführung


Lesen Sie vor dem Versuch die Anleitung. Dokumentieren Sie jeden Versuch in einer Ausarbeitung, Bildschirmkopien der Ergebnisse (< alt > < Druck >, < cmd > < F14 > ) und Ihren persönlichen Erfahrungen. Bitte beachten Sie folgende Hinweise:
  • Elektronikbauteile sind gefährdet durch elektrische Entladungen (ESD). Bevor Sie die Bauteile oder Komponenten des Boards berühren, berühren Sie bitte einen Massepunkt zwecks Entladung. Verwenden Sie ESD Schutzmaßnahmen. Berühren Sie bitte auch nicht eine andere Person, welche gerade mit Elektronikkomponenten / Bauteilen hantiert.

5 Aufgabenstellung

5.1 Entwicklungsumgebung


Sie verwenden das BASYS 3 Board der Fa. Digilent und die Entwicklungsumgebung Xilinx Vivado.
Revisionsstand der Tools (SS2020): BASYS3 Board, Xilinx Vivado HLx Webpack on Windows 10 PC.

5.2 Aufgabenbeschreibung:


Für das Basys 3 Board erweitern Sie ein VHDL-Programm, um eine Zahl auf der 4-stelligen 7-Segment-Anzeige mit btn(2) und btn(3) nach Links und Rechts zu verschieben. Hierbei werden die Schiebeschalter SW0 bis SW3 als Dualzahl interpretiert und die entsprechende Dezimalzahl mit der 7-Segment-Anzeige angezeigt.
Die Tastenabfrage soll durch Änderung des Zählervergleichs verbessert werden.
Teil Aufgabe
1 Eine Finite State Machine zum Verschieben einer Zahl auf einer 4 stelligen 7-Segment-Anzeige wird realisiert.
Simulation und Implementierung der Schaltung.
2 Die Tastenabfrage wird durch Änderung des Zählervergleichs verbessert.

5.3 Versuchsdurchführung


Teil 1: Einfügen der Zustandsmaschine zum Verschieben einer Zahl mit den Tasten


Aktion
1 Starten Sie Xilinx Vivado. Click auf "Vivado 2019.1".

2 Laden Sie Ihr Project des vorigen Versuches "File" -> "Open Project".
Editieren Sie die Hauptdatei: "Versuch3.vhd"
3 Suchen Sie die Zuweisung für den Bus 'an' im Quelltext.
Mit dem Bus 'an' wird ausgewählt, welche Stelle der 7-Segmentanzeige aktiv ist.
an <= "1101" aktiviert durch die eine '0' die 3. Stelle der Anzeige.
Mit Hilfe der Taster "btn(2)" und "btn(3)" soll 'an' so verändert werden, dass die angezeigte Zahl nach rechts oder links wandert. Die '0' soll nach rechts oder links geschoben werden.

Als Ausgangsbasis für die Zustandsmaschine kopieren Sie den Abschnitt des letzten Versuchs.

 process(CLK,btn(0))
     begin
       if ( btn(0) = '1') then  -- asynchron reset with button 0
            dpi <= '0';
       elsif  (rising_edge(clk) and (count24(21 downto 0)="1000000000000000000000") ) then 
            if (btn(1) = '1') then
                dpi <= not(dpi);
            end if;   
       end if;
     end process;
     dp <= dpi;
Statt einem Signal "dp" und "dpi", wollen Sie den Bus "an" und "ani" benutzen.
Ergänzen und modifizieren Sie den Quelltext entsprechend.
Was müssen Sie tun um "ani" verwenden zu können?
Die Taster "btn(2)" und "btn(3)" sollen abgefragt werden.
Dazu können Sie eine weitere "if" Abfrage verwenden.
Überlegen Sie wo dieser "if"-Block eingefügt werden muss.
Da die Zustände von an abzählbar sind: an="1110","1101","1011","0111" können Sie für jeden Taster jeweils ein "case"-Konstrukt verwenden.
Überlegen Sie, wo dieser "case"-Block eingefügt werden muss.

case ani is
  when "1101" => ani <= "1011";
   ...
  when others     => ani <= "1110";
end case;
Modifizieren Sie Ihren Code und dokumentieren Sie Ihn hier:
4 Simulieren Sie Ihren Code. Sie müssen dazu die Testvektoren auch für btn(2) und (3) erstellen.
In welche Datei, an welcher Stelle fügen Sie die Testvektoren für btn(2) und (3) ein?
Wie lange soll btn(2) aktiv sein? Wann soll btn(3) aktiv sein?
5 Simulieren Sie, genauso wie im letzten und vorletzten Versuch, die Funktion.
Stellen Sie sicher, dass alle Testvektoren sichtbar sind.
Dokumentieren Sie ihr Ergebnis und fügen Sie hier den Screenshot ein:


Remove

Verhält sich die Simulation wie erwartet?

6 Implementieren Sie die Funktion auf dem BASYS 3 Board.
Flow navigator, Program and Debug, Generate bitstream
Open hardware manager, open target, program device.
Testen Sie die Schaltung.
Dokumentieren Sie hier Probleme und Ergebnisse:

Optional Teil 2: Optimierung der Tastenabfrage mit einem modulo m Zähler


7 Für die Tastenabfrage wird ein modulo m Zähler benötigt. Um mathematische Operationen zu relaisieren wird erst eine Bibliothek am Anfang der VHDL Datei eingefügt.

use IEEE.std_logic_arith.all;
Die Signale 'en' und 'count' werden zwischen COMPONENT und BEGIN eingefügt:

 SIGNAL COUNT: std_logic_vector(23 downto 0);
 SIGNAL EN:STD_LOGIC;
Dann kann ein modulo m Zähler realisiert werden:

 process(CLK,btn(0))
    constant m:STD_LOGIC_VECTOR(23 downto 0) :="100000000000000000000000";    
    begin
       if ( btn(0) = '1') then   
            count <= (others =>'0');
       elsif  (rising_edge(clk)) then 
            if (count(23 downto 0) = m(23 downto 0)) then
                count <= (others =>'0');
                en <= '1';
            else
                count <= unsigned(count) + 1;
                en <= '0';
            end if;
       end if;
    end process;
Der Zähler generiert ein enable 'en' Signal. Verwenden Sie nun dieses Signal zur Tasterabfrage.

elsif  ((rising_edge(clk)) and (en='1')) then

Ein Taktzyklus ist bei 50Mhz 20ns lang. Der Vergleich mit der Dualzahl m := "10000000000000000000000" (Dezimal: \( 2^{23} = 8 \cdot 10^6 \) ) bewirkt, das das en Signal alle \( 20 ns \cdot 8 \cdot 10^6 = 160 ms \) erzeugt wird und die Taster abgefragt werden.
Ändern Sie den Wert der Dualzahl m so, dass die Taste optimal abgefragt wird.


Erläutern Sie hier das Vorgehen, Probleme und Ergebnisse (Optimale Dualzahl):





Bitte geben Sie Gruppennummer und Namen ein:


Drucken Sie diese Seite für Ihre Unterlagen als pdf Datei aus. Verwenden Sie den Drucker pdf Creator.

Last Saved:




Submit     Recall     Save     Print