VHDL Übung 1 - Kombinatorische Logik

URL: ../..dic/programmierbare_logik/uebung1.html

VHDL Übung 1 - Kombinatorische Logik

Übungsaufgabe link symbol

In dieser Übung wird das BASYS2 Board verwendetseverity symbol

Für weitere Fragen zum Board bitte das Manual konsultieren.

In dieser Übung nutzen wir vier Schalter des BASYS2 Boards (SW0 bis SW3) um damit eine 4 Bit Zahl einzugeben. Im FPGA soll eine Kombinatorik entworfen werden, um mittels dieser 4 Bit Zahl eine 7 Segment Anzeige anzusteuern.

SW3SW2SW1SW0Ausgabe auf der 7 Segment Anzeige
AusAusAusAus0
AusAusAusEin1
AusAusEinAus2
AusAusEinEin3
AusEinAusAus4
AusEinAusEin5
AusEinEinAus6
AusEinEinEin7
EinAusAusAus8
EinAusAusEin9

Vorbereitung link symbol

  • Projektordner herunterladen und entpacken
  • Projekt seven_segments.xise öffnen

Top Level seven_segments.vhd link symbol

seven_segments.vhd ist das Top Level Design und definiert die oberste Ebene, d.h. diese Entity beschreibt mit ihrer port-Direktive die Pins des FPGA Bausteins.

library ieee;
use ieee.std_logic_1164.all;

entity seven_segments is
  port (
    switches_i : in std_ulogic_vector(3 downto 0);
    an_o : out std_ulogic_vector(3 downto 0);
    segments_o : out std_ulogic_vector(6 downto 0) -- segments "ABCDEFG"
  );
end entity;

architecture behave of seven_segments is
begin
  with switches_i select segments_o <=
    "0000001" when "0000", -- display 0
    "1001111" when "0001", -- display 1
    -- ...
    "1111111" when others;

  an_o <= "0111";
end architecture;

Pinout link symbol

Die Signale switches_i, an_o und segments_o finden sich im folgenden Pinout des BASYS2 Boards:

Pinout des BASYS2 Boards
Pinout des BASYS2 Boards (Quelle: Digilent Inc. BASYS2 Manual, Lizenz © Digilent)

Das Pinout wird in der Datei seven_segments.ucf beschrieben. Für dieses VHDL Modell sieht es wie folgt aus:

NET "switches_i(3)" LOC = "B4";
NET "switches_i(2)" LOC = "K3";
NET "switches_i(1)" LOC = "L3";
NET "switches_i(0)" LOC = "P11";

NET "an_o(3)" LOC = "K14"; # driver for left most display
NET "an_o(2)" LOC = "M13";
NET "an_o(1)" LOC = "J12";
NET "an_o(0)" LOC = "F12"; # driver for right most display

NET "segments_o(6)" LOC = "L14"; # segment A
NET "segments_o(5)" LOC = "H12"; # segment B
NET "segments_o(4)" LOC = "N14"; # segment C
NET "segments_o(3)" LOC = "N11"; # segment D
NET "segments_o(2)" LOC = "P12"; # segment E
NET "segments_o(1)" LOC = "L13"; # segment F
NET "segments_o(0)" LOC = "M12"; # segment G

7-Segment Anzeige link symbol

In der folgenden Abbildung sieht man die Anordnung der einzelnen Segmente:

7-Segment Anzeige des BASYS2 Boards
7-Segment Anzeige des BASYS2 Boards (Quelle: Digilent Inc. BASYS2 Manual, Lizenz © Digilent)

Aufgabe 1 - Erweitern der kombinatorischen Beschreibung link symbol

with switches_i(3 downto 0) select segments_o <=
  "0000001" when "0000", -- digit 0
  "1001111" when "0001", -- digit 1
  -- ...
  "1111111" when others;

Die kombinatorische Beschreibung ist nicht vollständig. Das Ziel ist es die Kombinatorik entsprechend um die Anzeige der Werte 2 bis 9 zu erweitern.

Aufgabe 2 - Test auf dem Board link symbol

Das Projekt soll synthetisiert und auf dem Board getestet werden.

Aufgabe 3 - Erweiterung um die Darstellung von Hexadezimalzahlen link symbol

SW3SW2SW1SW0Ausgabe auf der 7 Segment Anzeige
EinAusEinAusA
EinAusEinEinB
EinEinAusAusC
EinEinAusEinD
EinEinEinAusE
EinEinEinEinF
  • Überlege dir, wie die einzelnen Segmente angesteuert werden sollen, um die Buchstaben A bis F darzustellen.
  • Teste das Design auf dem BASYS2 Board