370 likes | 552 Views
Jednoduch é obvody ve VHDL. Převzato z materiálů kurzu INP 2003. Příklad: Multiplexor (mpx8) popis chování. 0. mpx8. y. din. 7. s(0). s(1). Př.: Kdy ž s=1 potom y=din(1). s(2). knihovny. library IEEE; use IEEE.std_logic_1164.all; entity mpx8 is
E N D
Jednoduché obvody ve VHDL Převzato z materiálů kurzu INP 2003
Příklad: Multiplexor (mpx8)popis chování 0 mpx8 y din 7 s(0) s(1) Př.: Když s=1 potom y=din(1) s(2) INP
knihovny library IEEE; use IEEE.std_logic_1164.all; entity mpx8 is port (din: in STD_LOGIC_VECTOR (7 downto 0); s: in STD_LOGIC_VECTOR (2 downto 0); y: out STD_LOGIC); end mpx8; architecture mpx8 of mpx8 is begin process (s, din) variable ss: STD_LOGIC_VECTOR (2 downto 0); -- pomocná proměnná begin ss(0) := s(0); ss(1) := s(1); ss(2) := s(2); case ss is when "000" => y <= din(0); when "001" => y <= din(1); when "010" => y <= din(2); when "011" => y <= din(3); when "100" => y <= din(4); when "101" => y <= din(5); when "110" => y <= din(6); when "111" => y <= din(7); when others => y <= 'X'; end case; end process; end mpx8; rozhraní chování INP
Test bench pro mpx8(automatický test komponenty) 0 mpx8 din Generátor testu 7 s0 s1 s2 y INP
entity tb_mpx8 is -- nemá rozhraní end tb_mpx8; architecture arch_tb_mpx8 of tb_mpx8 is signal din: STD_LOGIC_VECTOR (7 downto 0); -- potřebné signály signal s: STD_LOGIC_VECTOR (2 downto 0); signal y: STD_LOGIC; component mpx8 -- testovaná jednotka port (din: in STD_LOGIC_VECTOR (7 downto 0); s: in STD_LOGIC_VECTOR (2 downto 0); y: out STD_LOGIC ); end component; begin UUT : mpx8 port map (din => din, s => s, y => y); -- připojení process begin -- vlastní test din <= "01010101"; s <= "000"; wait for 10 ns; s <= "001"; wait for 10 ns; s <= "010"; wait for 10 ns; s <= "011"; wait for 10 ns; s <= "100"; wait for 10 ns; s <= "101"; wait for 10 ns; s <= "110"; wait for 10 ns; s <= "111"; wait for 10 ns; end process; end arch_tb_mpx8; INP
Din(7) s(0) s(1) s(2) Din(0) ns(0) ns(1) ns(2) Din(6) ns(0) s(1) s(2) Din(5) s(0) ns(1) s(2) Din(4) ns(0) ns(1) s(2) Din(3) s(0) s(1) ns(2) Din(2) ns(0) s(1) ns(2) Din(1) s(0) ns(1) ns(2) Mpx8 strukturálně(mpx8s.vhd) a0out & a1out & a2out & 1 & a3out y a4out & a5out & Potřebujeme: 8 x 4vst. AND 1 x 8vst. OR 3 x invertor ns(j) = not s(j) a6out & a7out & INP
And4.vhd library IEEE; use IEEE.std_logic_1164.all; entity and4 is port ( a1: in std_logic; a2: in std_logic; a3: in std_logic; a4: in std_logic; b: out STD_LOGIC ); end and4; architecture and4 of and4 is begin b <= a1 and a2 and a3 and a4; end and4; INP
mpx8s.vhd Vyzkoušejte si mpx8s.vhd v ModelSimu místo mpx8.vhd. Jako test bench použijte tb_mpx.vhd. INP
knihovny library IEEE; entity name is port (); end name; architecture struc of name is signal ns0 : std_logic; component and4 port (); end component; begin ns2 <= not s(2); aa0: and4 port map (); P0: process (a,b) begin end process; P1: process begin end process; end struc; definice rozhraní popis činnosti komponenty Deklarace signálů pro propojování komponent a komunikaci procesů. Deklarace komponent. Zde jsou jen „paralelní příkazy“!!! mapování komponenty na signály Uvnitř procesu lze užít sekvenční příkazy a používat proměnné. Struktura VHDL kódu INP
Dekodér library IEEE; use IEEE.std_logic_1164.all; entity dec3to8 is port ( addr: in STD_LOGIC_VECTOR (2 downto 0); y: out STD_LOGIC_VECTOR (7 downto 0) ); end dec3to8; architecture dec3to8 of dec3to8 is begin with addr select y <= "10000000" when "111", "01000000" when "110", "00100000" when "101", "00010000" when "100", "00001000" when "011", "00000100" when "010", "00000010" when "001", "00000001" when others; end dec3to8; INP
-- HEX: in STD_LOGIC_VECTOR (3 downto 0); -- LED: out STD_LOGIC_VECTOR (6 downto 0); -- 0 -- --- -- 5 | | 1 -- --- <- 6 -- 4 | | 2 -- --- -- 3 with HEX select LED<= "1111001" when "0001", --1 "0100100" when "0010", --2 "0110000" when "0011", --3 "0011001" when "0100", --4 "0010010" when "0101", --5 "0000010" when "0110", --6 "1111000" when "0111", --7 "0000000" when "1000", --8 "0010000" when "1001", --9 "0001000" when "1010", --A "0000011" when "1011", --b "1000110" when "1100", --C "0100001" when "1101", --d "0000110" when "1110", --E "0001110" when "1111", --F "1000000" when others; --0 Dekodér pro 7-segmentovku INP
Klopný obvod typu D library IEEE; use IEEE.std_logic_1164.all; entity dffx is port ( CLK : in std_logic; RSTn : in std_logic; DATA : in std_logic; QOUT : out std_logic ); end dffx; architecture behavr1 of dffx is begin process (CLK,RSTn) begin if (RSTn='0') then -- asynchronni reset QOUT <= '0'; elsif (CLK'event and CLK = '1') then QOUT <= DATA; end if; end process; end behavr1; DATA QOUT D CLK Q RSTn Asynchronní reset, aktivní při 0 INP
Asynchronní reset u KO typu D process (CLK, RESET) begin if RESET=‘1' then --asynchronous RESET active High DOUT <= '0'; elsif (CLK'event and CLK='1') then --CLK rising edge DOUT <= DIN; end if; end process; DIN=1 CLK DIN RESET DOUT D Q CLK DOUT Q RESET INP
Synchronní reset u KO typu D process (CLK) begin if CLK'event and CLK='1' then --CLK rising edge if RESET='1' then --synchronous RESET active High DOUT <= '0'; else DOUT <= DIN; end if; end if; end process; DIN=1 CLK RESET DOUT INP
entity JKFF is port ( CLK, RSTn, J, K : in bit; Q : out bit); end JKFF; ------------------------------------------------- architecture RTL of JKFF is signal FF : bit; begin process (CLK, RSTn) variable JK : bit_vector(1 downto 0); begin if (RSTn = '0') then FF <= '0'; elsif (CLK'event and CLK = '1') then JK := J & K; case JK is when "01" => FF <= '0'; when "10" => FF <= '1'; when "11" => FF <= not FF; when "00" => FF <= FF; end case; end if; end process; Q <= FF; end RTL; Klopný obvod JK INP
Registr s asynchronním nulováním -- 4-bit parallel load register with asynchronous reset -- CLK: in STD_LOGIC; -- ASYNC: in STD_LOGIC; -- LOAD: in STD_LOGIC; -- DIN: in STD_LOGIC_VECTOR(3 downto 0); -- DOUT: out STD_LOGIC_VECTOR(3 downto 0); process (CLK, ASYNC) begin if ASYNC='1' then DOUT <= "0000"; elsif CLK='1' and CLK'event then if LOAD='1' then DOUT <= DIN; end if; end if; end process; INP
Posuvný registr -- 4-bit serial-in and serial-out shift register -- CLK: in STD_LOGIC; -- DIN: in STD_LOGIC; -- DOUT: out STD_LOGIC; process (CLK) variable REG: STD_LOGIC_VECTOR(3 downto 0); begin if CLK'event and CLK='1' then REG := DIN & REG(3 downto 1); end if; DOUT <= REG(0); end process; INP
T=0; 21 D D D D D D D D D D T=1 T=2 T=9 T=10 T=11 T=12 T=19 T=20 Posuvný registr a vánoční stromeček clk 1 INP
Cvičení • Popište a simulujte pomocí VHDL obvod pro řízení vánočního stromečku. INP
Cyklický čítač 0-7(toto rozhraní je stejné pro strukturní i behaviorální popis) library IEEE; use IEEE.std_logic_1164.all; entity cnt07 is port ( CLK: in STD_LOGIC; RESET: in STD_LOGIC; COUNT: out STD_LOGIC_VECTOR (2 downto 0) ); end cnt07; COUNT CNT 0-7 CLK RESET INP
Cyklický čítač 0-7 (strukturní popis, část 1) architecture struct of cnt07 is component dffx port ( CLK : in std_logic; RSTn : in std_logic; DATA : in std_logic; QOUT : out std_logic ); end component; signal Q0 : std_logic; -- vystup Q KO D signal Q1: std_logic; -- vystup Q KO D signal Q2: std_logic; -- vystup Q KO D signal D0 : std_logic; -- vstup D KO D signal D1: std_logic; -- vstup D KO D signal D2: std_logic; -- vstup D KO D Strukturní popis není v tomto případě výhodné použít, protože musíme udělat nejdříve návrh na papíře a podle toho vytvořit VHDL popis. Budeme potřebovat 3x KO D a uvedené vodiče INP
Cyklický čítač 0-7 (strukturní popis, část 2) begin ff0 : dffx -- KO D – nejnižší bit čítače port map ( CLK => CLK, RSTn => RESET, DATA => D0, QOUT => Q0 ); ff1 : dffx -- KO D – prostřední bit čítače port map ( CLK => CLK, RSTn => RESET, DATA => D1, QOUT => Q1 ); ff2 : dffx -- KO D – nejvyšší bit čítače port map ( CLK => CLK, RSTn => RESET, DATA => D2, QOUT => Q2 ); -- vytvoření vstupů KO podle schématu D0 <= not Q0; D1 <= Q0 xor Q1; D2 <= (not Q0 and Q2) or (not Q1 and Q2) or (Q0 and Q1 and not Q2); COUNT <= Q2 & Q1 & Q0; -- výstupy KO jsou připojeny na výstup čítače end struct; INP
Čítač 0-7 (behaviorální popis) architecture beh of cnt07 is begin process (CLK, RESET) variable COUNT_INT: STD_LOGIC_VECTOR(2 downto 0); begin if RESET = '0' then COUNT_INT := "000"; elsif CLK='1' and CLK'event then if COUNT_INT = "111" then COUNT_INT := "000"; else COUNT_INT := COUNT_INT + 1; end if; end if; COUNT <= COUNT_INT; end process; end beh; INP Tímto způsobem se obvykle popisují čítače ve VHDL.
-- LOAD: in STD_LOGIC; DIR: in STD_LOGIC; -- DIN: in STD_LOGIC_VECTOR (3 downto 0); -- COUNT: out STD_LOGIC_VECTOR (3 downto 0) process (CLK, RESET) variable COUNT_INT: STD_LOGIC_VECTOR(3 downto 0); begin if RESET = '1' then COUNT_INT := (others => '0'); elsif CLK='1' and CLK'event then if LOAD = '1' then COUNT_INT := DIN; else if CE = '1' then if DIR = '1' then --count up if COUNT_INT = “1111” then COUNT_INT := (others => '0'); else COUNT_INT := COUNT_INT + 1; end if; else --count down if COUNT_INT = “0000” then COUNT_INT := (others => '1'); else COUNT_INT := COUNT_INT - 1; end if; end if; end if; end if; end if; COUNT <= COUNT_INT; end process; Obousměrný (DIR) synchronní čítač s předvolbou poč. stavu (LOAD) as povolením činnosti (CE) INP
Cvičení • Popište a simulujte pomocí VHDL obvod, který bude generovat cyklicky čísla 0 – F na sedmisegmentovce. Nápověda: použijte čítač a dekodér. INP
Příklad: Řadič paměti • Navrhněte a ve VHDL simulujte řadič paměti, který pracuje podle zadaného automatu. Napište test bench, kterým ověříte jeho funkci. INP
Řadič paměti ready rd CPU řadič paměť RdWr wr rst clk 0X rst Význam: 1X 0X Ready,RdWr Klid/11 0X 1X čtení/01 stav/rd,wr 1X zápis/10 X0 X1 Volba/11 INP
Řadič paměti entity RdWrMoo is port (ready, RdWr, Rst, Clk : in std_logic; Rdnt, Wrnt : out std_logic ); end RdWrMoo; architecture beh of RdWrMoo is type StateType is (Klid, Volba, Zapis, Cteni); signal PresentState, NextState : StateType; -- soucasny a pristi stav signal Rw: std_logic_vector(1 downto 0); -- pomocny signal (vystupy) begin Rdnt <= Rw(1); Wrnt <= Rw(0); -- stavovy regist Clock: process (Clk) begin if (clk'event and clk = '1') then PresentState <= NextState; end if; end process Clock; INP
Comb: process (PresentState, Ready, RdWr, Rst) begin case PresentState is when Klid => Rw <="11"; if Ready = '1' then NextState <= Volba; else NextState <= Klid; end if; when Volba => Rw <= "11"; if RdWr = '1' then NextState <= Cteni; else NextState <= Zapis; end if; when Zapis => Rw <= "10"; if Ready = '1' then NextState <= Klid; else NextState <= Zapis; end if; when Cteni => Rw <="01"; if Ready = '1' then NextState <= Klid; else NextState <= Cteni; end if; end case; if Rst = '1' then NextState <= Klid; end if; end process Comb; end beh; 0X rst Klid/11 1X 1X 1X Volba/11 0X X1 X0 zápis/10 0X čtení/01 INP
entity tb_radic is end tb_radic; architecture beh of tb_radic is signal ready, RdWr, Rst, Clk : std_logic; signal Rdnt, Wrnt : std_logic; component RdWrMoo port (ready,RdWr,Rst,Clk : in std_logic; Rdnt,Wrnt : out std_logic );end component; begin UUT : RdWrMoo -- "instance" testovane jednotky port map (ready => ready,RdWr => RdWr, Rst => Rst,Clk => Clk,Rdnt => rdnt,Wrnt => Wrnt); process begin Rst <= '1'; Ready <= '0'; RdWr <= '0'; clk <= '0'; wait for 5 ns; Rst <= '0'; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 7 ns; Ready <= '1'; wait for 3 ns; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; Ready <= '0'; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; Ready <= '1'; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; RdWr <= '1'; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; clk <= '1'; wait for 10 ns; clk <= '0'; wait for 10 ns; end process;end beh; Test bench INP
Časový průběh pro zvolené vstupy Test bench je k dispozici na webovské stránce cvičení. INP
Vytvořený obvod stavový registr ready kombinační logika KO kombinační logika výstupu rd RdWr KO wr clk rst Ready,RdWr stav/rd,wr INP
K zadání projektu č. 1 • Zadání: viz www kurzu, upozornění • Př. Práce s polem (pamětí, registry) 16 x 32b -- knihovny pro konverze library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; signal data32, out32: std_logic_vector (31 downto 0); signal addr: std_logic_vector (3 downto 0); -- nový typ: pole registrů type RegArrayType is array (15 downto 0) of std_logic_vector(31 downto 0); -- instance proměnné tohoto typu signal RegArray: RegArrayType; -- práce s polem RegArray(conv_integer(addr)) <= data32; -- zápis Out32 <= RegArray(conv_integer(addr)); -- čtení INP
Literatura • Kolouch, J.: Programovatelné logické obvody a modelování číslicových systémů v jazycích ABEL a VHDL. Skriptum VUT v Brně, 2000. • Plíva, Z., Kolář, M.: Přednášky předmětu Elektronická zařízení. TU Liberec, 2002 • Chang, K. C.: Digital Design and Modeling with VHDL and Synthesis. IEEE Computer Society, Los Alamitos 1997 • Chang, K. C.: Digital Systems Design with VHDL and Synthesis: An Integrated Approach. IEEE Computer Society, Los Alamitos and John Wiley 1999 • Internet: viz odkazy na domovské stránce kurzu INP