Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> VHDL

VHDL Dual-7-Segment-Display-Controller für Pmod SSD – Einfache FPGA-Integration

Projektvorstellung

In diesem Artikel präsentiere ich ein VHDL-Modul, das eine zweistellige Zahl auf dem Pmod SSD: Seven-segment Display von Digilent anzeigt. Das Dual-7-Segment-Display ist kompatibel mit dem Pmod-Interface – Nutzung ohne Löten möglich. Es passt in den Pmod-Connector, Standard auf vielen FPGA-Entwicklungsboards.

Zum Testen der VHDL-Implementierung nutze ich den Lattice iCEstick – ein kostengünstiges FPGA-Entwicklungsboard mit Pmod-Connector. Zusätzlich zum iCEstick benötigen Sie ein 2×6-Pin auf Dual 6-Pin Pmod Splitter-Kabel, um vom parallelen Pmod-Connector des iCEstick auf die In-Series-Version des Steckers zu kommen, den das 7-Segment-Display erwartet. Empfohlen: USB-Type-A-Verlängerungskabel, da direktes Einstecken des iCEstick in den USB-Port am Computer unpraktisch ist.

Funktionsweise von 7-Segment-Displays

Es gibt viele verschiedene 7-Segment-Displays am Markt. Ziffernanzahl, physisches Interface und Pinout variieren. Eine generische Lösung für alle möglichen Displays wäre wahrscheinlich nicht benutzerfreundlich. Den Code dieses Artikels können Sie jedoch als Basis nutzen und an Ihre Bedürfnisse anpassen.

Das Bild oben stammt aus dem Datenblatt des Digilent Pmod-Moduls. Es zeigt, wie das 7-Segment-Display an die Pmod-Pins angeschlossen wird. Diese Pins sind direkt vom FPGA auf dem iCEstick zugänglich.

Sieben Pins steuern jeweils ein Segment. Ein Logik-High auf solch einem Pin lässt das entsprechende Segment leuchten. Aber: zwei Ziffern, nur eine steuerbar zur gleichen Zeit. Pin P4/C am J2-Connector wählt links oder rechts. Logik-Spannung '0' → rechte Ziffer leuchtet, '1' → linke Ziffer aktiv.

Der „DP“ Dezimalpunkt ist unverbunden und nicht zugänglich.

Das Entity

Der folgende Code zeigt das Entity unseres seg7 VHDL-Moduls. Das Entity hat einen Generic-Port mit Konstante clk_cnt_bits. Sie definiert die Länge eines internen Zählers, der die Refresh-Rate des Displays steuert – die Frequenz des Wechsels zwischen linker und rechter Ziffer.

Die exakte Frequenz ist nicht kritisch. Wählen Sie eine Zählerlänge für 50 bis einige hundert Hertz. Formel: refresh_hz = 2clk_cnt_bits / clk_hz.

entity seg7 is
  generic (
    -- refresh_hz = (2 ** clk_cnt_bits) / clk_hz
    clk_cnt_bits : integer
  );
  port (
    clk       : in  std_logic;
    rst       : in  std_logic;
    value     : in  integer range 0 to 99;
    segments  : out std_logic_vector(6 downto 0);
    digit_sel : out std_logic
  );
end seg7;

Neben Clock und Reset hat das Entity ein Eingangssignal: den anzuzeigenden Wert. value ist Integer-Typ, beschränkt auf 0 bis 99 (nur diese Zahlen mit zwei Ziffern darstellbar).

Ausgangssignale: sieben Segmente als Vektor und Digit-Selector-Signal für Auswahl linker/rechter Ziffer.

Darstellung als Binary-Coded Decimal (BCD)

Für die auf dem Display darzustellenden Ziffern nutzen wir Binary-Coded Decimal (BCD). Binäre Repräsentation ist speichereffizientester Weg für Dezimalzahlen, aber beim Aufsplitten in linke/rechte Ziffer problematisch: Dezimalziffern lassen sich nicht einfach durch Vektor-Slicing trennen.

subtype digit_type is integer range 0 to 9;
type digits_type is array (1 downto 0) of digit_type;
signal digit  : digit_type;
signal digits : digits_type;

Code oben: Subtyp Integer 0–9 für Wert einer Dezimalziffer. Neuer Array-Typ für zwei BCD-Werte. digit Signal hält die aktuell angezeigte Ziffer (links oder rechts). digits Signal enthält die einzelnen Dezimalzeichen für beide Ziffern, wie sie der Betrachter sieht.

Dezimal zu BCD konvertieren

Eingang value (Integer 0–99, binäre Repräsentation) → zwei Integers 0–9 (BCDs).

Standardalgorithmus: Double Dabble (Shift-and-Add-3). Für nur zwei Ziffern wähle ich kürzere Lösung.

digits(1) <= value / 10;
digits(0) <= value - ((value / 10) * 10);

Ganzzahl-Division isoliert die signifikanteste Dezimalziffer → digits(1). Wenigsignifikante Ziffer: signifikanteste Ziffer von value subtrahieren → Rest für digits(0).

Taktzyklen zählen

Zeitverzögerung in FPGAs = Taktzyklen zählen. Taktperiode = einziger vorhersagbarer Zeitintervall in VHDL. clk_count Signal für Zählung. clk_cnt_bits Generic bestimmt Bitbreite dieses Unsigned-Signals.

signal clk_cnt : unsigned(clk_cnt_bits - 1 downto 0);

