Hochschule Kempten      
Fakultät Elektrotechnik      
Digitaltechnik       Projektpraktikum       Fachgebiet Elektronik, Prof. Vollrath      

Digitaltechnik

Serial Interfaces in VHDL

Prof. Dr.

Jörg Vollrath


EI6 Projektpraktikum 2026


Übersicht

SPI und I2C Kommunikation

VHDL

VHDL: Wikipedia: Very High Speed Integrated Circuit Hardware Description Language
Textuelle Beschreibung, Programmiersprache, Nebenläufigkeit
Verilog: Hardwarebeschreibungssprache

In dieser Vorlesung wird versucht mit minimalen Kenntnissen in begrenzter Zeit Hardware zu beschreiben und zu realisieren (FPGA).

Strategie

Kopieren, Modifizieren, Testen

Was erwarten Sie von einer Programmiersprache?



Darstellung boolescher Verknüpfungen

Schaltfunktion UND


Y = f(x1,x2) = x1 ^ x2 = x1 · x2


Wahrheitstabelle


  x1     x2     Y  
000
010
100
111

Schaltsymbol, Schaltverhalten



VHDL Beschreibung


entity und is port (
    X1,X2: in STD_LOGIC;
    Y: out STD_LOGIC);
end und;
architecture logic of und is
begin
    Y <= X1 and X2;
end;

VHDL Beschreibung

  • Steuerwörter:
    • Entity, is, port, end, architecture, of, begin, <=, and, end
  • Trennungszeichen
    • Strichpunkt ;
  • Programmierung durch Kopieren und Verändern.
  • Struktur
    • Entity: Schnittstelle: Eingänge und Ausgänge
    • architecture: Verbindung und Funktionen

VHDL Beschreibung


entity und is port (
    X1,X2: in STD_LOGIC;
    Y: out STD_LOGIC);
end und;
architecture logic of und is
begin
    Y <= X1 and X2;
end;

Entwicklungsumgebung (IDE)

Xilinx Vivado

Integrated development environment (IDE).
Entwicklungsumgebungen sehen alle sehr ähnlich aus und sind folgendermaßen aufgebaut:
Links gibt es den "Flow Navigator" der die Schritte Entwurf("IP Integrator"), Simulation und Hardware Konfiguration ("RTL Analysis", "Synthesis", "Implementation") bereitstellt.
Entwurf: Zusammenstellung von Schaltungen durch VHDL, Verilog oder vordefinierten Blöcken (IP-Catalog).
Simulation: Eine logische Schaltung wird mit geeigneten Stimuli (Eingangssignalen) simuliert.
Mit Hilfe der Simulation erzeugt man eine Wahrheitstabelle um die Schaltung zu verifizieren.
Hardware Konfiguration: Aus einer textuellen Beschreibung soll eine Konfigurationsdatei für einen Logikschaltkreis erzeugt werden.
Diese Punkte entsprechen dem Kompilieren und Debuggen einer Programmierumgebung.
In Abhängigkeit des Schrittes ändern sich die rechts daneben gezeigten Fenster.
Rechts ist der Texteditor mit Syntaxhighlighting.
Schlüsselwörter werden farbig hervorgehoben.
In der Mitte ist der Baum mit allen verwendeten Dateien.
Im unteren Bereich sieht man Statusmeldungen (Fehler).

Beispiel: Logikfunktion

entity ANDX is
    Port ( X : in  STD_LOGIC_VECTOR (3 downto 0);
           y : out  STD_LOGIC);
end ANDX;

architecture Behavioral of ANDX is
signal H1:STD_LOGIC;
begin
 h1 <= x(1) and x(2);
 y<= (h1 or x(0)) and x(3);
end Behavioral;
Hier wird das Steuerwort 'signal' verwendet.

Test (1)

ENTITY ANDX_test IS
END ANDX_test;
 
