VHDL 2rl


Synteza układów sekwencyjnych
VHDL umożliwia bezpośrednią reprezentację
automatu (układu sekwencyjnego). Tablicę
przejść-wyjść można bezpośrednio przetłumaczyć
na specyfikacjÄ™ VHDL.
Wszystkie inne metody, polegajÄ…ce na
oddzielnej syntezie części kombinacyjnej, a
następnie na dołączaniu do niej rejestru,
nie majÄ… sensu
I
T
P
W
ZPT
1
Zasady specyfikacji automatu
Stany automatu sÄ… reprezentowane przez typ
wyliczeniowy, którego wartości są nazwami stanów
Synchronizm zapewnia odpowiednie wyrażenie
testujące zbocze sygnału zegarowego
Funkcje przejść wyjść są realizowane instrukcjami
CASE, IF THEN wewnÄ…trz PROCESU
Specyfikacja jedno- lub dwu-procesowa
WyjÄ…tkiem w stosowaniu typu wyliczeniowego jest
automat ze stanami kodowanymi przez
użytkownika
I
T
P
W
ZPT
2
Typ wyliczeniowy
Typ wyliczeniowy (enumeration type) może być definiowany przez użytkownika.
Przykład:
type MY_STATE is (State1, State2, State3, State4);
...
signal STATE : MY_STATE;
STATE <= State1;
I
T
P
W
ZPT
3
Atrybuty
Dostarczaj dodatkowych informacji o obiektach (np..



sygnałach, zmiennych, typach lub komponentach)
Składnia
obiekt atrybut[(parametr)];
Najczęściej stosowany atrubut:
 event  równy TRUE, gdy zachodzi zmiana wartości sygnału,
