jednoduch é obvody ve vhdl
DESCRIPTION
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 - PowerPoint PPT PresentationTRANSCRIPT
Jednoduché obvody ve VHDL
Převzato z materiálů kurzu INP 2003
INP 2
Příklad: Multiplexor (mpx8)
popis chovánímpx8
y
s(1)s(0)
s(2)
din
0
7
Př.: Když s=1 potom y=din(1)
INP 3
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 beginprocess (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í
knihovny
INP 4
Test bench pro mpx8(automatický test
komponenty)
mpx8
y
s1s0
s2
din
0
7
Generátortestu
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;
beginUUT : mpx8 port map (din => din, s => s, y => y); -- připojeníprocessbegin -- 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
Mpx8 strukturálně(mpx8s.vhd)
&
&
&
&
&
&
&
&
1
y
Din(1)s(0)ns(1)ns(2)
Din(2)ns(0)s(1)ns(2)
Din(7)s(0)s(1)s(2)
Din(3)s(0)s(1)ns(2)
Din(4)ns(0)ns(1)s(2)
Din(5)s(0)ns(1)s(2)
Din(6)ns(0)s(1)s(2)
Din(0)ns(0)ns(1)ns(2)
Potřebujeme:8 x 4vst. AND1 x 8vst. OR3 x invertorns(j) = not s(j)
a0out
a3out
a4out
a5out
a6out
a7out
a1out
a2out
INP 7
And4.vhdlibrary 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
Struktura VHDL kódu
library IEEE;
entity name is port ();end name;
architecture struc of name is
signal ns0 : std_logic;
component and4 port ();end component;
beginns2 <= not s(2);
aa0: and4port map ();
P0: process (a,b)beginend process;
P1: processbegin end process;end struc;
knihovny
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říkazya používat proměnné.
INP 10
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 isbegin 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;
Dekodér
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 selectLED<= "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érpro7-segmentovku
INP 12
Klopný obvod typu Dlibrary IEEE;use IEEE.std_logic_1164.all;
entity dffx isport (
CLK : in std_logic;RSTn : in std_logic;DATA : in std_logic;QOUT : out std_logic );
end dffx;
architecture behavr1 of dffx isbeginprocess (CLK,RSTn) begin
if (RSTn='0') then -- asynchronni resetQOUT <= '0';
elsif (CLK'event and CLK = '1') thenQOUT <= DATA;
end if;end process;end behavr1;
Asynchronníreset,aktivní při 0
D
CLK
QOUT
QRSTn
DATA
INP 13
Asynchronní reset u KO typu D
process (CLK, RESET)begin
if RESET=‘1' then --asynchronous RESET active HighDOUT <= '0';
elsif (CLK'event and CLK='1') then --CLK rising edgeDOUT <= DIN;
end if;end process;
CLK
RESET
DOUT
DIN=1
D
CLK
Q
QRESET
DIN DOUT
INP 14
Synchronní reset u KO typu Dprocess (CLK)beginif CLK'event and CLK='1' then --CLK rising edge
if RESET='1' then --synchronous RESET active HighDOUT <= '0';
elseDOUT <= DIN;
end if;end if;end process;
CLK
RESET
DOUT
DIN=1
INP 15
Klopný obvod JK
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;
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' thenDOUT <= "0000";
elsif CLK='1' and CLK'event thenif 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);
beginif CLK'event and CLK='1' then
REG := DIN & REG(3 downto 1);end if;DOUT <= REG(0);
end process;
INP 18
clk
D D D D D D D D D D
1
T=0; 21
T=1T=2T=9T=10
T=11T=12T=19T=20
Posuvný registr a vánoční stromeček
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;
CNT 0-7CLK
RESET
COUNT
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 napapíře a podle tohovytvořit VHDL popis.
Budeme potřebovat3x KO Da uvedené vodiče
INP 22
Cyklický čítač 0-7 (strukturní popis, část 2)
begin
ff0 : dffx -- KO D – nejnižší bit čítačeport map ( CLK => CLK, RSTn => RESET, DATA => D0, QOUT => Q0);
ff1 : dffx -- KO D – prostřední bit čítačeport map ( CLK => CLK, RSTn => RESET, DATA => D1, QOUT => Q1);
ff2 : dffx -- KO D – nejvyšší bit čítačeport map ( CLK => CLK, RSTn => RESET, DATA => D2, QOUT => Q2);
-- vytvoření vstupů KO podle schématuD0 <= 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čeend 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;
Tímto způsobem se obvykle popisují čítače ve VHDL.
INP 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');
elseCOUNT_INT := COUNT_INT + 1;
end if; else --count down
if COUNT_INT = “0000” then COUNT_INT := (others => '1');
elseCOUNT_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ředvolboupoč. stavu (LOAD)a s 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
CPUřadič
paměť
ready
RdWr
rst
clk
rd
wr
Klid/11
čtení/01zápis/10
Volba/11
0X0X
1X
1X1X
0X
X1X0
stav/rd,wr
Ready,RdWr
Význam:rst
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 stavsignal Rw: std_logic_vector(1 downto 0); -- pomocny signal (vystupy)
beginRdnt <= Rw(1); Wrnt <= Rw(0);
-- stavovy registClock: process (Clk)begin
if (clk'event and clk = '1') thenPresentState <= 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;
Klid/11
Volba/11
1X
0Xrst
zápis/10
0XX0
čtení/01
0X
1X
X1
1X
INP 31
Test benchentity 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;
beginUUT : RdWrMoo -- "instance" testovane jednotkyport map (ready => ready, RdWr => RdWr,Rst => Rst,Clk => Clk,Rdnt => rdnt,Wrnt => Wrnt);
processbegin 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;
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
kombinační logika
KO
KO
kombinační logika
výstupu
rd
wr
ready
RdWr
clkrst
stav/rd,wr
Ready,RdWr
stavový registr
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 konverzelibrary 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 typusignal RegArray: RegArrayType;
-- práce s polemRegArray(conv_integer(addr)) <= data32; -- zápisOut32 <= 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