Příklady popisu základních obvodů ve VHDL INP - cvičení 2 Michal Bidlo, 2008 bidlom@fit.vutbr.cz
entity Circuit is port ( -- rozhraní obvodu ); end Circuit; Proces architecture Behavioral of Circuit is proces1: process(seznam citlivých signálů) -- zde je možné deklarovat proměnné -- tělo procesu (sekvenční příkazy) -- if-then-elsif-else -- cykly, -- přiřazení signálů proces2: process(sensitivity list) -- deklarace proměnných -- tělo procesu2... end Behavioral; Základní prostředek behaviorálního popisu Každý proces ve VHDL je považován za jednu paralelní instrukci (simulace paralelního vykonávání procesů)
entity Circuit is port ( -- rozhraní obvodu: -- vstupní, výstupní, případně -- vstup-výstupní signály VSTUP: in std_logic; VYSTUP: out std_logic_vector(7 downto 0)... ); end Circuit; architecture Behavioral of Circuit is -- deklarace vnitřních signálů obvodu signal vnitrni: std_logic_vector(3 downto 0);... proces1: process(seznam citlivých signálů) vnitrni <=...; proces2: process(sensitivity list) VYSTUP <= vnitrni; end Behavioral; Signál Základní prostředek komunikace (přenosu dat i řídicích informací) v obvodu, představuje vodič Komunikace mezi procesy v behaviorálním popisu Propojení funkčních bloků ve strukturním popisu Signál nabude nové hodnoty (sig <= nova) až po ukončení (uspání) procesu. Tento koncept podporuje simulaci paralelního výpočtu jako u reálných obvodů.
library ieee; use ieee.std_logic_1164.all; Entity Mux is port( I3: in std_logic_vector(2 downto 0); I2: in std_logic_vector(2 downto 0); I1: in std_logic_vector(2 downto 0); I0: in std_logic_vector(2 downto 0); S: in std_logic_vector(1 downto 0); O: out std_logic_vector(2 downto 0) ); end Mux; architecture behv1 of Mux is process(i3,i2,i1,i0,s) case S is when "00" => O <= I0; when "01" => O <= I1; when "10" => O <= I2; when "11" => O <= I3; end case; end behv1; when others => O <= "ZZZ"; architecture behv2 of Mux is with S select -- varianta case bez procesu O <= I0 when "00", I1 when "01", I2 when "10", I3 when "11", "ZZZ when others; end behv2; I3 I2 I1 I0 3 3 3 3 Pozn: if-elsif-else varianta bez procesu Multiplexor 2b adresa, 3b data S 2 3 O process(i3,i2,i1,i0,s) if S = "00" then O <= I0; elsif S = "01" then O <= I1; elsif S = "10" then O <= I2; elsif S = "11" then O <= I3; else O <= "ZZZ"; O <= I0 when S="00" else I1 when S="01" else I2 when S="10" else I3 when S="11" else "ZZZ";
library IEEE; use IEEE.std_logic_1164.all; Dekodér entity Dec3to8 is port (addr: in std_logic_vector(2 downto 0); y: out std_logic_vector(7 downto 0) ); end Dec3to8; architecture behv of Dec3to8 is 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; addr dec3to8 3 8 addr binární adresa y výstupní hodnoty dekodéru. V tomto případě čísla v kódu 1 z n y
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity ALU is port( A: in std_logic_vector(7 downto 0); B: in std_logic_vector(7 downto 0); SEL: in std_logic_vector(1 downto 0); RES: out std_logic_vector(7 downto 0) ); end ALU; architecture behv of ALU is process(a,b,sel) case SEL is when "00" => -- sčítání Res <= A + B; when "01" => -- odčítání Res <= A + (not B) + 1; when "10" => -- AND Res <= A and B; when "11" => -- OR Res <= A or B; when others => žádná operace Res <= (others => X ); end case; ALU 8bit (aritmeticko logická jednotka) A B SEL 8 8 2 8 RES A, B operandy SEL selekční vstup (výběr operace) RES výsledek
library IEEE; use IEEE.std_logic_1164.all; entity Dff is port ( CLK: in std_logic; RST: in std_logic; DIN: in std_logic; DOUT: out std_logic ); end Dff; Klopný obvod D architecture behv of Dffx is process (CLK,RST) if RST = '1' then DOUT <= '0'; elsif CLK'event and CLK = '1' then DOUT <= DIN; DIN CLK RST D DOUT CLK (clock) hodinový vstup RST(reset) asynchronní reset DIN (data in) data přivedená na vstup registru DOUT (data output) hodnota uložená v registr
Asynchronní reset u KO D process (CLK,RST,DIN) if RST = '1' then DOUT <= '0'; elsif CLK'event and CLK = '1' then DOUT <= DIN;
Synchronní reset u KO D process (CLK,RST,DIN) if CLK'event and CLK = '1' then if (RST = '1') then DOUT <= '0'; else DOUT <= DIN;
Registr 16bit library IEEE; use IEEE.std_logic_1164.all; entity Reg16 is port ( CLK: in std_logic; RST: in std_logic; DIN: in std_logic_vector(15 downto 0); DOUT: out std_logic_vector(15 downto 0); ); end Reg16; architecture behv of Reg16 is process (CLK,RST) if RST = '1' then DOUT <= (others => 0); elsif CLK'event and CLK = '1' then DOUT <= DIN; DIN CLK RST 16 Reg16 16 DOUT
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity Cnt is Port( CLK : in std_logic; RST : in std_logic; CE : in std_logic; DOUT : out std_logic_vector(3 downto 0)); end Cnt; architecture behv of Cnt is process (CLK,RST,CE) variable value: std_logic_vector(3 downto 0); if (RST = '1') then value := (others => '0'); elsif (CLK'event and CLK = '1') then if CE='1' then value := value + 1; DOUT <= value; Čítač 4bit v binárním kódu s povolením čítání CE CLK RST Cnt 4 DOUT CE (count enable) povolení čítání CLK (clock) hodinový vstup RST(reset) asynchronní reset DOUT (data output) aktuální hodnota čítače
library IEEE; use IEEE.std_logic_1164.all; entity SReg8 is port( CLK: in std_logic; RESET: in std_logic; LOAD: in std_logic; SHIFT: in std_logic; DIN: in std_logic_vector(7 downto 0); DOUT: out std_logic ); end SReg8; architecture behv of SReg8 is sreg: process(clk, RESET, SHIFT) variable value: std_logic_vector(7 downto 0); if RESET = '1' then value := (others => '0'); elsif LOAD = '1' then value := DIN; elsif CLK'event and CLK = '1' then if SHIFT = '1' then value := '0' & value(7 downto 1); DOUT <= value(0); Posuvný registr 8bit, parallel in, serial out DIN CLK RESET LOAD SHIFT 8 SReg8 DOUT DIN (data in) vstupní data CLK (clock) hodinový vstup RST(reset) asynchronní reset DOUT (data output) výstupní bit (LSB)
entity Mem8x8 is port( CLK: in std_logic; RESET: in std_logic; WRITE: in std_logic; ADDR: in std_logic_vector(2 downto 0); DIN: in std_logic_vector(7 downto 0); DOUT: out std_logic_vector(7 downto 0) ); end Mem8x8; RAM synchronní architecture behv of Mem8x8 is type mem is array (0 to 7) of std_logic_vector(7 downto 0); mem: process(clk, RESET, WRITE, ADDR, DIN) variable space: mem; if RESET = '1' then DOUT <= (others => 'Z'); for i in 0 to 7 loop space(i) := (others => '0'); end loop; elsif CLK'event and CLK = '1' then if WRITE = '1' then space(conv_integer(unsigned(addr))) := DIN; DOUT <= (others => 'Z'); else DOUT <= space(conv_integer(unsigned(addr))); CLK RESET WRITE ADDR DIN 3 8 Mem8x8 8 DOUT CLK hodinový vstup RESET asynchronní reset WRITE povolení zápisu ADDR adresový vstup DIN vstupní data DOUT výstupní data