ARCHITECTURE behavior OF ANDX_test IS 
    -- Component Declaration for the Unit Under Test (UUT)
    COMPONENT ANDX
    PORT(
         X : IN  std_logic_vector(3 downto 0);
         y : OUT  std_logic
        );
    END COMPONENT;
   --Inputs
   signal X : std_logic_vector(3 downto 0); -- := (others => '0');
   --Outputs
   signal y : std_logic;

Die entity ANDX_test hat keine Eingänge oder Ausgänge.
In der Architecture findet man erst die verwendeten Komponenten (COMPONENT) und dann die Leitungen oder Register (signal).

Test (2)

BEGIN
	-- Instantiate the Unit Under Test (UUT)
   uut: ANDX PORT MAP (
          X => X,
          y => y
        );
Als erstes wird die zu testende Schaltung (unit under test, uut) implementiert und verbunden (PORT MAP).
Da die Schaltung ANDX mehrmals verwendet werden kann, wird dieser Instanz der name uut zugeordnet.

Test (3)


   -- Stimulus process
   stim_proc: process
   begin		
 -- hold reset state for 100 ns.
      wait for 100 ns;	
 -- insert stimulus here 
      x <= (others => '0'); wait for 100 ns;
      x <= "1000"; wait for 100 ns;
      x(1) <='1'; wait for 100 ns;
      x(2) <='1'; wait for 200 ns;
      x(3 downto 2) <= "00"; wait for 100 ns;
      x <= "1001"; wait for 100 ns;
      wait;
   end process;
END;
Mit der Anweisung 'process' kann man eine Abfolge definieren.
Die 'wait' Anweisungen bestimmen das zeitliche Verhalten.
Die Anweisungen werden nacheinander von oben nach unten abgearbeitet.
Nur bei einer expliziten Zuweisung kann sich ein Signal ändern.

Simulationsergebnis


Schaltungsblöcke

Wiederverwendbarkeit, Componenten, mehrstufige Logik

Die Entwicklungsumgebung generiert ein Template (leere Hülle) zum Test einer Schaltung.
Man muss nur die zeitliche Abfolge der Signale einfügen.

Ein Multiplexer in VHDL

  • Entity
    • Input
    • Output
    • Std_logic
    • Std_logic_vector
      Bus
  • Architecture
    • When Anweisung (Statement)
entity Multiplexer_VHDL is
   port   (
      a, b, c, d: in std_logic; 
      Sel : in std_logic_vector(1 downto 0);
      Y : out std_logic
   );
end entity Multiplexer_VHDL;
 
architecture Behavioral of Multiplexer_VHDL is
begin 
  with Sel select
     Y <= a when "00",
          b when "01",
          c when "10",
          d when others; 
end architecture Behavioral;

Multiplexer und Demultiplexer

Funktion:
Multiplexer:
Eingänge:
n Signale: D0..Dn-1
i = ld(n) Auswahlsignale: A0..Ai
Ausgang: Y

Anwendung

2-1 Multiplexer

  • 2 Eingänge n = 2; D0,D1
  • Steuervariable: log22 = 1; A
  • Y = (/A·D0)+(A·D1)
  • Wahrheitstabelle
  Nr     A     D1     D0     Y  
00000; D0
10011; D0
20100; D0
30111; D0
41000; D1
51010; D1
61101; D1
71111; D1
  Nr     A     Y  
00 D0
11 D1

Modulo N Zähler

Modulo5: VHDL code

Als Basis dient der Code des D-Flip-Flops und der Code für eine Wahrheitstabelle.
entity  MODULO5 is
  port (
        RESET,CLK  : in STD_LOGIC; 
		B: out STD_LOGIC_VECTOR(2 downto 0));	  
end MODULO5;

architecture VERHALTEN of MODULO5  is
signal BINT: STD_LOGIC_VECTOR(2 downto 0);

Modulo 5 VHDL code (2)