If Clock event and Clock =  1 then Q := D;
I
T
P
W
ZPT
4
Przykład: automat Moore a
Rst
x
x = 1
s 0 1 z
x = 0
A/z = 0
B/z = 0
A A B 0
x = 0
B A C 0
x = 1
x = 0
C A C 1
C/z = 1
x = 1
I
T
P
W
ZPT
5
Automat: jednostka deklaracji
LIBRARY ieee;
USE ieee_std_logic_1164.all;
ENTITY automacik IS
PORT (Clock, Rst, x : IN STD_LOGIC;
z : OUT STD_LOGIC);
END automacik;
I
T
P
W
ZPT
6
Automat - wersja I
ARCHITECTURE funkcja_przejsc OF automacik IS
TYPE State_type IS (A, B, C);
SIGNAL Q : State_type;
Deklaracja typu i sygnału
BEGIN
PROCESS (Rst, Clock)
BEGIN
IF Rst = '0' THEN
Q <= A;
ELSIF (Clock'EVENT AND Clock = '1') THEN
CASE Q IS
Zerowanie
WHEN A =>
asynchronicz-
IF x = '0' THEN Q <=A; ELSE Q <= B;
ne
END IF;
WHEN B =>
IF x = '0' THEN Q <= A; ELSE Q <= C;
Synchronizacja
END IF;
WHEN C =>
IF x = '0' THEN Q <= A; ELSE Q <= C;
END IF;
END CASE;
END IF;
I
T
END PROCESS;
P
z <= '1' WHEN Q = C ELSE '0';
W
END funkcja_przejsc;
ZPT
7
Automat Moore a - wersja II
ARCHITECTURE funkcja_przejsc OF simple IS
TYPE State_type IS (A, B, C);
SIGNAL Q_present, Q_next : State_type ;
BEGIN
P
PROCESS (x, Q_present)
r
o BEGIN
c
CASE Q_present IS
e
WHEN A =>
s
IF x = '0' THEN Q_next <= A; ELSE Q_next <= B;
k
END IF;
o
WHEN B =>
m
IF x = '0' THEN Q_next <=A; ELSE Q_next <= C;
b
i
END IF;
n
WHEN C=>
a
IF x = '0' THEN Q_next <= A; ELSE Q_next <= C;
c
y
END IF;
j
END CASE;
n
END PROCESS;
y
PROCESS (Clock, Rst)
BEGIN
IF Rst = '0' THEN Q_present <= A;
Proces
ELSIF (Clock'EVENT AND Clock = '1') THEN
sekwencyjny
I
Q_present <= Q_next;
T
END IF;
P
W
END PROCESS;
z <= '1' WHEN Q_present = C ELSE '0';
ZPT
END funkcja_przejsc;
8
Proces
Automat
Sekwencyjny
Proces
Kombinacyjny
CLK EVENT
and
Case
CLK= 1
If Then
Else
Stan następny
(next_state)
Wejścia
Układ
Przerzut-
kombinacyjny
niki
Stany bieżące
(present_state)
I
T
P
W
ZPT
9
Problem kodowania stanów
Specyfikacja automatu: ciekawostka o procesie
kompilacji
Automaty w komercyjnych kompilatorach VHDL raczej nie
są realizowane optymalnie jak też nie zawsze są
realizowane na minimalnej liczbie przerzutników
Nasz automat w opcji FPGA na trzech przerzutnikach !!!
Ucieczka przed skomplikowaniem
części kombinacyjnej w realizacjach
dla struktur FPGA
I
T
P
W
ZPT
10
Problem kodowania stanów&
Dlatego warto w projektach dla urządzeń
rynkowych stosować zewnętrzne procedury
kodowania stanów automatu.
Takie procedury są dostępne w oprogramowaniu
uniwersyteckim
Pakiet SIS& JEDI, NOVA
I
T
P
W
ZPT
11
Problem kodowania stanów&
Szczęśliwie się składa, iż język VHDL
umożliwia wprowadzenie dowolnego,
zewnętrznie obliczonego kodowania stanów
wewnętrznych
architecture nazwa_arch of nazwa_jednostki is
begin
Tu kodowanie:
za pośrednictwem deklaracji
end nazwa_arch;
stałych (constant)
I
T
P
W
ZPT
12
Automat z kodowaniem stanów
ARCHITECTURE funkcja_przejsc OF simple IS
SIGNAL Q_present, Q_next: STD_LOGIC_VECTOR(1 DOWNTO 0)
CONSTANT A :STD_LOGIC_VECTOR(1 DOWNTO 0) := "00";
Inny typ zmiennej
CONSTANT B :STD_LOGIC_VECTOR(1 DOWNTO 0) := "01";
CONSTANT C :STD_LOGIC_VECTOR(1 DOWNTO 0) := "11";
BEGIN
PROCESS (x, Q_present)
BEGIN
CASE Q_present IS
WHEN A =>
IF x = '0' THEN Q_next <= A; ELSE Q_next <= B;
END IF;
WHEN B =>
IF x = '0' THEN Q_next <= A; ELSE Q_next <= C;
END IF;
WHEN C =>
IF x = '0' THEN Q_next <= A; ELSE Q_next <= C;
END IF;
WHEN OTHERS => Q_next <= A;
END CASE;
END PROCESS;
PROCESS (Clock, Rst)
BEGIN
I
IF Rst = '0' THEN Q_next <= A; ELSIF (Clock'EVENT AND Clock = '1') THEN Q_present <= Q_next;
T
END IF;
P
END PROCESS;
W
z <= '1' WHEN Q_present = C ELSE '0';
END funkcja_przejsc;
ZPT
13
Automat z kodowaniem stanów
ARCHITECTURE funkcja_przejsc OF simple IS
TYPE State_type IS (A, B, C);
Typ wyliczeniowy
SIGNAL Q_present, Q_next : State_type ;
Typ STD_LOGIC_VECTOR
ARCHITECTURE funkcja_przejsc OF simple IS
SIGNAL Q_present, Q_next: STD_LOGIC_VECTOR(1 DOWNTO 0)
CONSTANT A :STD_LOGIC_VECTOR(1 DOWNTO 0) := "00";
CONSTANT B :STD_LOGIC_VECTOR(1 DOWNTO 0) := "01";
CONSTANT C :STD_LOGIC_VECTOR(1 DOWNTO 0) := "11";
I
T
P
W
ZPT
14
Automat Moore a z kodowaniem stanów
ARCHITECTURE funkcja_przejsc OF simple IS
SIGNAL Q_present, Q_next: STD_LOGIC_VECTOR(1 DOWNTO 0)
CONSTANT A :STD_LOGIC_VECTOR(1 DOWNTO 0) := "00";
CONSTANT B :STD_LOGIC_VECTOR(1 DOWNTO 0) := "01";
CONSTANT C :STD_LOGIC_VECTOR(1 DOWNTO 0) := "11";
BEGIN
PROCESS (x, Q_present)
BEGIN
CASE Q_present IS
WHEN A =>
IF x = '0' THEN Q_next <= A; ELSE Q_next <= B;
END IF;
WHEN B =>
IF x = '0' THEN Q_next <= A; ELSE Q_next <= C;
END IF;
zabezpieczenie przed
WHEN C =>
nadmiarowym stanem: 10
IF x = '0' THEN Q_next <= A; ELSE Q_next <= C;
END IF;
WHEN OTHERS => Q_next <= A;
END CASE;
END PROCESS;
PROCESS (Clock, Rst)
BEGIN
I
IF Rst = '0' THEN Q_next <= A; ELSIF (Clock'EVENT AND Clock = '1') THEN Q_present <= Q_next;
T
END IF;
P
END PROCESS;
W
z <= '1' WHEN Q_present = C ELSE '0';
END funkcja_przejsc;
ZPT
15
SUBDESIGN MOORE_AHDL(
CLOCK, RESETN, W : INPUT;
Automat
Z : OUTPUT;
)
w AHDL
VARIABLE
Y : MACHINE WITH STATES (A, B, C);
BEGIN
Y.CLK = CLOCK;
Y.RESET = !RESETN;
IF RESETN == B"0" THEN Y = A;
END IF;
CASE Y IS
WHEN A =>
IF W == B"0" THEN Y = A;
ELSE Y = B;
END IF;
WHEN B =>
IF W == B"0" THEN Y = A;
ELSE Y= C;
END IF;
WHEN C =>
IF W == B"0" THEN Y = A;
ELSE Y = C;
END IF;
END CASE;
I
IF Y == C THEN
T
Z = B"1";
P
ELSE
W
Z = B"0";
END IF;
END;
ZPT
16
AHDL kontra VHDL
AHDL VHDL
AHDL VHDL
Variable
if (clk event and clk= 1 ) then
temp : dff
out <= d;
end if;
temp.clk = clk;
temp.d = data
out = temp.out
Całkowicie behawioralny opis,
nawet nie znamy typu
przerzutnika
I
T
P
W
ZPT
17
Specyfikacje typowych układów
Przerzutniki
Rejestry: równoległy,
szeregowy
Liczniki: w górę, z wpisem
równoległym
Modelowanie na poziomie
strukturalnym
Projektowanie większych
układów
Specyfikacje wszystkich przykładów
są podane w książce SUC:
I
T
P
W
ZPT
18
Przerzutnik typu D
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY flipflop IS
PORT ( D, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC);
END flipflop ;
ARCHITECTURE Behavior OF flipflop IS
BEGIN
PROCESS ( Clock )
BEGIN
IF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
END IF ;
Dopóty, dopóki nie ma
END PROCESS ;
I
odpowiedniego zbocza zegara, to
T
END Behavior ;
żadna zmiana na wejściu D nie jest
P
W
zauważana
ZPT
19
Kod przerzutnika D z instrukcjÄ… WAIT UNTIL
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY dflipflop IS
PORT ( D, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC ) ;
END dflipflop ;
ARCHITECTURE implementacja OF dflipflop IS
Inna
BEGIN
synchronizacja
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
Q <= D ;
END PROCESS ;
I
T
END implementacja;
P
W
ZPT
20
Przerzutnik D z zerowaniem asynchronicznym
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY dflipflop IS
PORT ( D, RST, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC) ;
END dflipflop ;
ARCHITECTURE implementacja OF dflipflop IS
BEGIN
PROCESS ( RST, Clock )
BEGIN
Wejście zerowania
IF RST = '0' THEN
asynchronicznego
Zerowanie
Q <= '0' ;
asynchroniczne
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
I
END IF ;
T
P
END PROCESS ;
W
END implementacja;
ZPT
21
Rejestr
Q3 Q2 Q1 Q0
D3 D2 D1 D0
FF1 FF0
FF2
FF3
CLK
RST (Clear)
I
T
P
W
ZPT
22
Przerzutnik Ò! rejestr
Ò!
Ò!
Ò!
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
Rejestr
STD_LOGIC_VECTOR (3 DOWNTO 0)
ENTITY dflipflop IS
PORT ( D : IN STD_LOGIC ;
RST, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC) ;
END dflipflop ;
Rejestr
ARCHITECTURE implementacja OF dflipflop IS
BEGIN
PROCESS ( RST, Clock )
BEGIN
IF RST = '0' THEN
Q <=  0000
Q <= '0' ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
I
T
END IF ;
P
END PROCESS ;
W
END implementacja;
ZPT
23
Rejestr czterobitowy z zerowaniem
asynchronicznym
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY reg4 IS
PORT ( D : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
RST, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END reg4 ;
ARCHITECTURE implementacja OF reg4 IS
BEGIN
PROCESS ( RST, Clock )
BEGIN
IF RST = '0' THEN
Q <= "0000" ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
I
T
END IF ;
P
W END PROCESS ;
END implementacja ;
ZPT
24
Przerzutnik D z zerowaniem synchronicznym
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY dflipflop IS
PORT ( D, RST, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC) ;
END dflipflop ;
ARCHITECTURE implementacja OF dflipflop IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF RST = '0' THEN
Q <= '0' ;
ELSE
Q <= D ;
Zerowanie
I
END IF ;
T
synchroniczne
P
END PROCESS ;
W
END implementacja;
ZPT
25
Rejestr 4-bitowy Ò! rejestr N-bitowy
Ò!
Ò!
Ò!
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
N 1
ENTITY reg4 IS
GENERIC (N: INTEGER := 8);
PORT ( D : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
RST, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END reg4 ;
N 1
ARCHITECTURE implementacja OF reg4 IS
BEGIN
PROCESS ( RST, Clock )
BEGIN
IF RST = '0' THEN
Q <= (OTHERS =>  0 )
Q <= "0000" ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
I
T
END IF ;
P
W END PROCESS ;
END implementacja ;
ZPT
26
Rejestr n-bitowy z zerowaniem
LIBRARY ieee ;
asynchronicznym
USE ieee.std_logic_1164.all ;
ENTITY regn IS
GENERIC ( N : INTEGER := 8 ) ;
PORT ( D : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
RST, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END regn ;
ARCHITECTURE implementacja OF regn IS
BEGIN
PROCESS ( RST, Clock )
BEGIN
IF RST = '0' THEN
Q <= (OTHERS => '0') ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
I
END IF ;
T
P
END PROCESS ;
W
END implementacja ;
ZPT
27
Rejestr przesuwajÄ…cy
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shift4 IS
PORT ( R : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
Clock : IN STD_LOGIC ;
L, w : IN STD_LOGIC ;
Q : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END shift4 ;
ARCHITECTURE Behavior OF shift4 IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF L = '1' THEN
Q <= R ;
ELSE
Q(0) <= Q(1) ;
Q(1) <= Q(2);
Q(2) <= Q(3) ;
I
Q(3) <= w ;
T
P
END IF ;
W
END PROCESS ;
END Behavior ;
ZPT
28
Rejestr przesuwający z wpisem równoległym
Wyjścia równoległe
Q0
Q3 Q2 Q1
D Q
D Q D Q D Q
Q
Q Q Q
Wejście
szeregowe
Shift/Load
I
Clock
T
Wejścia równoległe
P
W
ZPT
29
Rejestr przesuwajÄ…cy (2)
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shift4 IS
PORT ( R : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
Clock : IN STD_LOGIC ;
L, w : IN STD_LOGIC ;
Q : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END shift4 ;
ARCHITECTURE Behavior OF shift4 IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF L = '1' THEN
Q <= R ;
ELSE
Q(3) <= w ;
Q(2) <= Q(3) ;
Q(1) <= Q(2);
I
T
Q(0) <= Q(1) ;
P
END IF ;
W
END PROCESS ;
ZPT
END Behavior ;
30
Instrukcja Pętli
[etykieta:]
FOR parametr IN zakres LOOP
{instrukcja ;}
END LOOP ;
I
T
P
W
ZPT
31
N-bitowy rejestr
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
przesuwajÄ…cy w prawo
ENTITY shiftn IS
GENERIC ( N : INTEGER := 8 ) ;
PORT ( R : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
Clock : IN STD_LOGIC ;
L, w : IN STD_LOGIC ;
Q : BUFFER STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END shiftn ;
ARCHITECTURE Behavior OF shiftn IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF L = '1' THEN
Q <= R ;
ELSE
Genbits: FOR i IN 0 TO N-2 LOOP
Q(i) <= Q(i+1) ;
END LOOP ;
I
Q(N-1) <= w ;
T
END IF ;
P
W END PROCESS ;
END Behavior ;
ZPT
32
LIBRARY ieee ;
Licznik w górę
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_unsigned.all ;
ENTITY upcount IS
PORT ( Clock, Resetn, E : IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)) ;
END upcount ;
ARCHITECTURE Behavior OF upcount IS
SIGNAL Count : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
BEGIN
PROCESS ( Clock, Resetn )
BEGIN
IF Resetn = '0' THEN
Count <= "0000" ;
ELSIF (Clock'EVENT AND Clock = '1') THEN
IF E = '1' THEN
Count <= Count + 1 ;
ELSE
Count <= Count ;
END IF ;
I
END IF ;
T
END PROCESS ;
P
W
Q <= Count ;
ZPT
END Behavior ;
33
Licznik w górę
Enable Q T Q Q T Q
T T
Clock Q Q Q Q
Rst
T
Q
D
Q
clk
I
T
P
W
ZPT
34
Licznik z przerzutnikami D
Enable
Q0
Q
D
Q
Q1
D Q
Q
Q2
D Q
Q
Q3
D Q
I
T
Q
P
W
Clock Output
carry
ZPT
35
LIBRARY ieee ;
Licznik z wpisywaniem równoległym
USE ieee.std_logic_1164.all ;
ENTITY upcount IS
PORT ( R : IN INTEGER RANGE 0 TO 15 ;
Clock, Resetn, L : IN STD_LOGIC ;
Q : BUFFER INTEGER RANGE 0 TO 15 ) ;
END upcount ;
ARCHITECTURE Behavior OF upcount IS
BEGIN
PROCESS ( Clock, Resetn )
BEGIN
IF Resetn = '0' THEN
Q <= 0 ;
ELSIF (Clock'EVENT AND Clock = '1') THEN
IF L = '1' THEN
Q <= R ;
ELSE
Q <= Q + 1 ;
END IF;
END IF;
I
END PROCESS;
T
P
END Behavior;
W
ZPT
36
Licznik z wpisywaniem równoległym
Enable
0
Q
D Q
0
1
D
0
Q
0
D Q Q
1
1
D
1
Q
0
Q
D Q
2
1
D
2
Q
0
Q
D Q
3
1
D
3
I
Q
T
P
W Output
Load carry
Clock
ZPT
37
Licznik z wpisem z dwóch szyn
A3-0 B3-0
I0
Licznik
I1
clk
I0 I1
Q3-0
0 0 HOLD
0 1 LOAD A
1 0 LOAD B
I
1 1 COUNT
T
P
W
ZPT
38
Licznik z wpisem z dwóch szyn
library IEEE;
use IEEE.std_logic_1164.all;
entity licznik is
port(
CLK : in STD_LOGIC;
-- zegar taktujacy
-- sygnal zerujacy
RESET : in STD_LOGIC;
-- sygnaly sterujace
I0, I1 : in STD_LOGIC;
ABUS : in INTEGER range 0 to 15; -- szyna A wpisu rownoleglego
BBUS : in INTEGER range 0 to 15;
-- szyna B wpisu rownoleglego
QBUS : out INTEGER range 0 to 15 -- wyjscie licznika
);
end licznik;
I
T
P
W
ZPT
39
Licznik z wpisem z dwóch szyn
architecture licznik_arch of licznik is
begin
process (CLK, RESET)
variable WARTOSC : INTEGER range 0 to 15;
begin
if RESET = '1' then
WARTOSC := 0;
elsif CLK = '1' and CLK'event then
if I0 = '0' and I1 = '0' then
WARTOSC := WARTOSC;
elsif I0 = '1' and I1 = '1' then
if WARTOSC = 15 then
WARTOSC := 0;
else
WARTOSC := WARTOSC + 1;
end if;
elsif I0 = '0' and I1 = '1' then
WARTOSC := ABUS;
elsif I0 = '1' and I1 = '0' then
WARTOSC := BBUS;
end if;
end if;
I
QBUS <= WARTOSC;
T
P
end process;
W
end licznik_arch;
ZPT
40
Licznik z wpisem&
clk
MUX3-0
A3-0
4 bit
Counter
B3-0
Q3-0
LOAD
I0
CONTR
COUNT ENABLE
I1
I
T
P
W
ZPT
41
Synteza strukturalna
W syntezie strukturalnej wykorzystywane sÄ… jednostki
projektowe opisane poza danÄ… architekturÄ….
Wyboru odpowiedniej jednostki dokonuje siÄ™ przez:
deklaracjÄ™ komponentu (component declaration),
a następnie jego podstawienie (component instantiation).
I
T
P
W
ZPT
42
Deklaracja komponentu
Deklaracja komponentu jest podobna do deklaracji
jednostki projektowej  podaje interfejs komponentu.
Umieszcza się ją w części deklaracyjnej architektury
lub w pakiecie.
COMPONENT nazwa_komponentu
PORT (lista sygn. we: IN typ;
lista sygn. wy: OUT typ);
END COMPONENT;
I
T
P
W
ZPT
43
Podstawienie komponentu
Instrukcja podstawienia (Äczenia) komponentu to
wsp%7Å„Äbiek%na instrukcja okre%lajca wzajemne
poÄczenia sygnaÄ%7Å„w i podukÄad%7Å„w zwanych
komponentami.
Zawiera:
nazwÄ™ komponentu (etykietÄ™)
typ komponentu
mapę wyprowadzeń (port map), która pokazuje
powiązania pomiędzy sygnałami aktualnymi, a
wyprowadzeniami komponentu
mapę parametrów ogólnych (generic map)
I
T
P
W
ZPT
44
Podstawienie komponentu&
PrzyporzÄ…dkowanie
sygnałów (asocjacja)
Nagłówek: typ_komp PORT MAP (lista sygnałów)
Dwa sposoby przyporzÄ…dkowania:
a) PrzyporzÄ…dkowanie pozycyjne (porzÄ…dkowe)
b) PrzyporzÄ…dkowanie wg nazw
I
(f1 => a1, f2=> a2, . . . )
T
P
W
ZPT
45
Deklaracja komponentu - przykładzik
Wyprowadzenia występujące w deklaracji komponentu
nazywane są lokalnymi. Nie muszą mieć tych samych
nazw co wyprowadzenia formalne (w odnośnej entity).
Component OR2_gate
port (I0, I1 : in BIT;
O : out BIT);
end component;
I
T
P
W
ZPT
46
Podstawienie - przykładzik
U1 : OR2_gate
PorzÄ…dkowe
port map (A, B, Tmp1);
Poprzez nazwy
U2 : OR2_gate
port map (I0 => A, I1 => Tmp1,
o => Tmp2);
OR2_gate
A I0
U1
Tmp1
O
B OR2_gate
I1
I0
U1
Tmp2
O
I
T
I1
P
W
ZPT
47
Licznik z wpisem z dwóch szyn
ABUS BBUS
I0
Licznik
I1
clk
I1 I0
QBUS
0 0 HOLD
0 1 LOAD A
1 0 LOAD B
1 1 COUNT
I
T
P
W
ZPT
48
Licznik z wpisem&
clk
MBUS
ABUS
cntr
BBUS
QBUS
LOAD
CNT_ENA
I0
contrl
I1
I
T
P
W
ZPT
49
MUX (m)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY m IS
PORT(
s: IN STD_LOGIC;
a, b : IN INTEGER range 0 to 15;
y : OUT INTEGER range 0 to 15);
END m;
ARCHITECTURE a_m OF m IS
BEGIN
y <= a WHEN s = '1' ELSE b;
END a_m;
I
T
P
W
ZPT
50
LIBRARY ieee;
contrl
USE ieee.std_logic_1164.all;
ENTITY contrl IS
PORT(
i0, i1 : IN STD_LOGIC;
s, load, cnt_ena : OUT STD_LOGIC);
END contrl;
ARCHITECTURE contrl_arch OF contrl IS
signal i : STD_LOGIC_VECTOR(1 DOWNTO 0);
signal o : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
i <= i1 & i0;
s <= o(2);
load <= o(1);
cnt_ena <= o(0);
PROCESS (i1, i0)
BEGIN
CASE i IS
WHEN "00" => o <= "-00";
WHEN "01" => o <= "010";
WHEN "10" => o <= "110";
WHEN OTHERS => o <= "-01";
I
END CASE;
T
END PROCESS;
P
END contrl_arch;
W
ZPT
51
library IEEE;
use IEEE.std_logic_1164.all;
cntr
entity cntr is
port(
clk : in STD_LOGIC;
load, cnt_ena : in STD_LOGIC;
mbus : in INTEGER range 0 to 15;
qbus : out INTEGER range 0 to 15
);
end cntr;
architecture cntr_arch of cntr is
begin
process (clk)
variable reg : INTEGER range 0 to 15;
begin
if clk = '1' and clk'event then
if load = '1' then
reg := mbus;
elsif cnt_ena = '1' then
if reg = 15 then
reg := 0;
else
reg := reg + 1;
I
end if;
T
P end if;
W
end if;
qbus <= reg;
ZPT end process;
52
end cntr_arch;
library IEEE;
use IEEE.std_logic_1164.all;
licznik2
entity licznik2 is
port(
clk : in STD_LOGIC; -- zegar taktujacy
I0, I1 : in STD_LOGIC; -- sygnaly sterujace
ABUS : in INTEGER range 0 to 15; -- szyna A wpisu rownoleglego
BBUS : in INTEGER range 0 to 15; -- szyna B wpisu rownoleglego
QBUS : out INTEGER range 0 to 15 -- wyjscie licznika
);
end licznik2;
architecture licznik_arch of licznik2 is
component cntr
port(
clk : in STD_LOGIC;
load, cnt_ena : in STD_LOGIC;
mbus : in INTEGER range 0 to 15;
qbus : out INTEGER range 0 to 15
);
end component;
component contrl
PORT(
i0, i1 : IN STD_LOGIC;
s, load, cnt_ena : OUT STD_LOGIC);
end component;
component m
PORT(
s : IN STD_LOGIC;
a, b : IN INTEGER range 0 to 15;
y : OUT INTEGER range 0 to 15);
end component;
Signal s,l,e : STD_LOGIC;
signal mbus : INTEGER range 0 to 15;
I
begin
T
b1: cntr PORT MAP (clk => clk, load => l, cnt_ena => e, mbus => mbus, qbus => qbus);
P
b2: contrl PORT MAP (i0 => i0, i1 => i1, s => s, load => l, cnt_ena => e);
W
b3: m PORT MAP (s => s, a => abus, b => bbus, y => mbus);
ZPT
end licznik_arch;
53
Licznik z wpisem& podstawienia
clk
m clk
abus a
y
cntr
mbus
m y qbus
b
bbus
qbus
mbus
s load cnt_ena
s
e
l
s
i1 i1
load
contrl
cnt_ena
i0
i0
b1: cntr PORT MAP (clk => clk, load => l, cnt_ena => e, mbus => mbus, qbus => qbus);
I
T
b2: contrl PORT MAP (i0 => i0, i1 => i1, s => s, load => l, cnt_ena => e);
P
W
b3: m PORT MAP (s => s, a => abus, b => bbus, y => mbus);
ZPT
54
Organizacja plików specyfikacji licznika
Katalog główny
MaxWork
MAX Plus 10
Pliki systemowe
licznik pakiet
licznik arch
.
m.vhd
m.vhd
.
cntr.vhd
cntr.vhd
contrl.vhd
contrl.vhd
.
licznik_package
licznik2.vhd
I
licznik2.vhd
T
P
W
ZPT
Synteza strukturalna  aspekt praktyczny
Synteza strukturalna jest najbardziej popularnÄ… i najstarszÄ…
metodą syntezy układów cyfrowych
Synteza strukturalna jest często pierwszym krokiem procesu
projektowania
Jest wykonywana  ręcznie i bazuje wyłącznie na wiedzy i
doświadczeniu projektanta
Jednakże szybko rozwijające się narzędzia CAD mogą
wspomagać lub całkowicie zastąpić syntezę strukturalną
I
T
P
W
ZPT
56


Wyszukiwarka

Podobne podstrony:
SIMULINK MATLAB to VHDL Route
lab1 VHDL
tut?2 sdram vhdl
VHDL Zalecenia
PUP niest wyk5 VHDL[51F] v1
lab6 VHDL
vhdl
lab8 VHDL
j VHDL
Jezyki opisu sprzetu VHDL
TC VHDL b
PUCY VHDL Uklady sekwencyjne
Język opisu sprzętu VHDL
Język opisu sprzętu VHDL
VHDL 1j
lab4 VHDL
ELC VHDL

więcej podobnych podstron