w06

Transkrypt

w06
Projektowanie w VHDL

powtórka wiadomości o języku VHDL






słowa zastrzeżone
typy danych, deklaracje obiektów
instrukcje współbieżne i sekwencyjne
pętle for, while
typowe bloki układów cyfrowych
przykłady syntezy układów cyfrowych
Wykorzystano przykłady z:
The Low-Carb VHDL Tutorial
© 2004 by Bryan Mealy (08-27-2004)
PUE-w06
1
Słowa kluczowe (zastrzeżone) w VHDL
access
after
alias
all
attribute
block
body
buffer
bus
exit
file
for
function
generic
group
in
is
label
mod
new
next
null
of
on
open
out
range
PUE-w06
return while
signal with
shared
then
to
type
until
use
variable
2
Operatory w VHDL
logiczne
relacji
przesunięć
arytmetyczne
konkatenacji
not and
=
/=
sll srl
+ - * /
&
or nand
nor xor xnor
<
<=
>
>=
sla
sra rol ror
mod
rem ** abs
PUE-w06
3
Operatory przesunięć w VHDL
Operator
simple
Przykład
Wynik
ssl
shift left
wynik <= "110111" ssl 2
"011100"
ssr
shift right
wynik <= "110111" ssr 3
"000110"
sla
shift left
arithmetic
wynik <= "110011" sla 2
"101100"
sra
shift right
arithmetic
wynik <= "110011" sra 3
"100010"
rol
rotate left
wynik <= "101000" rol 2
"100010"
ror
rotate right
wynik <= "101001" ror 2
"011010"
arithmetic
rotate
Nazwa
PUE-w06
4
Często używane typy danych
Typ
Przykład
std_logic
signal my_sig : std_logic;
std_logic_vector
signal busA : std_logic_vector(3 downto 0);
wyliczeniowy
type state_type is (ST0,ST1,ST2,ST3);
boolean
variable my_test : boolean := false;
integer
signal iter_cnt : integer := 0;
PUE-w06
5
Deklaracje obiektów (danych)
Obiekt
sygnał
Forma deklaracji
signal
nazwa_sygnału : typ_sygnału := wartość_początkowa;
zmienna variable nazwa_zmiennej : typ_zmiennej := wartość_początkowa;
stała
constant nazwa_stałej : typ_stałej
Obiekt
sygnał
:= wartość_początkowa;
Przykłady deklaracji
signal sig_var1 :
signal tmp_bus :
signal tmp_int :
signal my_int :
std_logic := ‘0’;
std_logic_vector( 3 downto 0) := "0011";
integer range -128 to 127 := 0;
integer;
zmienna variable my_var1, my_var2 : std_logic;
variable index_a : integer range (0 to 255) := 0;
variable index_b : integer := -34;
stała
constant sel_val : std_logic_vector(2 downto 0) := "001";
constant max_cnt : integer := 12;
PUE-w06
6
Instrukcje współbieżne i sekwencyjne w VHDL
Instrukcje współbieżne
Współbieżne przypisanie sygnału
Instrukcje sekwencyjne
<->
Przypisanie sygnału
sygnał <= wyrażenie
sygnał <= wyrażenie
DAT <= (D AND E) OR (F AND G);
DAT <= (D AND E) OR (F AND G);
Warunkowe przypisanie sygnału
sygnał <=
<->
Instrukcja if
if
warunek then instrukcje
wyrazenie when warunek else
elsif warunek then instrukcje
wyrazenie when warunek else
else instrukcje
wyrazenie;
end if;
F3 <=
if (S = "11")
then F <= D(3);
'1' when (L='0' AND M='0') else
elsif (S = "10") then F <= D(2);
'1' when (L='1' AND M='1') else
elsif (S = "01") then F <= D(1);
'0';
else
F <= D(0);
end if;
PUE-w06
7
Instrukcje współbieżne i sekwencyjne w VHDL
Instrukcje współbieżne
Selektywne przypisanie sygnału
Instrukcje sekwencyjne
<->
Instrukcja case
with (wybór ) select
sygnał <=
wyrażenie whenwartosci_wyboru,
wyrażenie whenwartosci_wyboru;
wyrażenie when others;
case (wyrazenie ) is
when wartosci_wyboru =>
{instrukcje sekwencyjne}
when wartosci_wyboru =>
{instrukcje sekwencyjne}
when others => -- (opcja)
{instrukcje sekwencyjne}
end case;
with SEL select
MX_OUT <=
D3 when "11",
D2 when "10",
D1 when "01" | "00" ,
'0' when others;
case (ABC) is
when "100" =>
when "011" =>
when "111" =>
when others =>
end case;
PUE-w06
F <= "10";
F <= "01";
F <= "11";
F <= "00";
8
Instrukcje współbieżne i sekwencyjne w VHDL
Instrukcje współbieżne
Instrukcje sekwencyjne
Instrukcja process
<->
etykieta: process(lista_wrażliwości )
begin
{instrukcje_sewencyjne }
end process etykieta;
proc1: process( A, B, C )
begin
if ( A = '1' and B = '0' ) then
F_OUT <= '1';
elsif (B = '1' and C = '1') then
F_OUT <= '1';
else
F_OUT <= '0';
end if;
end process proc1;
PUE-w06
9
Pętle for , while ; instrukcja exit
Pętla for
etykieta: for index in zakres loop
instrukcje sekwencyjne...
end loop etykieta;
p1: for i in 0 to A'length -1 loop
B(i) <= not A(i);
end loop p1;
variable suma : integer := 0;
for licznik in 0 to 50 loop
if (suma = 20) then exit;
end if;
suma := suma + 1;
end loop;
Pętla while
etykieta: while (warunek) loop
instrukcje sekwencyjne...
end loop etykieta;
zegar: while flaga loop
zegar <= not zegar;
wait for okres_zegara/2;
end loop zegar;
variable suma : integer := 0;
while (suma < 300) loop
exit when (suma = 20);
suma := suma + 1;
end loop;
PUE-w06
10
Typowe bloki cyfrowe: rejestr równoległy
-- Rejestr 8-bitowy, z sygnałem ChipSelect (CS)
-- sygnały:
-- CLK,CS: in STD_LOGIC;
-- D_IN: in STD_LOGIC_VECTOR(7 downto 0);
-- D_OUT: out STD_LOGIC_VECTOR(7 downto 0);
process (CLK,CS)
begin
if (CS = '1' and rising_edge(CLK)) then
D_OUT <= D_IN;
end if;
end process;
PUE-w06
11
Typowe bloki cyfrowe: licznik
-----
Licznik synchroniczny 2-kierunkowy z asynchronicznym
zerowaniem i synchronicznym ładowaniem równoległym.
CLK, RESET, LOAD, UP: in STD_LOGIC;
DIN
: in
STD_LOGIC_VECTOR(7 downto 0);
-- COUNT : inout STD_LOGIC_VECTOR(7 downto 0);
process (CLK, RESET)
begin
if (RESET = '1')
elsif (rising_edge(CLK))
if (LOAD = '1')
else if (UP = '1')
else
end if;
end if;
end if;
then COUNT <= "00000000";
then
then COUNT <= DIN;
then COUNT <= COUNT + 1;
COUNT <= COUNT - 1;
end process;
PUE-w06
12
Typowe bloki cyfrowe: rejestr przesuwny
-----
Jednokierunkowy rejestr przesuwny z synchronicznym
ładowaniem równoległym
CLK, D_IN, P_LOAD: in STD_LOGIC;
P_LOAD_DATA: in STD_LOGIC_VECTOR(7 downto 0);
-- D_OUT: out STD_LOGIC;
signal REG_TMP: STD_LOGIC_VECTOR(7 downto 0);
process (CLK)
begin
if (rising_edge(CLK)) then
if (P_LOAD = '1') then
REG_TMP <= P_LOAD_DATA;
else
REG_TMP <= REG_TMP(6 downto 0) & D_IN;
end if;
end if;
D_OUT <= REG_TMP(3);
end process;
PUE-w06
13
Typowe bloki cyfrowe: komparator
-----
Komparator 8-bitowy, zrealizowany sekwencyjnie (!)
CLK: in STD_LOGIC;
A_IN, B_IN : in STD_LOGIC_VECTOR(7 downto 0);
ALB, AGB, AEB : out STD_LOGIC
process(CLK)
begin
if (rising_edge(CLK)) then
if (
else
if (
else
if (
else
end if;
end process;
A_IN <
ALB <=
A_IN >
AGB <=
A_IN =
AEB <=
B_IN ) then ALB <= '1';
'0';
end if;
B_IN ) then AGB <= '1';
'0';
end if;
B_IN ) then AEB <= '1';
'0';
end if;
PUE-w06
14
Typowe bloki cyfrowe: dekoder BCD na 7seg.
-- Dekoder BCD na 7-segmentowy (implementacja kombinacyjna)
-- Wyjscia aktyne stanem niskim;
-- BCD_IN : in STD_LOGIC_VECTOR(3 downto 0);
-- SSEG : out STD_LOGIC_VECTOR(6 downto 0); --a,b,c,..g
with BCD_IN select
SSEG <= "0000001" when "0000", -- 0
"1001111" when "0001", -- 1
a
"0010010" when "0010", -- 2
"0000110" when "0011", -- 3
f g b
"1001100" when "0100", -- 4
"0100100" when "0101", -- 5
"0100000" when "0110", -- 6
e
d c
"0001111" when "0111", -- 7
"0000000" when "1000", -- 8
"0000100" when "1001", -- 9
"0001000" when "1010", -- A
"1100000" when "1011", -- b
"0110001" when "1100", -- C
"1000010" when "1101", -- d
"0110000" when "1110", -- E
"0111000" when "1111", -- F
"1111111" when others; -- wylacza wszystkie LED
PUE-w06
15
Typowe bloki cyfrowe: multiplekser
-----
Multiplekser 4:1,implementacja z CASE (inne: w PUE_w4)
SEL: in STD_LOGIC_VECTOR(1 downto 0);
A, B, C, D : in STD_LOGIC;
MUX_OUT
: out STD_LOGIC;
process (SEL, A, B, C, D)
begin
case SEL is
when
when
when
when
when
end case;
end process;
"00" => MUX_OUT
"01" => MUX_OUT
"10" => MUX_OUT
"11" => MUX_OUT
others => NULL;
<=
<=
<=
<=
PUE-w06
A;
B;
C;
D;
16
Typowe bloki cyfrowe: dekoder
-- Dekoder 3/8 (implementacja z przypisaniem selektywnym)
---------------------------------------------------- D_IN: in STD_LOGIC_VECTOR (2 downto 0);
-- FOUT: out STD_LOGIC_VECTOR(7 downto 0);
--------------------------------------------------with D_IN select
F_OUT <=
"00000001" when "000",
"00000010" when "001",
"00000100" when "010",
"00001000" when "011",
"00010000" when "100",
"00100000" when "101",
"01000000" when "110",
"10000000" when "111",
"00000000" when others;
PUE-w06
17
Projekt detektora ciągu bitów
Zadanie: zaprojektować detektor ciągu bitów : 1,0,1,0 pojawiających się
szeregowo na wejściu danych x.
1. "Czarna skrzynka" i opis jednostki w VHDL
x
clk
reset
det1010
y
-------------------------------------------------- Projekt det1010: detektor ciagu bitow : 1,0,1,0
-- (przyklad z [1],L8.4)
-library ieee;
use ieee.std_logic_1164.all;
entity det1010 is
port ( x,clk,reset : in std_logic;
y : out std_logic);
end entity det1010;
PUE-w06
18
Projekt detektora ciągu bitów (2)
2. Graf stanów detektora (automat Moore'a):
stany:
s0 - nie wystąpił pierwszy element ciągu;
s1 - wystąpił pierwszy element ciągu;
s2 - wystąpiły dwa elementy ciągu;
y=0
y=0
y=0
s3 - wystąpiły trzyi elementy ciągu;
s4 - wystąpił cały ciąg;
y=0
y=1
reset
0
s0
0
1
1
1
s1
0
1
0
s2
0
0
1
s3
0
0
s4
1
0
PUE-w06
19
Projekt detektora ciągu bitów (3)
3. Architektura:
- deklaracje stanów,
- funkcja wyjścia
1
reset
0
s0
0
1
s1
0
1
0
s2
0
0
1
1
s3
0
0
s4
1
0
architecture det1010a1 of det1010 is
type stan is (s0, s1, s2, s3, s4);
signal s : stan;
begin
wyjscia: process( s )
begin
case s is
when
s4
=>
y <= '1';
when others =>
y <= '0';
end case;
end process wyjscia;
--stany : process(clk, x, reset); -- na nastepnym slajdzie
PUE-w06
20
Projekt detektora ciągu bitów (4)
4. Architektura
- funkcje przejść stanów
1
reset
0
s0
0
1
s1
0
0
1
stany : process(clk, x, reset)
begin
if reset='1' then s <= s0;
case s is
when s0=> if x='1' then
when s1=> if x='0' then
when s2=> if x='1' then
when s3=> if x='0' then
when s4=> if x='1' then
when others => s <= s0;
end case;
end process stany;
end architecture det1010a1;
s2
0
1
1
s3
0
0
0
s4
1
0
end if;
s<=s1; else s<=s0;
s<=s2; else s<=s1;
s<=s3; else s<=s0;
s<=s4; else s<=s1;
s<=s1; else s<=s0;
--(awaryjnie)
PUE-w06
end
end
end
end
end
if;
if;
if;
if;
if;
21
Projekt sygnalizatora świateł (1)
Zadanie: Zaprojektować (uproszczony) system sygnalizatora świateł na
skrzyżowaniu tramwaju z przejściem dla pieszych. Każdy sygnalizator ma
dwa światła: czerwone (TC, PC) i zielone (TZ, PZ). Normalnie piesi mają
światło zielone (PZ), tramwaj czerwone (TC). Gdy tramwaj zbliża się do
przejścia, światła zmieniają się na przeciwne i pozostają tak, aż tramwaj
nie opuści skrzyżowania po przeciwnej stronie.
W podtorzu, w
odpowiedniej odległości po obu stronach przejścia umieszczone są czujniki
CL, CP sygnalizujące stanem wysokim obecność tramwaju. Założyć, że
tramwaj może nadjechać tylko z lewej strony. Rozszerzenia:
1. Uwzględnić możliwość ruchu dwukierunkowego tramwajów
2. Uwzględnić stan awaryjny (wszystkie światła wyłączone)
PC,PZ
CL
TC,TZ
TC,TZ
PC,PZ
PUE-w06
CP
22
Projekt sygnalizatora świateł (2)
-------------------------TC
CL
-- CzeZie: swiatla na
CzeZie
CP
TZ
-- przejsciu przez tory
clk
PC
------------------------(reset)
PZ
library ieee;
use ieee.std_logic_1164.all;
entity CzeZie is
port ( CL,CP,clk,reset : in std_logic;
TZ,TC,PZ,PC : out std_logic);
end entity CzeZie;
architecture CzeZieMin of CzeZie is
type stan is ( STZ, SPZ ) ; --StanTramwajZielone,
signal s : stan;
signal CLP : std_logic_vector(1 downto 0);
begin
swiatla: process(s) -- wyjścia Moore'a
begin
if s=STZ then TZ<='1'; TC<='0'; PZ<='0'; PC<='1';
else TZ<='0'; TC<='1'; PZ<='1'; PC<='0';
end if;
end process swiatla;
PUE-w06
23
Projekt sygnalizatora świateł (3)
CL,CP
reset
10
(inne)
STZ
1001
SPZ
0110
(inne)
stan
TZ,TC,PZ,PC
01
stany: process(clk, CL, CP, reset)
begin
if reset then s<= SPZ; end if;
CLP <= CL & CP;
case s is
when SPZ =>
if CLP="10" then s<=STZ ; end if;
when STZ =>
if CLP="01" then s<=SPZ; end if;
end case;
end process stany;
end architecture CzeZieMin;
PUE-w06
24

Podobne dokumenty