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.

SW3 SW2 SW1 SW0 Ausgabe auf der 7 Segment Anzeige
Aus Aus Aus Aus 0
Aus Aus Aus Ein 1
Aus Aus Ein Aus 2
Aus Aus Ein Ein 3
Aus Ein Aus Aus 4
Aus Ein Aus Ein 5
Aus Ein Ein Aus 6
Aus Ein Ein Ein 7
Ein Aus Aus Aus 8
Ein Aus Aus Ein 9

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_segment 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_segment 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

SW3 SW2 SW1 SW0 Ausgabe auf der 7 Segment Anzeige
Ein Aus Ein Aus A
Ein Aus Ein Ein B
Ein Ein Aus Aus C
Ein Ein Aus Ein D
Ein Ein Ein Aus E
Ein Ein Ein Ein F
  • Überlege dir, wie die einzelnen Segmente angesteuert werden sollen, um die Buchstaben A bis F darzustellen.
  • Teste das Design auf dem BASYS2 Board