Technische Grundlagen der Informatik Kapitel 3 Prof. Dr. Sorin A. Huss Fachbereich Informatik TU Darmstadt
Kapitel 3: Themen Hardware-Beschreibungssprachen Syntax von VHDL Simulation Synthese Testrahmen WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 2
Einleitung Hardware-Beschreibungssprachen Hardware Description Languages (HDL) Textuelle Beschreibung von Schaltungen möglich Auf verschiedenen Abstraktionsebenen Struktur (z.b. Verbindungen zwischen Gattern) Verhalten (z.b. Boolesche Gleichungen) Entwurfswerkzeuge führen die Beschreibungen aus (Simulation) und erzeugen Schaltungsstruktur mittels Verfahren zur Schaltungssynthese Schaltungssynthese Grob vergleichbar mit Übersetzung (Compilieren) von konventionellen Programmiersprachen Programme, die als Computer-Aided Design/Engineering (CAD/E) oder Electronic Design Automation (EDA) Werkzeuge bezeichnet werden WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 3
Einleitung Fast alle kommerziellen Hardware-Entwürfe wurden mit HDLs realisiert, der praktische Einsatz von HDLs ist Stand der Technik Zwei HDLs haben sich durchgesetzt Verilog VHDL Sie werden im Endeffekt wohl beide lernen müssen! Es gibt keinen klaren Gewinner, allerdings gibt es in Europa eine Präferenz für VHDL WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 4
Verilog 1984 von der Fa. Gateway Design Automation entwickelt Seit 1995 ein IEEE Standard (1364) Überarbeitet 2001 und 2005 Neuer Dialekt SystemVerilog (Obermenge von Verilog-2005) Weit verbreitet in zivilen US-Firmen In der Informatik der TU Darmstadt eingesetzt am FG Eingebettete Systeme und ihre Anwendungen (ESA, Prof. Koch) WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 5
VHDL Very High-Speed Integrated Circuit Hardware Description Language Entwickelt 1981 durch das US Verteidigungsministerium Inspiriert durch die konventionelle Programmiersprache Ada Standardisiert in 1987 durch IEEE (1076) Überarbeitet in 1993, 2000, 2002, 2006, 2008 Erweitert zur Beschreibung von ereignisdiskreten und zeitkontinuierlichen Systemen (VHDL-AMS), s. Vorlesung Modellierung heterogener Systeme Weit verbreitet in US-Rüstungsfirmen Vielen europäischen Firmen In der Informatik der TU Darmstadt eingesetzt am FG Integrierte Schaltungen und Systeme (ISS, Prof. Huss) WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 6
In dieser Iteration der Vorlesung In den Vorlesungen und Übungen VHDL Hier gezeigte Grundkonzepte sind in beiden Sprachen identisch Andere Syntax und auch Unterschiede im Detail VHDL-Beschreibung ist in der Regel länger, aber gut lesbar Im Begleitbuch werden beide Sprachen nebeneinander gezeigt S. Kapitel 4 Moderne Entwurfswerkzeuge können in der Regel beide Sprachen verarbeiten WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 7
Von einer HDL zu Logikgattern Simulation Eingangswerte werden in HDL-Beschreibung eingegeben Beschriebene Schaltung wird stimuliert Berechnete Ausgangswerte werden auf Korrektheit geprüft Fehlersuche viel einfacher und billiger als in realer Hardware Synthese Übersetzt HDL-Beschreibungen in Netzlisten, d. h. Strukturbeschreibungen Logikgatter (Schaltungselemente) Verbindungen (Verbindungsknoten) WICHTIG: Beim Verfassen von HDL-Beschreibungen ist es essentiell wichtig, immer die vom Programm beschriebene Hardware im Auge zu behalten! WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 8
VHDL-Module a b c VHDL Modul y Zwei Arten von Beschreibungen in Modulen: Verhalten: Was tut die Schaltung? Struktur: Wie ist die Schaltung aus Untermodulen aufgebaut? WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 9
Beispiel für Verhaltensbeschreibung VHDL: library IEEE; use IEEE.STD_LOGIC_1164.all; entity example is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); architecture synth of example is y <= ((not a) and (not b) and (not c)) or (a and (not b) and (not c)) or (a and (not b) and c); WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 10
Simulation von Verhaltensbeschreibungen Signalverlaufsdiagramm (waves) WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 11
Synthese von Verhaltensbeschreibungen Syntheseergebnis: b c un5_y y y a un8_y WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 12
VHDL Syntax Unterscheidet nicht Groß- und Kleinschreibung bei Identifiern Beispiel: reset und Reset sind das gleiche Signal Identifier müssen mit einem Buchstaben anfangen Beispiel: 2mux ist ein ungültiger Name Anzahl von Leerzeichen, Leerzeilen und Tabulatoren irrelevant Kommentare: -- bis zum Ende der Zeile WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 13
Strukturelle Beschreibung: Modulhierarchie library IEEE; use IEEE.STD_LOGIC_1164.all; entity and3gate is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); architecture synth of and3gate is y <= a and b and c; Nur eine entity pro Datei. Aber mehrere architectures pro entity möglich! library IEEE; use IEEE.STD_LOGIC_1164.all; entity invgate is port(a: in STD_LOGIC; y: out STD_LOGIC); architecture synth of invgate is y <= not a; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 14
Strukturelle Beschreibung: Modulhierarchie library IEEE; use IEEE.STD_LOGIC_1164.all; entity nand3gate is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); architecture struct of nand3gate is component and3gate port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); end component; component invgate port(a: in STD_LOGIC; y: out STD_LOGIC); end component; signal n1: STD_LOGIC; and3inst: and3gate port map(a => a, b => b, c => c, y => n1); invinst: invgate port map(a => n1, y => y); WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 15
Bitweise Verknüpfungsoperatoren library IEEE; use IEEE.STD_LOGIC_1164.all; entity gates is port(a, b: in STD_LOGIC_VECTOR(3 downto 0); y1, y2, y3, y4, y5: out STD_LOGIC_VECTOR(3 downto 0)); architecture synth of gates is -- Fünf unterschiedliche Logikgatter -- mit zwei Eingängen, -- jeweils 4 Bit breite Busse y1 <= a and b; y2 <= a or b; y3 <= a xor b; y4 <= a nand b; y5 <= a nor b; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 16
Reduktionsoperatoren library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_MISC.all; -- weitere Bibliothek entity and8 is port(a: in STD_LOGIC_VECTOR(7 downto 0); y: out STD_LOGIC); architecture synth of and8 is y <= AND_REDUCE(a); -- Funktionsaufruf -- Abkürzung für -- y <= a(7) and a(6) and a(5) and a(4) and -- a(3) and a(2) and a(1) and a(0); WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 17
Bedingte Zuweisung library IEEE; use IEEE.STD_LOGIC_1164.all; entity mux2 is port(d0, d1: in STD_LOGIC_VECTOR(3 downto 0); s: in STD_LOGIC; y: out STD_LOGIC_VECTOR(3 downto 0)); architecture synth of mux2 is y <= d0 when s = '0' else d1; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 18
Interne Verbindungsknoten oder Signale library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC; s, cout: out STD_LOGIC); architecture synth of fulladder is signal p, g: STD_LOGIC; -- interne Verbindungsknoten ( Drähte ) p <= a xor b; g <= a and b; g s s s <= p xor cin; cin cout <= g or (p and cin); a b p un1_cout cout cout WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 19
Bindung von Operatoren (Präzedenz) Höchste Bestimmt Ausführungsreihenfolge not NOT *, /, mod, rem Multiplikation, Division, Modulo, Remainder +, -, & Addition, Subtraktion, Konkatenation Niedrigste rol, ror, srl, sll, sra, sla =, /=, <, <=, >, >= and, or, nand, nor, xor Rotieren, Schieben (logisch), Schieben (arithmetisch) Vergleiche Logische Operatoren WICHTIG: Die logischen Operatoren haben gleiche Präzedenz. Es ist daher auf Klammerung zu achten! WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 20
Zahlen Syntax: 'wert' für STD_LOGIC ('0' oder '1') B"wert" für STD_LOGIC_VECTOR B = Basis (optional) Zahl Bitbreite Basis entspricht Dezimal Darstellung im Speicher '1' 1 binär 1 1 "101" 3 binär 5 101 B"101" 3 binär 5 101 X"AB" 8 hexadezimal 171 10101011 WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 21
Operationen auf Bit-Ebene: Beispiel 1 y <= c(2 downto 1) & d(0) & d(0) & d(0) & c(0) & "101"; -- wenn y ein 9-bit STD_LOGIC_VECTOR ist, hat die Anweisung diesen Effekt: y = c[2] c[1] d[0] d[0] d[0] c[0] 1 0 1 WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 22
Operationen auf Bit-Ebene: Beispiel 2 VHDL: Synthese: library IEEE; use IEEE.STD_LOGIC_1164.all; s s mux2 entity mux2_8 is port(d0, d1: in STD_LOGIC_VECTOR(7 downto 0); s: in STD_LOGIC; y: out STD_LOGIC_VECTOR(7 downto 0)); d0[7:0] d1[7:0] [7:0] [7:0] [3:0] [3:0] d0[3:0] y[3:0] d1[3:0] lsbmux [3:0] [7:0] y[7:0] architecture struct of mux2_8 is s component mux2 is [7:4] d0[3:0] port(d0, d1: in STD_LOGIC_VECTOR(3 downto 0); [7:4] s: in STD_LOGIC; d1[3:0] y[3:0] [7:4] y: out STD_LOGIC_VECTOR(3 downto 0)); msbmux end component; msbmux: mux2 port map(d0 => d0(7 downto 4), d1 => d1(7 downto 4), s => s, y => y(7 downto 4)); lsbmux: mux2 port map(d0 => d0(3 downto 0), d1 => d1(3 downto 0), s => s, y => y(3 downto 0)); mux2 WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 23
Hochohmiger Ausgang: Z VHDL: library IEEE; use IEEE.STD_LOGIC_1164.all; entity tristate is port(a: in STD_LOGIC_VECTOR(3 downto 0); en: in STD_LOGIC; y: out STD_LOGIC_VECTOR(3 downto 0)); architecture synth of tristate is y <= "ZZZZ" when en = '0' else a; Synthese: en a[3:0] [3:0] [3:0] [3:0] [3:0] y[3:0] y_1[3:0] WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 24
Verzögerungen library IEEE; use IEEE.STD_LOGIC_1164.all; entity example is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); Nur für die Simulation, after-ausdrücke werden für die Synthese ignoriert! architecture synth of example is signal ab, bb, cb, n1, n2, n3: STD_LOGIC; ab <= not a after 1 ns; bb <= not b after 1 ns; cb <= not c after 1 ns; n1 <= ab and bb and cb after 2 ns; n2 <= a and bb and cb after 2 ns; n3 <= a and bb and c after 2 ns; y <= n1 or n2 or n3 after 4 ns; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 25
Verzögerungen WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 26
Verzögerungen library IEEE; use IEEE.STD_LOGIC_1164.all; entity example is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); architecture synth of example is signal ab, bb, cb, n1, n2, n3: STD_LOGIC; ab <= not a after 1 ns; bb <= not b after 1 ns; cb <= not c after 1 ns; n1 <= ab and bb and cb after 2 ns; n2 <= a and bb and cb after 2 ns; n3 <= a and bb and c after 2 ns; y <= n1 or n2 or n3 after 4 ns; Nur für die Simulation, after-ausdrücke werden für die Synthese ignoriert! WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 27
Testrahmen HDL-Programm zum Testen eines anderen HDL-Moduls Im Hardware-Entwurf schon lange üblich seit einigen Jahren auch im Software-Bereich (JUnit etc.) Getestetes Modul Device under test (DUT), Unit under test (UUT) Testrahmen wird nicht synthetisiert Nur für Simulation benutzt Arten von Testrahmen Einfach: Legt nur feste Testdaten an und zeigt Ausgaben an Selbstprüfend: Prüft auch noch, ob Ausgaben den Erwartungen entsprechen Selbstprüfend mit Testvektoren: Auch noch mit variablen Testdaten WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 28
Beispiel Verfasse VHDL-Code, um die folgende Funktion in Hardware zu berechnen: y = bc + ab Der Modulname sei sillyfunction WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 29
Beispiel Verfasse VHDL-Code, um die folgende Funktion in Hardware zu berechnen: y = bc + ab Der Modulname sei sillyfunction VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity sillyfunction is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); architecture synth of sillyfunction is y <= (not b and not c) or (a and not b); WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 30
Einfacher Testrahmen für Beispiel library IEEE; use IEEE.STD_LOGIC_1164.all; entity testbench1 is -- kein Input/Output architecture sim of testbench1 is component sillyfunction is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); end component; signal a, b, c, y: STD_LOGIC; -- Instanz des zu testenden Moduls erzeugen dut: sillyfunction port map(a => a, b => b, c => c, y => y); -- Eingangswerte anlegen und warten process a <= '0'; b <= '0'; c <= '0'; wait for 10 ns; c <= '1'; wait for 10 ns; b <= '1'; c <= '0'; wait for 10 ns; c <= '1'; wait for 10 ns; a <= '1'; b <= '0'; c <= '0'; wait for 10 ns; c <= '1'; wait for 10 ns; b <= '1'; c <= '0'; wait for 10 ns; c <= '1'; wait for 10 ns; wait; -- wait forever end process; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 31
Selbstprüfender Testrahmen library IEEE; use IEEE.STD_LOGIC_1164.all; entity testbench2 is -- kein Input/Output architecture sim of testbench2 is component sillyfunction is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); end component; signal a, b, c, y: STD_LOGIC; -- Instanz des zu testenden Moduls erzeugen dut: sillyfunction port map( a => a, b => b, c => c, y => y); c <= '1'; wait for 10 ns; assert y = '0' report "001 fehlerhaft."; b <= '1'; c <= '0'; wait for 10 ns; assert y = '0' report "010 fehlerhaft."; c <= '1'; wait for 10 ns; assert y = '0' report "011 fehlerhaft."; a <= '1'; b <= '0'; c <= '0'; wait for 10 ns; assert y = '1' report "100 fehlerhaft."; c <= '1'; wait for 10 ns; assert y = '1' report "101 fehlerhaft."; b <= '1'; c <= '0'; wait for 10 ns; assert y = '0' report "110 fehlerhaft."; c <= '1'; wait for 10 ns; assert y = '0' report "111 fehlerhaft."; wait; -- wait forever end process; -- Eingangswerte anlegen und warten -- Ausgang mit erwartetem Wert überprüfen process a <= '0'; b <= '0'; c <= '0'; wait for 10 ns; assert y = '1' report "000 fehlerhaft."; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 32
Selbstprüfender Testrahmen mit Testvektoren Trennen von HDL-Programm und Testdaten Eingaben Erwartete Ausgaben Organisiere beides als Vektoren von zusammenhängenden Signalen/Werten Eigene Datei für Vektoren Dann HDL-Programm für universellen Testrahmen 1. Erzeuge Takt zum Anlegen von Eingabedaten/Auswerten von Ausgabedaten 2. Lese Vektordatei in VHDL Array 3. Lege Eingangsdaten an 4. Warte auf Ausgabedaten, werte Ausgabedaten aus 5. Vergleiche aktuelle mit erwarteten Ausgabedaten, melde Fehler bei Differenz 6. Noch weitere Testvektoren abzuarbeiten? WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 33
Selbstprüfender Testrahmen mit Testvektoren Im Testrahmen erzeugter Takt legt zeitlichen Ablauf fest Steigende Flanke: Eingabewerte aus Testvektor an Eingänge anlegen Fallende Flanke: Aktuelle Werte an Ausgängen lesen CLK Eingangswerte Ausgangswerte anlegen lesen Takt kann auch als Takt für sequentielle synchrone Schaltungen verwendet werden WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 34
Einfaches Textformat für Testvektordateien Datei: example.tv 000_1 001_0 010_0 011_0 100_1 101_1 110_0 111_0 Aufbau: Eingangsdaten _ erwartete Ausgangsdaten WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 35
Testrahmen: 1. Erzeuge Takt library IEEE; use IEEE.STD_LOGIC_1164.all; use STD.TEXTIO.all; entity testbench3 is -- kein Input/Output architecture sim of testbench3 is component sillyfunction is port(a, b, c: in STD_LOGIC; y: out STD_LOGIC); end component; signal a, b, c, y: STD_LOGIC; signal clk, reset: STD_LOGIC; signal yexpected: STD_LOGIC; constant MEMSIZE: integer := 10000; type tvarray is array (MEMSIZE downto 0) of STD_LOGIC_VECTOR(3 downto 0); signal testvectors: tvarray; -- Array für Testvektoren shared variable vectornum, errors: integer; -- Verwaltungsdaten -- Instanz des zu testenden Moduls erzeugen dut: sillyfunction port map(a => a, b => b, c => c, y => y); -- Takterzeugung process clk <= '1'; wait for 5 ns; clk <= '0'; wait for 5 ns; end process; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 36
2. Lese Testvektordatei in Array ein -- Zu Beginn der Simulation: -- Testdaten einlesen und einen Reset-Impuls erzeugen process is -- wird genau einmal ausgeführt file tv: TEXT; variable i, j: integer; variable L: line; variable ch: character; i := 0; FILE_OPEN(tv, "example.tv", READ_MODE); while not endfile(tv) loop readline(tv, L); for j in 0 to 3 loop read(l, ch); if (ch = '_') then read(l, ch); end if; if (ch = '0') then testvectors(i)(j) <= '0'; else testvectors(i)(j) <= '1'; end if; end loop; i := i + 1; end loop; vectornum := 0; errors := 0; -- Verwaltungsdaten initialisieren reset <= '1'; wait for 27 ns; reset <= '0'; -- Resetimpuls erzeugen wait; end process; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 37
3. Lege Testdaten an Eingänge an -- zur steigenden Taktflanke (genauer: kurz danach!) process (clk) if (clk'event and clk = '1') then a <= testvectors(vectornum)(0) after 1 ns; b <= testvectors(vectornum)(1) after 1 ns; c <= testvectors(vectornum)(2) after 1 ns; yexpected <= testvectors(vectornum)(3) after 1 ns; end if; end process; a,b,c sind Eingänge der DUT yexpected ist eine Hilfsvariable, die nun den erwarteten Ausgangswert dieses Vektors enthält. WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 38
4. Warte auf Ausgabedaten, lese Ausgabedaten 5. Vergleiche aktuelle Ausgaben mit erwarteten Werten -- warte auf fallende Flanke zum Lesen der Ausgabedaten der DUT process (clk) -- erst prüfen, nachdem Schaltung initialisiert if (clk'event and clk = '0' and reset = '0') then assert y = yexpected -- vergleiche aktuelle Ausgabe mit erwartetem Wert report "Fehler: y = " & STD_LOGIC'image(y); -- Fehlermeldung if (y /= yexpected) then errors := errors + 1; -- zähle Fehler end if; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 39
6. Sind noch weitere Testvektoren abzuarbeiten? -- Array-Index zum Zugriff auf nächsten Testvektor erhöhen vectornum := vectornum + 1; -- Ist der nächste schon ein ungültiger Testvektor? if (is_x(testvectors(vectornum))) then report integer'image(vectornum) & " Tests mit " & integer'image(errors) & " Fehler(n) bearbeitet." severity failure; -- Endmeldung ausgeben end if; end if; end process; Hinweis: Zum Vergleichen auf X muss die Funktion is_x() benutzt werden WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 40
VHDL Sprachkonstrukte in TGDI Vor Testrahmen alle für die Beschreibung von echter Hardware relevanten eingeführt Schaltungssynthese VHDL kann viel mehr Angedeutet beim Testrahmen (Dateioperationen, Ein/Ausgabe, ) Aber in der Regel nicht mehr in Hardware synthetisierbar Nicht Schwerpunkt dieser Veranstaltung Mehr Details zu HDLs in Kanonik Computer Microsystems Im Sommersemester In TGDI soll dieser Kurzüberblick reichen Bei akutem Bedarf werden noch weitere Konstrukte eingeführt WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 41
Weitere Anweisungen zur Verhaltensbeschreibung Dürfen nur innerhalb von Prozessen (process) benutzt werden if / else case WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 42
Kombinatorische Logik als Prozess library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder_blk is port(a, b, cin: in STD_LOGIC; s, cout: out STD_LOGIC); architecture synth of fulladder_blk is process (a, b, cin) -- Sensitivitätsliste variable p, g: STD_LOGIC; -- interne Variablen p := a xor b; -- blockierend g := a and b; -- blockierend s <= p xor cin; cout <= g or (p and cin); end process; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 43
Kombinatorische Logik mit with select library IEEE; use IEEE.STD_LOGIC_1164.all; entity sevenseg is port(data: in STD_LOGIC_VECTOR(3 downto 0); seg: out STD_LOGIC_VECTOR(6 downto 0)); architecture synth of sevenseg is with data select -- ABCDEFG seg <= 0110000" when X"1", --1 1101101" when X"2", --2 1111001" when X"3", --3 0110011" when X"4", --4 1011011" when X"5", --5 1011111" when X"6", --6 1110000" when X"7", --7 1111111" when X"8", --8 1111011" when X"9", --9 1110111" when X"A", --A 0011111" when X"B", --b 1001110" when X"C", --C 0111101" when X"D", --d 1001111" when X"E", --E 1000111" when X"F", --F 1111110" when others; --0 WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 44
Kombinatorische Logik mit case library IEEE; use IEEE.STD_LOGIC_1164.all; entity sevenseg_case is port(data: in STD_LOGIC_VECTOR(3 downto 0); seg: out STD_LOGIC_VECTOR(6 downto 0)); architecture synth of sevenseg_case is process (data) case (data) is -- ABCDEFG when X"1" => seg <= 0110000"; --1 when X"2" => seg <= "1101101"; --2 when X"3" => seg <= "1111001"; --3 when X"4" => seg <= "0110011"; --4 when X"5" => seg <= "1011011"; --5 when X"6" => seg <= "1011111"; --6 when X"7" => seg <= "1110000"; --7 when X"8" => seg <= "1111111"; --8 when X"9" => seg <= "1111011"; --9 when X"A" => seg <= "1110111"; --A when X"B" => seg <= "0011111"; --b when X"C" => seg <= "1001110"; --C when X"D" => seg <= "0111101"; --d when X"E" => seg <= "1001111"; --E when X"F" => seg <= "1000111"; --F when others => seg <= "1111110"; --0 end case; end process; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 45
Kombinatorische Logik mit case Um kombinatorische Logik zu beschreiben, muss ein case-ausdruck alle Möglichkeiten abdecken Entweder explizit angeben Oder einen Default-Fall (others) angeben Tritt in Kraft, wenn sonst keine andere Alternative passt Im Beispiel verwendet WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 46
Kombinatorische Logik mit case und don t care library IEEE; use IEEE.STD_LOGIC_1164.all; entity case_dc is port(a: in STD_LOGIC_VECTOR(3 downto 0); y: out STD_LOGIC_VECTOR(3 downto 0)); architecture synth of case_dc is process (a) case (a) is when "1---" => y <= "1000"; -- - = don't care when "01--" => y <= "0100"; when "001-" => y <= "0010"; when "0001" => y <= "0001"; when others => y <= "0000"; -- alle Fälle abgedeckt end case; end process; WS 10/11 Technische Grundlagen der Informatik - Kapitel 3 - Prof. Sorin A. Huss 47