1 / 35

Jednoduch é obvody ve VHDL

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

darrin
Download Presentation

Jednoduch é obvody ve VHDL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Jednoduché obvody ve VHDL Převzato z materiálů kurzu INP 2003

  2. 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

  3. 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

  4. Test bench pro mpx8(automatický test komponenty) 0 mpx8 din Generátor testu 7 s0 s1 s2 y INP

  5. 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

  6. 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

  7. 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

  8. mpx8s.vhd Vyzkoušejte si mpx8s.vhd v ModelSimu místo mpx8.vhd. Jako test bench použijte tb_mpx.vhd. INP

  9. 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

  10. 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

  11. -- 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. Cvičení • Popište a simulujte pomocí VHDL obvod pro řízení vánočního stromečku. INP

  20. 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

  21. 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

  22. 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

  23. Výsledek simulace INP

  24. Čí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.

  25. -- 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

  26. 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

  27. 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

  28. Ř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

  29. Ř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

  30. 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

  31. 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

  32. Časový průběh pro zvolené vstupy Test bench je k dispozici na webovské stránce cvičení. INP

  33. 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

  34. 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

  35. 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

More Related