Exakte Refresh-Rate unwichtig → Unsigned-Typ für Self-Wrapping-Verhalten. Einfach: Zähler bei jeder steigenden Taktflanke inkrementieren. Synchroner Prozess mit Reset:

COUNT_PROC : process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      clk_cnt <= (others => '0');
    else
      clk_cnt <= clk_cnt + 1;
    end if;
  end if;
end process;

Zwischen Ziffern wechseln

Freilaufender Zähler läuft → Most Significant Bit (MSB) des Unsigned-Zählersignal zum Wechsel zwischen den zwei Ziffern nutzen. MSB wechselt zwischen '0' und '1' mit 50 % Duty Cycle. Erste Zeile unten setzt digit_sel basierend auf MSB. Zweite Zeile: Multiplexer mit MSB als Selektor – leitet Wert der aktiven Ziffer aus digits Array an digit Signal weiter.

digit_sel <= clk_cnt(clk_cnt'high);
digit <= digits(0) when clk_cnt(clk_cnt'high) = '0' else digits(1);

BCD zu 7-Segment Encoder

Letzter Schritt des seg7-Moduls: BCD im digit Signal in visuelle Darstellung auf 7-Segment-Display übersetzen. Prozess mit Case-Statement:

Position im Vektor = Segment auf Display. Index 0 = Segment A, Index 1 = B, … Index 6 = Segment G. Zuordnung aus Digilent 7-Segment-Display Datenblatt.

ENCODER_PROC : process(digit)
begin
  case digit is
    when 0 => segments <= "0111111";
    when 1 => segments <= "0000110";
    when 2 => segments <= "1011011";
    when 3 => segments <= "1001111";
    when 4 => segments <= "1100110";
    when 5 => segments <= "1101101";
    when 6 => segments <= "1111101";
    when 7 => segments <= "0000111";
    when 8 => segments <= "1111111";
    when 9 => segments <= "1101111";
  end case;
end process;

Ausgabe

Das seg7 VHDL-Modul rendert auf dem Display, was Sie dem value Eingangssignal zuweisen. Im Testbench inkrementieren wir value einmal pro Sekunde. Simulieren etwas über 100 Sekunden → Wrapping-Punkt des value Counters beobachten.

Waveform oben (ModelSim): erster Simulationsabschnitt, Wert zählt 0 bis 15. digits Array zählt mit. Einer (0) zählt bei jedem value Wechsel, Zehner (1) bei jeder zehnten Zahl.

ModelSim-Projekt inkl. Testbench per Formular unten herunterladbar.

Implementiert man seg7 als Top-Modul auf FPGA, zeigt Display vermutlich stabiles „00“. '0' ist häufigster Default für uninitialisierte Signale in FPGAs. value = all zeros → Display zeigt genau das.

Um alle möglichen Eingabezahlen durchzucyclen, erstellte ich ein Wrapper-VHDL-Modul, das value zehnmal pro Sekunde inkrementiert. seg7 Modul im Wrapper instanziiert, Design auf Lattice iCEstick implementiert. Looping GIF-Video unten zeigt implementiertes Design auf 7-Segment-Display.

Pmod SSD: Seven-segment Display kaufen

Verwendetes 7-Segment-Display von Digilent. Kauf über Digilent Webshop oder Reseller. Unten Produktseiten in Online-Elektronikshops:

Hinweis: Digilent 7-Segment-Display mit Lattice iCEstick (oder anderem FPGA-Board mit 6×2-Pin Pmod-Connector) → Splitter-Kabel nötig. Erhältlich bei Digilent, Digi-Key, Mouser, RS Electronics.

Zusätzlich alle Komponenten bei diversen Verkäufern auf Amazon und eBay.

VHDL-Kurs mit Digilent 7-Segment-Display

Neuer VHDL- und FPGA-Kurs für absolute Anfänger gestartet. Im Kurs: 7-Segment-Display von Digilent und Lattice iCEstick FPGA-Board für VHDL-Lehre. Link unten für Details!

FPGA and VHDL Fast-Track: Hands-On for Absolute Beginners

Sind Sie mit Programmierung vertraut, aber neu in VHDL? Brauchen Sie eine kurze Einführung? Volle Agenda, keine Studienzeit? Verstehen Sie FPGA-Entwicklung mit VHDL in wenigen Abenden! Kurs für IT-Profis und Studenten, die schnellen Überblick brauchen. Mit Kurs und kostengünstigem Lattice iCEstick Board entwickeln Sie innerhalb von Stunden echte Hardware.

Hier klicken für Infos & Anmeldung:
FPGA and VHDL Fast-Track: Hands-On for Absolute Beginners

VHDL

  1. BMP-Bitmap-Bilder in VHDL-Testbenches mit TEXTIO einlesen
  2. Testen Sie Ihre VHDL-Grundkenntnisse – Interaktives Quiz Teil 1
  3. VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
  4. Ihr erstes FPGA bauen: LED Blink Tutorial (VHDL & Verilog)
  5. Einsatz von Sensitivity Lists in VHDL-Prozessen für zuverlässiges RTL-Design
  6. FPGAs erkunden: Anwendungen, Vorteile & Einstieg in VHDL
  7. Tcl-gesteuerter Testbench für ein VHDL Code-Lock-Modul erstellen
  8. Constrained Random Verification mit OSVVM meistern
  9. Prozeduren in VHDL: Wiederverwendbaren Code für einfachere Designs
  10. In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen