jednoduch é obvody ve vhdl

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

Upload: darrin

Post on 08-Jan-2016

61 views

Category:

Documents


2 download

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 Presentation

TRANSCRIPT

Page 1: Jednoduch é obvody ve  VHDL

Jednoduché obvody ve VHDL

Převzato z materiálů kurzu INP 2003

Page 2: Jednoduch é obvody ve  VHDL

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)

Page 3: Jednoduch é obvody ve  VHDL

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

Page 4: Jednoduch é obvody ve  VHDL

INP 4

Test bench pro mpx8(automatický test

komponenty)

mpx8

y

s1s0

s2

din

0

7

Generátortestu

Page 5: Jednoduch é obvody ve  VHDL

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;

Page 6: Jednoduch é obvody ve  VHDL

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

Page 7: Jednoduch é obvody ve  VHDL

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;

Page 8: Jednoduch é obvody ve  VHDL

INP 8

mpx8s.vhd

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

Page 9: Jednoduch é obvody ve  VHDL

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

Page 10: Jednoduch é obvody ve  VHDL

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

Page 11: Jednoduch é obvody ve  VHDL

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

Page 12: Jednoduch é obvody ve  VHDL

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

Page 13: Jednoduch é obvody ve  VHDL

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

Page 14: Jednoduch é obvody ve  VHDL

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

Page 15: Jednoduch é obvody ve  VHDL

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;

Page 16: Jednoduch é obvody ve  VHDL

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;

Page 17: Jednoduch é obvody ve  VHDL

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;

Page 18: Jednoduch é obvody ve  VHDL

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

Page 19: Jednoduch é obvody ve  VHDL

INP 19

Cvičení

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

Page 20: Jednoduch é obvody ve  VHDL

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

Page 21: Jednoduch é obvody ve  VHDL

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

Page 22: Jednoduch é obvody ve  VHDL

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;

Page 23: Jednoduch é obvody ve  VHDL

INP 23

Výsledek simulace

Page 24: Jednoduch é obvody ve  VHDL

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.

Page 25: Jednoduch é obvody 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)

Page 26: Jednoduch é obvody ve  VHDL

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.

Page 27: Jednoduch é obvody ve  VHDL

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.

Page 28: Jednoduch é obvody ve  VHDL

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

Page 29: Jednoduch é obvody ve  VHDL

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;

Page 30: Jednoduch é obvody ve  VHDL

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

Page 31: Jednoduch é obvody ve  VHDL

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;

Page 32: Jednoduch é obvody ve  VHDL

INP 32

Časový průběh pro zvolené vstupy

Test bench je k dispozici na webovské stránce cvičení.

Page 33: Jednoduch é obvody ve  VHDL

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

Page 34: Jednoduch é obvody ve  VHDL

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í

Page 35: Jednoduch é obvody ve  VHDL

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