begin
SYN_COUNT:process (CLK, RESET) 
begin
   if RESET = '1' then 
       BINT <= "000";
   elsif CLK='1' and CLK'event then
	case BINT is
		when "000" => BINT <= "001";
		when "001" => BINT <= "010";
		when "010" => BINT <= "011";
		when "011" => BINT <= "100";
		when "100" => BINT <= "000";
		when others => BINT <= "000"; 
	end case;
    end if;			
end process SYN_COUNT;
B <= BINT;
end VERHALTEN;
RESET Signal wurde eingeführt.
Sicherer Zustand "000" für den Fall others.
Ein Test benötigt nur die CLK. Diese wird meist automatisch erzeugt.

Kommentare zum VHDL Code

Man kann mit dem Zähler auch eine Zustandsmaschine mit 5 Zuständen bauen

Man kann mit dem Zähler auch 5 Testvektoren nacheinander ausgeben

Test Modulo5: VHDL code


entity Modulo5Test is
--  Port ( );
end Modulo5Test;

architecture Behavioral of Modulo5Test is
    COMPONENT  MODULO5
      port (
            RESET,CLK  : in STD_LOGIC; 
            B: out STD_LOGIC_VECTOR(2 downto 0)
           );	  
    end COMPONENT;
    -- Inputs
    signal RESET,CLK  : STD_LOGIC;
    -- Ouputs
    signal B: STD_LOGIC_VECTOR(2 downto 0);

Test Modulo5: VHDL code (2)


begin
 uut: MODULO5 PORT MAP( RESET => RESET, CLK => CLK,
        B => B ); 
 clk_proc: process        -- Clock process
 begin
   CLK <= '0'; wait for 5 ns;
   CLK <= '1'; wait for 5 ns;
 end process;
 stim_proc: process         -- Stimulus process
 begin
   reset <= '1'; wait for 10 ns;
   reset <= '0'; wait for 10 ns;
   wait;
 end process;
end Behavioral;

Modulo 5 simulation output

Modulo 5 Zähler als SERDES

Wie muss man den Modulo 5 Zähler für einen 2 Bit parallel-seriell Wandler modifizieren?

Wie muss man den Modulo 5 Zähler für einen 2 Bit seriell-parallel Wandler modifizieren?

Die 2 Bit Daten beginnen und enden immer mit einer "0".
Ansonsten ist die seriell Leitung "Z".
Welche Eingänge und ausgänge benötigt man.

Rezept für Digitaltechnik

  1. Lege eine Dokumentation an und erfasse jeden Schritt
  2. Identifiziere Eingänge, Zustände und Ausgänge im Text
  3. Identifiziere unvollständige oder fehlende Informationen
  4. Vergebe Namen und Zuordnungen: Button B, '1' An, '0' Aus
  5. Evtl: Zerlege das Problem in Teilprobleme und starte zur Bearbeitung von Teilproblemen neu
  6. Erstelle eine Zustandstabelle:
    Zustandsgleichungen, Zustandsdiagramm
  7. Erstelle einen Schaltplan und Eingangssignale und simuliere.
    Alle Zustandskombinationen und Eingangskombinationen müssen getestet werden.
  8. Erstelle VHDL code für die Zustandstabelle und Eingangssignale und simuliere
  9. Überprüfe die korrekte Funktion
  10. Reflektiere 'lessons learned' in einer Zusammenfassung
  11. Gratulation zum Ergebnis

Asynchrone serielle Übertragung

Schicht 1: UART

Universal, asynchronous receiver and transmitter
Beispiel Übertragung des Zeichens "G"
Zustand, logische Information, Bit,Pegel

Sender

Ein Modulo 12 Zähler kann verwendet werden.
Ein Multiplexer kann das richtige Bit am Ausgang ausgeben.

Empfänger

Mit einer hohen Frequenz wird das Eingangssignal abgetastet.
Bei einer erkannten "0" (Mehrmals 0) wird der Zähler für die nächsten Bits gestartet und demultiplexed die Signale an ein Register.

VHDL Serial Communication

FPGA Prototyping by VHDL, Pong P. Chu, ebook available
Chapter 7 UART
RTL Hardware Design Using VHDL