Lehre.EDS_ProgF2 (Struktur)


Beispielprogramme zu Foliensatz EDS-F2

Einführung in VHDL

  • Programm zur Ausgabe der Meldung "Hallo Welt":
  • -- Foliensatz EDS-F2, Abschnitt 1.1 Hallo Welt
    -- Programm hallo_welt.vhd
    -- letzte Aenderung: 17.03.2016
    -- Autor: G. Kemnitz
    
    -- Zum Ausprobieren
    -- ghdl -a hallo_welt.vhd
    -- ghdl -m hallo_welt
    -- ghdl -r hallo_welt
    
    entity hallo_welt is  
    end entity;
    
    architecture a of hallo_welt is 
    begin
     process
     begin
      --Meldung ausgeben und Prozess beenden 
      report "Hallo Welt"; 
      wait; 
     end process;
    end architecture;
    
  • Hallo-Welt-Programm mit einem Package, in dem eine Konstante und eine Funktion definiert ist:
  • -- Foliensatz EDS-F2, Abschnitt 1. VHDL
    -- Package hallo_welt_pack.vhd
    -- letzte Aenderung: 17.03.2016
    -- Autor: G. Kemnitz
    
    -- Definitionssteil, exportierte Vereinbarungen 
    package hallo_welt_pack is
     constant c: string:="Hallo Zeichenkette";
     function SchreibeText(s: string) return string;
    end package;
    
    -- Beschreibung des Unterprogramms 
    package body hallo_welt_pack is
     function SchreibeText(s: string) return string is
     begin
      return s;
     end function;
    end package body;
    
    -- Foliensatz EDS-F2, Abschnitt 1. VHDL
    -- Programm hallo_welt1.vhd
    -- letzte Aenderung: 17.03.2016
    -- Autor: G. Kemnitz
    
    -- Zum Ausprobieren
    -- ghdl -a hallo_welt_pack.vhd
    -- ghdl -a hallo_welt.vhd
    -- ghdl -m hallo_welt
    -- ghdl -r hallo_welt
    
    use work.hallo_welt_pack.all;
    
    entity hallo_welt1 is  
    end entity;
    
    architecture a of hallo_welt1 is 
    begin
     process
     begin
      report "Hallo Welt"; 
      wait for 1 ns;
      report c;
      wait for 1 ns;
      report SchreibeText("Hallo Funktionsaufruf");
      wait; 
     end process;
    end architecture;
    
  • Bespielprogramm zur Definition und Nutzung einer str-Funktion:
  • -- Foliensatz EDS-F2, Abschnitt 1.3 Imperative Modelle
    -- Programm test_anw.vhd
    -- Bespielprogramm zur Definition und Nutzung einer str-Funktion
    -- letzte Aenderung: 21.03.2018
    -- Autor: G. Kemnitz
    
    -- Zum Ausprobieren
    -- ghdl -a test_anw.vhd
    -- ghdl -m test_anw
    -- ghdl -r test_anw
    
    library ieee;
    use ieee.std_logic_1164.all;
    
    entity test_anw is end entity;
    
    architecture a of test_anw is
    begin
    process
     variable a, b, c: std_logic;
    
     -- Textkonvertierung der 3 Variablenwerte
     function str(a: std_logic; b: std_logic; c: std_logic) return string is
     begin
      return " a=" & std_logic'image(a) &
             " b=" & std_logic'image(b) & 
             " c=" & std_logic'image(c);
     end function;
    
     begin -- hier folgen die zu testenden Anweisungen
       a:='1'; b:='X'; c := a and b;  -- Ausgabetext
       report(str(a, b, c));   -- a='1' b='X' c='X'
       a := '1'; b:='0'; c := a and b;
       report(str(a, b, c));   -- a='1' b='0' c='0'
       wait;
     end process;
    
    end architecture;
    
  • Signalzuweisungen und Warteanweisungen:
  • -- Foliensatz EDS-F2, Abschnitt 1.3 Imperative Modelle
    -- Programm test_wait.vhd
    -- Signalzuweisungen und Warteanweisungen
    -- letzte Aenderung: 21.03.2018
    -- Autor: G. Kemnitz
    
    -- Zum Ausprobieren
    -- ghdl -a test_wait.vhd
    -- ghdl -m test_wait
    -- ghdl -r test_wait
    
    
    entity test_wait is  end entity;
    
    architecture a of test_wait is
    
      signal n: natural;
    
    begin
     process
      function str(n: integer) return string is
      begin
       return " t=" & time'image(now) & 
              " n=" & integer'image(n);
      end function;
    
     begin
     Z1: n <= n+1 after 1 ns, n+2 after 2 ns;
                      report("A1:" & str(n));
      wait on n;      report("A2:" & str(n));
      wait on n;      report("A3:" & str(n));
      wait for 0.5 ns;report("A4:" & str(n));
     Z2: n <= n+2 after 1 ns, n+4 after 2 ns; 
                      report("A5:" & str(n));
      wait on n;      report("A6:" & str(n));
      wait on n;      report("A7:" & str(n));
    
      wait;
     end process;
    end architecture;
    
  • Simulation einer Beispielschaltung aus 3 Gattern mit Beobachterprozess:
  • -- Foliensatz EDS-F2, Abschnitt 1.4 Ereignisgesteuerte Simulation
    -- Datei: sim_3gb.vhd
    -- Simulation einer Schaltung aus 3 Gattern mit Beobachterprozess
    -- letzte Aenderung: 02.05.2018
    -- Autor: G. Kemnitz
    
    -- Zum Ausprobieren
    -- ghdl -a sim_3gb.vhd
    -- ghdl -m sim_3gb_wait
    -- ghdl -r sim_3gb_wait --wave=sim_3gb.ghw
    -- gtkwave sim_3gb.ghw sim_3gb.sav
    
    library ieee;
    use ieee.std_logic_1164.all;
    
    entity sim_3gb is  end entity;
    
    architecture a of sim_3gb is
    
     signal x1, x2, x3, x4, z1, z2, y: std_logic := '0';
    
    begin
     -- Schaltungsbeschreibung mit nebenlaeufigen Signalzuweisungen
     G1:z1<=x1 and x2 after 1 ns;
     G2:z2<=x3 and x4 after 1 ns;
     G3: y<=z1 or z2 after 2 ns;
    
     -- Prozess zur Bereitstellung der Eingabesignale
     Eingabe: process
     begin
      wait for 1 ns; x3<='1'; --  1 ns
      wait for 2 ns; x1<='1'; --  3 ns
                     x4<='1'; 
      wait for 2 ns; x2<='1'; --  5 ns
      wait for 3 ns; x3<='0'; --  8 ns
      wait for 2 ns; x2<='0'; -- 10 ns
      wait for 1 ns; x4<='0'; -- 11 ns
      wait for 1 ns; x1<='0'; -- 12 ns
      wait for 1 ns; x4<='1'; -- 13 ns
      wait for 1 ns; x2<='1'; -- 14 ns
                     x3<='1';
      wait for 1 ns; x1<='1'; -- 15 ns
      wait for 2 ns; x3<='0'; -- 17 ns
      wait for 2 ns; x2<='0'; -- 19 ns
      wait for 1 ns; x1<='0'; -- 20 ns
                     x4<='0';
      wait for 2 ns; x3<='1'; -- 22 ns
      wait; 
     end process;
    
     -- Prozess zur tabellarischen Protokollierung alle Signalaenderungen
     Beobachterprozess: process
      variable tmp: string(1 to 3);
      variable s: string(1 to 15) := "x=.... z=.. y=.";
     begin
      tmp := std_logic'image(x1); s( 6) := tmp(2);
      tmp := std_logic'image(x2); s( 5) := tmp(2);
      tmp := std_logic'image(x3); s( 4) := tmp(2);
      tmp := std_logic'image(x4); s( 3) := tmp(2);
      tmp := std_logic'image(z1); s(11) := tmp(2);
      tmp := std_logic'image(z2); s(10) := tmp(2);
      tmp := std_logic'image( y); s(15) := tmp(2);
      report(s);
      -- warte auf eine Signalaenderung
      wait on x1, x2, x3, x4, z1, z2, y;
     end process;
    
    end architecture;
    
    -- Textausgabe
    --@0ms: x=0000 z=00 y=0
    --@1ns: x=0100 z=00 y=0
    --@3ns: x=1101 z=00 y=0
    --@4ns: x=1101 z=10 y=0
    --@5ns: x=1111 z=10 y=0
    --@6ns: x=1111 z=11 y=1
    --@8ns: x=1011 z=11 y=1
    --@9ns: x=1011 z=01 y=1
    --@10ns: x=1001 z=01 y=1
    --@11ns: x=1001 z=00 y=1
    --@11ns: x=0001 z=00 y=1
    --@12ns: x=0000 z=00 y=1
    --@13ns: x=0000 z=00 y=0
    --@13ns: x=1000 z=00 y=0
    --@14ns: x=1110 z=00 y=0
    --@15ns: x=1110 z=10 y=0
    --@15ns: x=1111 z=10 y=0
    --@16ns: x=1111 z=11 y=0
    --@17ns: x=1111 z=11 y=1
    --@17ns: x=1011 z=11 y=1
    --@18ns: x=1011 z=10 y=1
    --@19ns: x=1001 z=01 y=1
    --@20ns: x=1001 z=00 y=1
    --@20ns: x=0000 z=00 y=1
    --@22ns: x=0000 z=00 y=0
    --@22ns: x=0100 z=00 y=0
    

