1
VHDL-Synthese digitaler SystemeLösungen zu den Übungsaufgaben
Aufgabe 1
-- Aufgabe 1-- 8 zu 1 Decoder
entity DECODER1X8 isport( S: in bit_vector(2 downto 0); Y: out bit_vector(7 downto 0));
end DECODER1X8;
architecture VERHALTEN of DECODER1X8 isbegin
with S selectY <= "00000001" when "000", "00000010" when "001", "00000100" when "010", "00001000" when "011", "00010000" when "100", "00100000" when "101", "01000000" when "110", "10000000" when "111";
end VERHALTEN;
Aufgabe 2
-- Aufgabe 2-- Kombinatorische Logik
entity LOGIK isport( E1, E2, E3: in bit; Y1, Y2: out bit);
end LOGIK;
architecture VERHALTEN of LOGIK isbegin
Y1 <= (E1 and E2) or E3;Y2 <= (E1 or E2) and E3;
end VERHALTEN;
Aufgabe 3
-- Aufgabe 3-- programmierbare kombinatorische Logik-- Wird mit der DIO-Lib als Antivalenzgatter synthetisiert
entity LOGIK1 isport( E, S: in bit; Y: out bit);
end LOGIK1;
architecture VERHALTEN of LOGIK1 isbegin
with S selectY <= E when '0', not E when '1';
end VERHALTEN;
2
Aufgabe 4
-- Aufgabe 4-- Halbsubtrahierer mit Wahrheitstabelle
-- B A I Y COUT---------I--------- 0 0 I 0 0-- 0 1 I 1 0-- 1 0 I 1 1-- 1 1 I 0 0-----------------entity HALBSUB is
port( B, A: in bit; Y, Dieser_Bezeichner_ist_lang_aber_ist_er_auch_gueltig: out bit);
end HALBSUB;
architecture TABELLE of HALBSUB issignal TEMP_IN, TEMP_OUT: bit_vector(1 downto 0); -- Temp-Signalbegin
TEMP_IN <= B & A; -- Temporaere EingangsvarY <= TEMP_OUT(1); -- AusgangsvarDieser_Bezeichner_ist_lang_aber_ist_er_auch_gueltig <= TEMP_OUT(0);
-- Ausgangsvarwith TEMP_IN selectTEMP_OUT <= "00" when "00", "10" when "01", "11" when "10", "00" when "11";
end TABELLE;
Aufgabe 5Welche der folgenden VHDL-Bezeichner sind korrekt?
a) Hilfe Korrektb) help Korrektc) 2ter_Versuch Falsch: Ziffer am Anfangd) Case Falsch: VHDL Schlüsselworte) Zweiter_Versuch Korrektf) Dieser_Bezeichner_ist_lang_aber_ist_er_auch_gueltig Korrekt, wird aber bei der Synthese abgeschnitten
Aufgabe 6Die Sprache VHDL verlangt, daß alle Bezeichner innerhalb einerEntwurfseinheit unterschiedlich sind. Für welche der folgendenBezeichnerpaare trifft dies nicht zu?
a) Mein_Name , MeinName Korrektb) nummer , NUMMER Nicht unterschiedlichc) Nummer , Nummern Korrektd) two , too Korrekt
3
Aufgabe 7Welche der folgenden Bit-String Größen sind korrekt? Bestimmen Sie bei jedemgültigen Bit-String dessen Länge und dezimalen Wert.
a) B"1010_0101_1001" Länge: 12, Wert: C59\h=3161b) B"1001-0011" Falsch: Enthält Minuszeichenc) b"1111_000" Länge 7, Wert: 78\h = 120d) "11110000" Länge 8, Wert: F0\h = 240e) x"B5_CD" Länge 16 Wert: B5CD\h = 46541f) X"3HA4" Falsch: Enthält Zeichen "H"g) o"123" Länge 9, Wert: 53\h = 83h) O"123_678" Falsch: Zeichen "8" ist keine erlaubte
Oktalzahl
Aufgabe 8
-- Aufgabe 8-- Look-Up
entity LUT isport( S: in bit_vector(1 downto 0); A, B: in bit; Y: out bit);
end LUT;
architecture VERHALTEN of LUT isbegin
Y <= A and B when S="00"else A or B when S="01"else A nand B when S="10"else A nor B;
end VERHALTEN;
Aufgabe 9
-- Aufgabe 9-- Code Umsetzer in den Aiken Code
library ieee;use ieee.std_logic_1164.all;
entity AIKEN isport( E: in std_ulogic_vector(3 downto 0); Y: out std_ulogic_vector(3 downto 0));
end AIKEN;
architecture VERHALTEN of AIKEN isbegin
with E selectY <= x"0" when x"0",
x"1" when x"1",x"2" when x"2",x"3" when x"3",x"4" when x"4","1011" when x"5","1100" when x"6","1101" when x"7","1110" when x"8","1111" when x"9","----" when others;
end VERHALTEN;
4
Aufgabe 10
-- Aufgabe 10-- Tristate Logik
library ieee;use ieee.std_logic_1164.all;
entity TS_LOGIK isport( EN, A, B, C : in bit; Y : out std_ulogic);
end TS_LOGIK;
architecture VERHALTEN of TS_LOGIK isbegin
with EN selectY <= to_stdulogic(( A and B and C) or (A or B or not C)) when '0', 'Z' when '1';
end VERHALTEN;
Die Synthese mit der Viewlogic-Bibliothek DIO (DataIO) erfordert drei Gattersowie einen Tri-State-Treiber
Aufgabe 11
-- Aufgabe 11-- Betragsbildung einer 5-Bit-Zahl
entity BETRAG isport( E: in integer range -16 to 15; Y: out natural range 0 to 15);
end BETRAG;
architecture VERHALTEN of BETRAG isbegin
Y <= abs(E);end VERHALTEN;
Syntheseergebnisse:Viewlogic (DIO) synthetisiert einen 5-Bit Subtrahierer sowie 16 diskreteGatter mit jeweils 2 Eingängen.
PeakVHDL synthetisiert eine UND-ODER Logik: mit drei internen Signalenals ODER-Verknüpfungen der Eingangsbits sowie 8 weiteren Produkttermen(davon zwei als Antivalenzgatter).
5
Aufgabe 12
-- Aufgabe 12-- Multiplikation zweier 3 Bit integer Zahlen
entity MULT isport( A, B: in natural range 0 to 7; Y: out natural range 0 to 49);
end MULT;
architecture ALGO of MULT isbegin
Y <= A * B;end ALGO;
Syntheseergebnisse:Viewlogic inferriert einen 3x3 Bit Multiplizierer Funktionsblock
PeakVHDL generiert ebenfalls ein 3x3 Multiplizierer Schaltnetz
Aufgabe 13
-- Aufgabe 13-- 3-Bit Addierer mit Carry Lookahead Generator-- vgl. z.B. P.Pernards, Digitaltechnik, Huethig Verlag
entity CARRYLOOK isport( A, B: in bit_vector(2 downto 0); CI: in bit; SUM: out bit_vector(3 downto 0));
end CARRYL0OK;
architecture STRUKTUR of CARRYLOOK issignal C, G, P: bit_vector(2 downto 0); -- Lokale Signalebegin
G <= A and B after 10 ns; -- Generate VektorP <= A xor B after 10 ns; -- Propagate VektorC(0) <= G(0) or (P(0) and CI) after 10 ns; -- Carry LookaheadC(1) <= G(1) or (P(1) and G(0))
or (P(1) and (P(0) and CI) after 10 ns;C(2) <= G(2) or (P(2) and G(1)) or (P(2) and P(1) and G(0))
or (P(2) and (P(1) and P(0) and CI) after 10 ns;SUM(0) <= P(0) xor CI after 10 ns; -- SummationSUM(1) <= P(1) xor C(0) after 10 ns; -- mit Carry LookaheadSUM(2) <= P(2) xor C(1) after 10 ns; -- SignalenSUM(3) <= C(2); -- Carry Out
end STRUKTUR;
Das Simulationsergebnis zeigt bei der Summation 1 + 7 die typischeEigenschaft des Addierers mit Lookahead Struktur: Die Carry-Signale C2, Clund CO werden gleichzeitig erzeugt, wenn die Generate- und Propagate-SignaleG und P zur Verfügung stehen.
6
Aufgabe 14a) 199 Korrektb) 8#AFFE# Falsch, da HEX-Konstanten bei oktaler Basisc) 2#1011_1010# Korrektd) 16#ABCD# Korrekte) 5#224_33# Korrekt
Aufgabe 15
-- Aufgabe 15-- 4-Bit ALU mit unsigned Datentyp
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all; -- Viewlogic / Synopsys-- use ieee.numeric_std.all; -- IEEE1O76.3/ PeakVHDL
entity ALU isport( A, B: in unsigned (3 downto 0); -- 4-Bit Operanden OPCODE: in bit_vector(1 downto 0); -- 2-Bit OPCODE RESULT: out unsigned (3 downto 0); -- 4-Bit Ergebnis CFLAG, ZFLAG: out std_logic); -- Carry/Zero Flag
end ALU;
architecture ALGO of ALU issignal TEMP_RESULT, TEMPA, TEMPB: unsigned (4 downto 0);-- 5-Bit Temp Sig.signal TEMPA1, TEMPB1: std_logic_vector(4 downto 0); -- 5-Bit std_logicbegin
TEMPA <= '0'&A;TEMPB <= '0'&B;TEMPA1 <= std_logic_vector(TEMPA);TEMPB1 <= std_logic_vector(TEMPB);TEMP_RESULT <= TEMPA + TEMPB when OPCODE="00" else
TEMPA – TEMPB when OPCODE="01" elseunsigned(TEMPA1 or TEMPB1)
when OPCODE="10" elseunsigned(TEMPA1 and TEMPB1);
RESULT <= unsigned(TEMP_RESULT(3 downto 0));CFLAG <= '1' when ((TEMP_RESULT(4)='1') and OPCODE="00") or
((B>A) and OPCODE="01") else'0';
ZFLAG <= '1' when TEMP_RESULT=0 else '0';end ALGO;
7
Aufgabe 16Der Prozess wird aktiviert sofern sich eins der Eingangssignale ändert. Eswerden zunächst alle Signale hochohmig gesetzt. In einer doppelten if-Schleife wird zunächst das Freigabesignal abgefragt. Wenn dieses aktiv ist,so wird der zum Wert des Signals SEL gehörige Ausgang mit dem Eingang DINverbunden und somit der Z-Wert überschrieben.
-- Aufgabe 16-- 1 zu 4 Demultiplexer
library ieee;use ieee.std_logic_1164.all;
entity DEMUX isport( DIN, EN: in std_ulogic; SEL: in bit_vector(1 downto 0); DOUT0, DOUT1, DOUT2, DOUT3: out std_ulogic);
end DEMUX;
architecture VERHALTEN of DEMUX isbeginP1: process(SEL, DIN, EN)
beginDOUT0<='Z'; DOUT1<='Z'; DOUT2<='Z'; DOUT3<='Z';-- Alle Zif EN = '0' then -- Nur falls Enable
if SEL = "00" then -- jeweiligenDOUT0 <= DIN; -- Ausgang
elsif SEL = "01" then -- durchschaltenDOUT1 <= DIN;
elsif SEL = "10" thenDOUT2 <= DIN;
elseDOUT3 <= DIN;
end if;end if;
end process P1;end VERHALTEN;
8
Aufgabe 17
-- Aufgabe 17-- 4-Bit Schieberegister mit Parallelausgang
entity SREG4BIT isport( DIN, CLK, RESET: in bit; DOUT: buffer bit_vector(3 downto 0));
end SREG4BIT;
architecture VERHALTEN of SREG4BIT isbeginP1: process(CLK, RESET)
beginif RESET='1' then
DOUT <="0000"; -- Loeschenelsif CLK='1' and CLK'event then -- Schieben
DOUT(3) <= DOUT(2);DOUT(2) <= DOUT(1);DOUT(1) <= DOUT(0);DOUT(0) <= DIN;
end if;end process P1;
end VERHALTEN;
Aufgabe 18
-- Aufgabe 18-- 4-Bit Vorwärts-Rückwärtszähler
entity VRZLR4B isgeneric( N: natural:=4);port( CLK, RESET, UND: in bit; Q: buffer integer range 0 to 2**N-1);
end VRZLR4B;
architecture VERHALTEN of VRZLR4B isbeginP1: process(CLK, RESET)
beginif RESET='1' then -- Asynchron
Q <= 0; -- Loeschenelsif CLK='1' and CLK'event then -- Synchron zaehlen
if UND ='1' thenQ <= (Q+1) mod 2**N; -- Aufwaerts
elseQ <= (Q-1) mod 2**N; -- Abwaerts
end if;end if;
end process P1;end VERHALTEN;
Durch Verlagerung der RESET Abfrage in den durch elsif CLK='1' and CLK'eventgekennzeichneten Zweig wird aus dem asynchronen RESET ein synchroner RESET.
9
Aufgabe 19
-- Aufgabe 19-- programmierbarer Taktteiler ( max 5 Bit)
entity TEILER isport( CLK: in bit; N: in integer range 0 to 31; TC: out bit);
end TEILER;
architecture VERHALTEN of TEILER isbeginZLR: process (CLK)
variable QVAR: integer range 0 to 31;begin
if CLK='1' and CLK'event then -- Synchron zaehlenQVAR := QVAR + 1;if QVAR = N then -- Endwert pruefen
TC <= '1'; -- Terminal Count SetzenQVAR := 0; -- Zaehler Loesechen
elseTC <= '0'; -- Terminal Count zuruecksetzen
end if;end if;
end process ZLR;end VERHALTEN;
Aufgabe 20
-- Aufgabe 20-- Ladbarer N-Bit Zaehler mit Freigabeeingang
entity LD_ZLR isgeneric( N: natural:=4);port( CLK, ENABLE, RESET, LOAD: in bit;LOAD_VAL: in integer range 0 to 2*N-1;Q: buffer integer range 0 to 2**N-1);
end LD_ZLR;
architecture VERHALTEN of LD_ZLR isbeginP1: process(CLK, RESET)
beginif RESET='1' then -- Asynchron
Q <= 0; -- Loeschenelsif CLK='1' and CLK'event then -- Synchron
if ENABLE ='1' then -- Nur bei Freigabeif LOAD ='1' then
Q <= LOAD_VAL; -- Ladenelse
Q <= (Q+1) mod 2**N; -- Zaehlenend if;
end if;end if;
end process P1;end VERHALTEN;
10
Aufgabe 21
-- Aufgabe 21-- 1 zu 4 Demultiplexer mit case-Anweisung
library ieee;use ieee.std_logic_1164.all;
entity DEMUX isport( DIN, EN: in std_ulogic; SEL: in bit_vector(1 downto 0); DOUT0, DOUT1, DOUT2, DOUT3: out std_ulogic);
end DEMUX;
architecture VERHALTEN of DEMUX isbeginP1: process(SEL, DIN, EN)
beginDOUT0<='Z'; DOUT1<='Z'; DOUT2<='Z'; DOUT3<='Z'; -- Alle Z
if EN='1' thencase SEL is
when "00" => DOUT0 <= DIN;when "01" => DOUT1 <= DIN;when "10" => DOUT2 <= DIN;when "11" => DOUT3 <= DIN;
end case;end if;
end process P1;end VERHALTEN;
11
Aufgabe 22
-- Aufgabe 22-- Paritaetschecker fuer gerade Paritaet
library ieee;use ieee.std_logic 1164.all;
entity PAR_CHECK isgeneric( N : integer :=4);port( D: in bit_vector(N downto 0); OK: out bit);
end PAR_CHECK;
architecture VERHALTEN of PAR_CHECK issignal GERADE: bit;beginPARGEN: process( D )
variable PAR: boolean; begin
PAR:= false; -- Var. initialisierenfor I in N-1 downto 0 loop -- Alle Bits ausser MSB
if D(I) = '1' then -- Falls '1'PAR := not PAR; -- Toggeln
end if;end loop;if ((PAR and D(N) = '1') or
(not PAR and D(N) = '0')) -- Mit MSB vergleichenthen OK <= '1';else OK <= '0';
end if;end process PARGEN;
end VERHALTEN;