View
23
Download
0
Category
Preview:
Citation preview
Introduzione al VHDLLezione 3
Cristina Silvano
Università degli Studi di MilanoDipartimento di Scienze dell’InformazioneVia Comelico 39/41, I-20135 Milano (Italy)
Tel.: +39-2-5835-6306 e-mail: silvano@elet.polimi.it
3/7/01 Cristina Silvano – Università degli Studi di Milano 2
Istruzioni Concorrenti e Sequenziali• Un modello VHDL è costituito da un insieme di:
• ISTRUZIONI CONCORRENTI
• ISTRUZIONI SEQUENZIALI.
• Il VHDL supporta il concetto di concorrenza anche attraverso il concetto di processi multipli che interagiscono in parallelo.
• Concetto di PROCESSO: Ogni processo esegue al suo interno istruzioni SEQUENZIALI . Un modello VHDL è un insieme di PROCESSI che interagiscono tra loro in parallelo (CONCORRENZA TRA PROCESSI ) e che si scambiano informazioni tramite i SEGNALI.
• Esempio di processo:OR: process (A, B)
begin
if (A = ‘1’ or B = '1‘) then
Z <= ‘1’;
else
Z <= ‘0’;
end if;
end process OR;
sensitivity list
sequential statements
label
3/7/01 Cristina Silvano – Università degli Studi di Milano 3
Concorrenza tra Processi• Le istruzioni presenti all’interno di u processo sono eseguite in
sequenza, mentre processi multipli interagiscono in modalità concorrente.
• Un processo viene eseguito quando avviene un EVENTO nella sua SENSITIVITY LIST. L’esecuzione di un processo causa uno o più eventi alle sue uscite. Tali eventi posso attivare altri processi, ecc.
3/7/01 Cristina Silvano – Università degli Studi di Milano 4
• All’interno di un’architettura possono essere presenti processi multipli concorrenti e istruzioni concorrenti: ad esempioarchitecture A of ENTITY is
begin
-- concurrent statements
P1: process (sensitivity list of signals)
begin
-- sequential statements;
end process P1;
-- concurrent statements
P2: process (sensitivity list of signals)
begin
-- sequential statements
end process P2;
-- concurrent statements
end A;
Processi Multipli Concorrenti e Istruzioni Concorrenti
3/7/01 Cristina Silvano – Università degli Studi di Milano 5
Processi Multipli Concorrenti e Istruzioni Concorrenti
�� ��
VLJVLJQQDOVDOV
VLJVLJQQDOVDOV VLJVLJQQDOVDOV
3/7/01 Cristina Silvano – Università degli Studi di Milano 6
Istruzioni Concorrenti
• Eseguite in parallelo nello stesso istante di tempo.
• Il loro comportamento è indipendente dall’ordine con il quale sono scritte nel codice VHDL.
• Esempio: ISTRUZIONI DI ASSEGNAMENTO DEI SEGNALI:
X <= A and B;
Z <= C and X;
oppure
Z <= C and X;
X <= A and B;
• La struttura hardware corrispondente è intrinsecamente concorrentee composta dall’interconnessione di componenti elementari.
• Le attività sono svolte in parallelo dai diversi componenti.
A
B
C
Z
X
3/7/01 Cristina Silvano – Università degli Studi di Milano 7
Istruzioni Sequenziali
• Il VHDL supporta istruzioni sequenziali all’interno di un processo.
3/7/01 Cristina Silvano – Università degli Studi di Milano 8
• Eseguite in sequenza (una alla volta)
• Il loro comportamento dipende dall’ordine con il quale sono state scritte nel codice VHDL
• Esempio: un processo contiene istruzioni sequenziali (IF, CASE, …):
MUX: process (A, B, SEL)
begin
if (SEL = '1‘) then
Z <= A;
else
Z <= B;
end if;
end process MUX;
Istruzioni Sequenziali
sensitivity list
3/7/01 Cristina Silvano – Università degli Studi di Milano 9
Costrutti di Controllo del Codice Sequenziale
• Controllo Condizionato:• Istruzioni IF
• Istruzione CASE
• Controllo Iterativo:• Istruzione LOOP
3/7/01 Cristina Silvano – Università degli Studi di Milano 10
• Consente il controllo condizionato di istruzioni sequenziali basato sulla valutazione di un valore booleano.
• Formato:if CONDITION then
-- sequential statements
end if;
• Esempio:if (A = ’1’) then
COUNT := COUNT + 1;
end if;
• L’istruzione IF verifica una condizione ed esegue diverse istruzioni in base al risultato.
Istruzione IF
3/7/01 Cristina Silvano – Università degli Studi di Milano 11
• Consente il controllo condizionato di due gruppi di istruzioni sequenziali basato sulla valutazione di una singola condizione.
• Formato:if CONDITION then
-- sequential statements
else
-- sequential_statements
end if;
• Esempio:if A = ’1’ then
ONES_COUNT := ONES_COUNT + 1;
else
OTHERS_COUNT := OTHERS_COUNT + 1;
end if;
Costrutto IF-ELSE
3/7/01 Cristina Silvano – Università degli Studi di Milano 12
• Consente il controllo condizionato di alternative multiple basato sulla valutazione di condizioni multiple.
• Formato:if CONDITION_1 then
-- sequential statements
elsif CONDITION_2 then
-- sequential statements
else
-- sequential statements
end if
• In presenza di IF annidati viene eseguita la serie di istruzionisequenziali corrispondenti alla prima condizione che risulti vera⇒ Importante l’ordine di scrittura delle condizioni ⇒ PRIORITÀ
• Più di una condizione può risultare vera ⇒ viene eseguita la prima condizione che risulta vera.
Costrutto ELSIF
3/7/01 Cristina Silvano – Università degli Studi di Milano 13
Esempio di Costrutto ELSIF
• Esempio:if A = ’1’ then
ONES_COUNT := ONES_COUNT + 1;
elsif A = ’0’ then
ZEROS_ COUNT := ZEROS_ COUNT + 1;
else
OTHERS_COUNT := OTHERS_COUNT + 1;
end if;
3/7/01 Cristina Silvano – Università degli Studi di Milano 14
• Consente il controllo dell’esecuzione di istruzioni sequenziali basato sulla valutazione del valore assunto da un oggetto.
• Formato:case OBJECT is
when VALUE_1 => seq_statements;
when VALUE_2 => seq_statements;
-- etc...
end case;
• Esempio:case OP_CODE is
when ’0’ => OUT_1 <= IN_1;
when ’1’ => OUT_1 <= IN_0;
when others => null;
end case;
Istruzione CASE
3/7/01 Cristina Silvano – Università degli Studi di Milano 15
• I possibili valori di un oggetto devono essere specificati solo una volta.
• Tutti i possibili valori dell’oggetto devono essere previsti• Esplicitamente
• Oppure attraverso la clausola when others
• L’oggetto può essere sostituito a un’espressione (ad esempio A and B) che può assumere valori costanti.
• Esempio:case EXPRESSION is
when VALUE_1 => seq_statements;
when VALUE_2 => seq_statements;
end case;
Istruzione CASE
3/7/01 Cristina Silvano – Università degli Studi di Milano 16
• Esempio di processo contenente il costrutto CASE:process (A, B, C, X)
begin
case X is
when 0 to 4 =>
Z <= B;
when 5 =>
Z <= C;
when 7 | 9 =>
Z <= A;
when others =>
Z <= 0;
end case;
end process;
Esempio di Istruzione CASE
range
list
3/7/01 Cristina Silvano – Università degli Studi di Milano 17
• Consente l’esecuzione ripetuta di una sequenza di istruzioni.
• Formato:[LOOP_label:] [iteration scheme] loop
-- sequential statements
end loop [LOOP_label];
iteration_scheme ::= while condition | for LOOP_parameter_specification
LOOP_parameter_specification ::= identifier in discrete_range
• Esempi:while (DAY = WEEK_DAY) loop
DAY := GET_NEXT_DAY(DAY);
end loop;
for I in 1 to 10 loop
I_SQUARED(I) := I * I;
end loop;
Istruzione FOR-LOOP
3/7/01 Cristina Silvano – Università degli Studi di Milano 18
• Esempio:for I in 0 to 3 loop
-- statements
end loop;
• Esempio:entity EX is
port (A : in std_ulogic_vector (0 to 15);SEL : in integer range 0 to 15;
Z : out std_ulogic);end EX;
architecture RTL of EX isbegin
WHAT: process (A, SEL)begin
for I in 0 to 15 loopif SEL = I then
Z <= A(I);
end if;end loop;
end process WHAT;end RTL;
Esempi di Istruzione FOR-LOOP
fixed number of iterations
3/7/01 Cristina Silvano – Università degli Studi di Milano 19
• Esempio:entity PAR_GEN isport (A : in std_ulogic_vector (3 downto 0);
PAR: out std_ulogic);end PAR_GEN;
architecture ARC of PAR_GEN isbegin
P1: process (A)variable TMP: std_ulogic;
beginTMP := ‘0’;
for I in A’low to A’high loop
TMP := TMP xor A(I);end loop;
PAR <= TMP;end process P1;
end ARC;
Esempio di Istruzione FOR-LOOP
3/7/01 Cristina Silvano – Università degli Studi di Milano 20
Processo Combinatorio
process (sensitivity_list_of_inputs)
begin
-- default assignments;
-- combinatorial logic assignments;
end process;
INPUTS OUTPUTS
3/7/01 Cristina Silvano – Università degli Studi di Milano 21
Esempio di Processo Combinatorio
MUX: process (A, B, SEL)
begin
if (SEL = '1‘) then
Z <= A;
else
Z <= B;
end if;
end process MUX;
A ZBSEL
3/7/01 Cristina Silvano – Università degli Studi di Milano 22
Codice Sorgente di un Registro (1)
entity FLOP is
port (D, CLK : in std_ulogic;
Q : out std_ulogic);
end FLOP;
architecture A of FLOP is
begin
process
begin
wait until (CLK'event and CLK='1‘);
Q <= D;
end process;
end A;
D
CLK
Q
3/7/01 Cristina Silvano – Università degli Studi di Milano 23
Codice Sorgente di un Registro (2)
entity FLOP is
port (D, CLK : in std_ulogic;
Q : out std_ulogic);
end FLOP;
architecture B of FLOP is
begin
process (CLK)
begin
if (CLK'event and CLK='1') then
Q <= D;
end if; -- no else clause
end process;
end B;
D
CLK
Q
3/7/01 Cristina Silvano – Università degli Studi di Milano 24
Codice Sorgente di un Registro con Reset Asincrono
entity FLOP is
port (D, CLK, RST : in std_ulogic;
Q : out std_ulogic);
end FLOP;
architecture A of FLOP is
begin
process (CLK, RST)
begin
if (RST = '1’) then
Q <= 0;
elsif (CLK'event and CLK='1') then
Q <= D;
end if; -- no else clause
end process;
end A;
D
CLK
QRST
3/7/01 Cristina Silvano – Università degli Studi di Milano 25
Descrizione RTL: Processo con Clock (1)
process -- clocked process with no reset
begin
wait until (CLK’event and CLK = ‘1’);
Q <= A + B;
-- all combinatorial logic assignments here;
end process;
AD
CLK
QB
first and only
3/7/01 Cristina Silvano – Università degli Studi di Milano 26
Descrizione RTL: Processo con Clock (2)
process (CLK) --clocked process with no reset
begin
if (CLK’event and CLK = ‘1’) then
Q <= A + B;
-- all combinatorial logic assignments here;
end if; -- no else clause
end process;
AD
CLK
QB
first and only
3/7/01 Cristina Silvano – Università degli Studi di Milano 27
Descrizione RTL: Processo con Clock e Reset Asincrono
process (CLK, RST) – clocked process with asynch. reset
begin
if (RST = ‘1’) then
Q <= 0;
elsif (CLK’event and CLK = ‘1’) then
Q <= A + B;
-- all combinatorial logic assignments here;
end if; -- no else clause
end process;
AD
CLK
QB
RST
first and only
3/7/01 Cristina Silvano – Università degli Studi di Milano 28
Descrizione RTL: Esempio di Processo con Clock (1)
process
begin
wait until (CLK’event and CLK = ‘1’);
X <= A + B;
Y <= C + D;
Z <= X + Y;
end process;
A
CLK
XB
CLK
ZYC
D
3/7/01 Cristina Silvano – Università degli Studi di Milano 29
Descrizione RTL: Esempio di Processo con Clock (1)
process
begin
wait until (CLK’event and CLK = ‘1’);
Z <= (A * B) + ( C * D)
end process;
CLK
A[0÷31]
*B[0÷31]
C[0÷31]
*D[0÷31]
+ Z [0÷31]
3/7/01 Cristina Silvano – Università degli Studi di Milano 30
Latch Trasparente (Level Sensitive)
entity LATCH is
Port ( EN, D : in std_ulogic;
Q: out std_ulogic);
end LATCH;
architecture A of LATCH is
begin
process (EN, D)
begin
if (EN = ‘1’) then
Q <= D;
end if;
end process;
end A;
D
EN Q
3/7/01 Cristina Silvano – Università degli Studi di Milano 31
Modalità per NON inserire Latch Trasparenti
process (A, B, COND)
begin
X <= ‘0’; -- default assignment
Y <= ‘1’; -- default assignment
if (COND) then
X <= A;
Y <= B;
end if;
end process;
3/7/01 Cristina Silvano – Università degli Studi di Milano 32
Macchina a Stati Finiti (FSM) – Tipo Moore
IN
CLK
RST OUT
INNEXT_STATE
CLK
CURRENT_STATE
RST
NEXTSTATELOGIC
OUTPUTLOGIC
OUT
3/7/01 Cristina Silvano – Università degli Studi di Milano 33
FSM – Tipo Moore
IDLE0
ST2
ST1
…
…
1…
1
0
1
…
…
RST
3/7/01 Cristina Silvano – Università degli Studi di Milano 34
Codice Sorgente (1) di FSM – Tipo Moore
entity FSM is
port ( RST, CLK, IN : in bit;OUT : out bit);
end FSM;architecture MOORE of FSM is
type STATE_TYPE is (IDLE, ST1, ST2, …);signal CURRENT_STATE, NEXT_STATE : STATE_TYPE;
begin---------------------------------- Processo sequenziale--------------------------------
SEQ: process (CLK, RST)begin
if RST = '1' thenCURRENT_STATE <= IDLE;
elsif (CLK'event and CLK = '1') thenCURRENT_STATE <= NEXT_STATE;
end if;end process SEQ;
3/7/01 Cristina Silvano – Università degli Studi di Milano 35
-------------------------------------------------------------- Processo Combinatorio per Next State Logic------------------------------------------------------------
COMB: process (CURRENT_STATE, IN)begin
case CURRENT_STATE iswhen IDLE =>
if (IN=‘1’) thenNEXT_STATE <= ST1;
elseNEXT_STATE <= ST2;
end if;when ST1 =>
if (…) thenNEXT_STATE <= …;
elseNEXT_STATE <= ..;
end if;when … =>
if (…) thenNEXT_STATE <= …;
elseNEXT_STATE <= …;
end if;end case;
end process COMB;
Codice Sorgente (1) di FSM – Tipo Moore (cont.)
3/7/01 Cristina Silvano – Università degli Studi di Milano 36
Codice Sorgente (1) di FSM – Tipo Moore (cont.)------------------------------------------- Processo Combinatorio per Output Logic-----------------------------------------
OUT_LOGIC: process (CURRENT_STATE)begin
case CURRENT_STATE iswhen IDLE =>
OUT <= ‘1’;when ST1 =>
OUT <= ‘0’;when … =>
OUT<= …;end case;
end process OUT_LOGIC;end MOORE;
3/7/01 Cristina Silvano – Università degli Studi di Milano 37
Codice Sorgente (2) di FSM – Tipo Moore
entity FSM is
port ( RST, CLK, IN : in bit;OUT : out bit);
end FSM;architecture MOORE of FSM is
type STATE_TYPE is (IDLE, ST1, ST2, …);signal CURRENT_STATE, NEXT_STATE : STATE_TYPE;
begin---------------------------------- Processo sequenziale--------------------------------
SEQ: process (CLK, RST)begin
if RST = '1' thenCURRENT_STATE <= IDLE;
elsif (CLK'event and CLK = '1') thenCURRENT_STATE <= NEXT_STATE;
end if;end process SEQ;
3/7/01 Cristina Silvano – Università degli Studi di Milano 38
Codice Sorgente (2) di FSM – Tipo Moore (cont.)---------------------------------------------------------------- Processo Combinatorio per Next State Logic e Output Logic--------------------------------------------------------------
COMB_OUT:process (CURRENT_STATE, IN)begin
case CURRENT_STATE iswhen IDLE =>
OUT <= ‘1’;if (IN=‘1’) then
NEXT_STATE <= ST1;else
NEXT_STATE <= ST2;end if;
when ST1 =>OUT <= ‘0’;if (…) then
NEXT_STATE <= …;else
NEXT_STATE <= …;end if;
when … =>…
end case;end process COMB_OUT;
end MOORE;
3/7/01 Cristina Silvano – Università degli Studi di Milano 39
Esempio: FSM_1 – Tipo Moore
ST2 01,-0
ST3
ST4 ST1
00
10,-1 0-
1-
11
11
01,-0
11
00
01
10
RST
10ST2ST2ST3ST3ST4
01ST4ST4ST4ST3ST3
11ST3ST1ST3ST3ST2
00ST2ST1ST2ST2ST1
Y_OUT10110100
CMD_IN[0÷1]
CLK
RST Y_OUT[0÷1]
FSM_1
3/7/01 Cristina Silvano – Università degli Studi di Milano 40
Codice Sorgente (1) di FSM_1 – Tipo Moore
entity FSM_1 isport ( RST, CLK : in bit;
CMD_IN : in bit_vector (0 to 1);Y_OUT : out bit_vector (0 to 1));
end FSM2;architecture MOORE of FSM_1 is
type STATE_TYPE is ( ST1, ST2, ST3, ST4);signal CURRENT_STATE, NEXT_STATE : STATE_TYPE;
begin---------------------------------- Processo sequenziale--------------------------------
SEQ: process (CLK, RST)begin
if RST = '1' thenCURRENT_STATE <= ST1;
elsif (CLK'event and CLK = '1') thenCURRENT_STATE <= NEXT_STATE;
end if;end process SEQ;
3/7/01 Cristina Silvano – Università degli Studi di Milano 41
Codice Sorgente (1) di FSM_1 - Tipo Moore (cont.)-------------------------------------------------------------- Processo Combinatorio per Next State Logic------------------------------------------------------------
COMB: process (current_state,CMD_IN)begin
case CURRENT_STATE iswhen ST1 =>
if (CMD_IN="00" or CMD_IN="01" or CMD_IN="10") thenNEXT_STATE <= ST2;
elseNEXT_STATE <= ST1;
end if;when ST2 =>
if (CMD_IN="00" or CMD_IN="01" or CMD_IN="10") thenNEXT_STATE <= ST3;
elseNEXT_STATE <= ST1;
end if;when ST3 =>
if (CMD_IN="01" or CMD_IN="10" or CMD_IN="11") thenNEXT_STATE <= ST4;
elseNEXT_STATE <= ST3;
end if;
3/7/01 Cristina Silvano – Università degli Studi di Milano 42
when ST4 =>if ( CMD_IN="00" or CMD_IN="01") then
NEXT_STATE <= ST3;else
NEXT_STATE <= ST2;end if;
end case;end process COMB;
------------------------------------------- Processo Combinatorio per Output Logic-----------------------------------------
OUT_LOGIC: process (CURRENT_STATE)begin
case CURRENT_STATE iswhen ST1 =>
Y_OUT <= "00";when ST2 =>
Y_OUT <= "11";when ST3 =>
Y_OUT <= "01";when ST4 =>
Y_OUT<= "10";end case;
end process OUT_LOGIC;end MOORE;
Codice Sorgente (1) di FSM_1 – Tipo Moore (cont.)
3/7/01 Cristina Silvano – Università degli Studi di Milano 43
Esempio: FSM_A – Tipo Moore
1
0
S11
S2
S3S0
0
1
0
0
1
0
1
0
1
0S1S3S3
1S3S2S2
1S2S0S1
0S2S0S0
ZX = 1X = 0
X
CLK
Z
FSM_A
3/7/01 Cristina Silvano – Università degli Studi di Milano 44
Codice Sorgente (2) di FSM_A – Tipo Moore
entity FSM_A is
port ( X, CLK : in bit;Z: out bit);
end FSM_A;architecture MOORE of FSM_A is
type STATE_TYPE is ( S0, S1, S2, S3);signal CURRENT_STATE, NEXT_STATE : STATE_TYPE;
beginSEQ: processbegin
wait until(CLK'event and CLK = '1');CURRENT_STATE <= NEXT_STATE;
end process SEQ;
COMB_OUT:process (CURRENT_STATE, X)begin
case CURRENT_STATE iswhen S0 =>
Z <= ‘0’;if (X = ‘0’) then
NEXT_STATE <= S0;else
NEXT_STATE <= S2;end if;
3/7/01 Cristina Silvano – Università degli Studi di Milano 45
Codice Sorgente (2) di FSM_A – Tipo Moore (cont.)when S1 =>
Z <= ‘1’;if (X = ‘0’) then
NEXT_STATE <= S0;else
NEXT_STATE <= S2;end if;
when S2 =>Z <= ‘1’;if (X = ‘0’) then
NEXT_STATE <= S2;else
NEXT_STATE <= S3;end if;
when S3 =>Z <= ‘0’;if (X = ‘0’) then
NEXT_STATE <= S3;else
NEXT_STATE <= S1;end if;
end case;end process COMB_OUT;
end MOORE;
3/7/01 Cristina Silvano – Università degli Studi di Milano 46
Macchina a Stati Finiti (FSM) – Tipo Mealy
CLK
IN
NEXT_STATE
CURRENT_STATERST
NEXT STATELOGIC and OUTPUT LOGIC OUT
IN
CLK
RST OUT
3/7/01 Cristina Silvano – Università degli Studi di Milano 47
Esempio: FSM_B – Tipo Mealy
1/0
0/0
STA1/0
STC
STDSTB
0/1
1/1
0/0
0/0
1/0
X
CLK
Z
STA / 1STD / 0STD
STD / 0STC / 1STC
STD / 0STB / 0STB
STC / 0STB / 0STA
X = 1X = 0
3/7/01 Cristina Silvano – Università degli Studi di Milano 48
Codice Sorgente di FSM_B – Tipo Mealyentity FSM_B is
port ( X, CLK : in bit;Z: out bit);
end FSM_B;architecture MEALY of FSM_B is
type STATE_TYPE is ( STA, STB, STC, STD);signal CURRENT_STATE, NEXT_STATE : STATE_TYPE;
beginSEQ: processbegin
wait until(CLK'event and CLK = '1');CURRENT_STATE <= NEXT_STATE;
end process SEQ;
COMB_OUT:process (CURRENT_STATE, X)begin
case CURRENT_STATE iswhen STA =>
if (X = ‘0’) thenZ <= ‘0’;NEXT_STATE <= STB;
elseZ <= ‘0’;NEXT_STATE <= STC;
end if;
3/7/01 Cristina Silvano – Università degli Studi di Milano 49
when STB =>if (X = ‘0’) then
Z <= ‘0’;NEXT_STATE <= STB;
elseZ <= ‘0’;NEXT_STATE <= STD;
end if;when STC =>
if (X = ‘0’) thenZ <= ‘1’;NEXT_STATE <= STC;
elseZ <= ‘0’;NEXT_STATE <= STD;
end if;when STD =>
if (X = ‘0’) thenZ <= ‘0’;NEXT_STATE <= STD;
elseZ <= ‘1’;NEXT_STATE <= STA;
end if;end case;
end process COMB_OUT;end MEALY;
Codice Sorgente di una FSM_B – Tipo Mealy (cont.)
Recommended