Strukturbeschreibung

  • Funktionsbeschreibung eines UND-Gatters:
  • -- Foliensatz EDS-F2, Abschnitt 2 Strukturbeschreibung
    -- Datei: und2.vhd
    -- Simulationsmodell eines UND-Gatters mit 2 Eingaengen
    -- letzte Aenderung: 06.04.2016
    -- Autor: G. Kemnitz
    
    library ieee;
    use ieee.std_logic_1164.all;
    
    -- Schnittstellenvereinbarung
    entity und2 is
     generic (td: delay_length := 0 ns);
     port (a, b: in std_logic; 
           c: out std_logic);
    end entity;
    
    -- Beschreibung
    architecture mit_td of und2 is
    begin
      c <= a and b after td;
    end architecture;
    
  • Funktionsbeschreibung des ODER-Gatters:
  • -- Foliensatz EDS-F2, Abschnitt 2 Strukturbeschreibung
    -- Datei: oder2.vhd
    -- Simulationsmodell eines ODER-Gatters mit 2 Eingaengen
    -- letzte Aenderung: 06.04.2016
    -- Autor: G. Kemnitz
    
    library ieee;
    use ieee.std_logic_1164.all;
    
    -- Schnittstellenvereinbarung
    entity oder2 is
     generic (td: delay_length := 0 ns);
     port (a, b: in std_logic; 
           c: out std_logic);
    end entity;
    
    -- Beschreibung
    architecture mit_td of oder2 is
    begin
      c <= a or b after td;
    end architecture;
    
  • Strukturbeschreibung einer Schaltung aus drei Logikgattern:
  • -- Foliensatz EDS-F2, Abschnitt 2 Strukturbeschreibung
    -- Datei: g3s.vhd
    -- Strukturbeschreibung einer Schaltung aus drei Logikgattern
    -- letzte Aenderung: 06.04.2016
    -- Autor: G. Kemnitz
    
    library ieee;
    use ieee.std_logic_1164.all;
    
    -- Schnittstellenvereinbarung
    entity g3s is
     port (x1, x2, x3, x4: in std_logic; 
           y: out std_logic);
    end entity;
    
    architecture Struktur of g3s is
     -- Vereinbarung der internen Signale
     signal z1, z2: std_logic;
    begin
     -- Instanziierung und Verbindung der Gatter
    G1: entity work.und2(mit_td) 
     generic map (1 ns)              --positionsbasierte Zuordnung
     port map (x1, x2, z1);          --positionsbasierte Zuordnung
    
    G2: entity work.und2(mit_td) 
     generic map (td => 1 ns)        --namensbasierte Zuordnung
     port map (a=>x3, b=>x4, c=>z2); --namensbasierte Zuordnung
    
    G3: entity work.oder2(mit_td)
     generic map (td => 2 ns)        --namensbasierte Zuordnung
     port map (a=>z1, b=>z2, c=>y);  --namensbasierte Zuordnung
    end architecture;
    
  • Testrahmen für die Schaltung zuvor:
  • -- Foliensatz EDS-F2, Abschnitt 2 Strukturbeschreibung
    -- Datei: test_g3s.vhd
    -- Testrahmen fuer die Strukturbeschreibung einer Schaltung aus 
    -- drei Logikgattern
    -- letzte Aenderung: 06.04.2016
    -- Autor: G. Kemnitz
    
    -- Zum Ausprobieren
    -- ghdl -a und2.vhd
    -- ghdl -a oder2.vhd
    -- ghdl -a g3s.vhd
    -- ghdl -a test_g3s.vhd
    -- ghdl -m test_g3s
    -- ghdl -r test_g3s --wave=test_g3s.ghw
    -- gtkwave test_g3s.ghw test_g3s.sav
    
    library ieee;
    use ieee.std_logic_1164.all;
    
    entity test_g3s is  end entity;
    
    architecture a of test_g3s is
     signal e1,e2,e3,e4,a: std_logic:='0';
    begin
     -- Instanziierung des Testobjekts
     TObj: entity work.g3s(Struktur)    
      port map (x1=>e1, x2=>e2, x3=>e3,
                x4=>e4, y=>a);
     
    -- Prozess zur Bereitstellung der Eingabesignale
     Eingabe: process
     begin
      wait for 1 ns; e3<='1'; --  1 ns
      wait for 2 ns; e1<='1'; --  3 ns
                     e4<='1'; 
      wait for 2 ns; e2<='1'; --  5 ns
      wait for 3 ns; e3<='0'; --  8 ns
      wait for 2 ns; e2<='0'; -- 10 ns
      wait for 1 ns; e4<='0'; -- 11 ns
      wait for 1 ns; e1<='0'; -- 12 ns
      wait for 1 ns; e4<='1'; -- 13 ns
      wait for 1 ns; e2<='1'; -- 14 ns
                     e3<='1';
      wait for 1 ns; e1<='1'; -- 15 ns
      wait for 2 ns; e3<='0'; -- 17 ns
      wait for 2 ns; e2<='0'; -- 19 ns
      wait for 1 ns; e1<='0'; -- 20 ns
                     e4<='0';
      wait for 2 ns; e3<='1'; -- 22 ns
      wait; 
     end process;
    end architecture;
    


Autor: gkemnitz, Letzte Änderung: 26.11.2020 16:26:45


 TU Clausthal 2020  Impressum