Příklady popisu základních obvodů ve VHDL INP - cvičení 2
Michal Bidlo, 2008
[email protected]
entity Circuit is port ( -- rozhraní obvodu ); end Circuit;
Proces
architecture Behavioral of Circuit is begin proces1: process(seznam citlivých signálů) -- zde je možné deklarovat proměnné begin -- tělo procesu (sekvenční příkazy) -- if-then-elsif-else -- cykly,… -- přiřazení signálů end process; proces2: process(sensitivity list) -- deklarace proměnných… • begin -- tělo procesu2 end process; • ... 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
Signál Základní prostředek komunikace (přenosu dat i řídicích informací) v obvodu, představuje vodič
-- deklarace vnitřních signálů obvodu signal vnitrni: std_logic_vector(3 downto 0); ... begin
• Komunikace mezi procesy v behaviorálním popisu • Propojení funkčních bloků ve strukturním popisu
proces1: process(seznam citlivých signálů) begin vnitrni <= ...; Signál end process; proces2: process(sensitivity list) begin VYSTUP <= vnitrni; end process; end Behavioral;
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ů.
Multiplexor
library ieee; use ieee.std_logic_1164.all; Entity Mux is port( I3: I2: I1: I0: S: O: ); end Mux;
in std_logic_vector(2 downto 0); in std_logic_vector(2 downto 0); in std_logic_vector(2 downto 0); in std_logic_vector(2 downto 0); in std_logic_vector(1 downto 0); out std_logic_vector(2 downto 0)
architecture behv1 of Mux is begin process(I3,I2,I1,I0,S) begin case S is when "00" => when "01" => when "10" => when "11" => when others => end case; end process; end behv1;
2b adresa, 3b data
3 I3 I2 I1
3
3 O
3 3
I0 2 O O O O O
<= <= <= <= <=
I0; I1; I2; I3; "ZZZ";
architecture behv2 of Mux is begin 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;
S Pozn: if-elsif-else
process(I3,I2,I1,I0,S) begin if S = "00" then O <= elsif S = "01" then O elsif S = "10" then O elsif S = "11" then O else O <= "ZZZ"; end process;
O <= I0 when I1 when I2 when I3 when "ZZZ";
varianta bez procesu
S="00" S="01" S="10" S="11"
else else else else
I0; <= I1; <= I2; <= I3;
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 dec3to8 begin 8 y addr 3 with addr select y <= "10000000" when "111", "01000000" when "110", "00100000" when "101", "00010000" when "100", addr – binární adresa "00001000" when "011", "00000100" when "010", y – výstupní hodnoty dekodéru. "00000010" when "001", V tomto případě čísla v kódu "00000001" when others; 1zn end behv;
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 begin process(A,B,SEL) begin 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; end process; end behv;
ALU 8bit
(aritmeticko logická jednotka) 8 A 8 B
RES
8
2 SEL A, B – operandy SEL – selekční vstup (výběr operace) RES – výsledek
Klopný obvod D 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;
DIN
D
DOUT
CLK RST 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
architecture behv of Dffx is begin process (CLK,RST) begin if RST = '1' then DOUT <= '0'; elsif CLK'event and CLK = '1' then DOUT <= DIN; end if; end process; end behv;
Asynchronní reset u KO D process (CLK,RST,DIN) begin if RST = '1' then DOUT <= '0'; elsif CLK'event and CLK = '1' then DOUT <= DIN; end if; end process;
Synchronní reset u KO D process (CLK,RST,DIN) begin if CLK'event and CLK = '1' then if (RST = '1') then DOUT <= '0'; else DOUT <= DIN; end if; end if; end process;
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;
DIN architecture behv of Reg16 is begin process (CLK,RST) begin if RST = '1' then DOUT <= (others => 0); elsif CLK'event and CLK = '1' then DOUT <= DIN; end if; end process; end behv;
CLK RST
16
Reg16
16 DOUT
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all;
Čítač 4bit v binárním kódu s povolením čítání
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 begin CE process (CLK,RST,CE) Cnt variable value: std_logic_vector(3 downto 0); 4 DOUT begin CLK if (RST = '1') then value := (others => '0'); RST elsif (CLK'event and CLK = '1') then if CE='1' then value := value + 1; CE (count enable) – povolení čítání end if; CLK (clock) – hodinový vstup end if; RST(reset) – asynchronní reset DOUT <= value; DOUT (data output) – aktuální end process; hodnota čítače end behv;
library IEEE; use IEEE.std_logic_1164.all;
Posuvný registr 8bit, parallel in, serial out
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
8 DIN CLK RESET LOAD SHIFT
begin sreg: process(CLK, RESET, SHIFT) variable value: std_logic_vector(7 downto 0); begin 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); end if; end if; DOUT <= value(0); end process; end behv;
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); begin mem: process(CLK, RESET, WRITE, ADDR, DIN) variable space: mem; begin 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))); end if; end if; end process; end behv;
CLK RESET WRITE ADDR DIN
Mem8x8
8 DOUT
3 8
CLK – hodinový vstup RESET – asynchronní reset WRITE – povolení zápisu ADDR – adresový vstup DIN – vstupní data DOUT – výstupní data