Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduzione al
linguaggio VHDL
PARTE I
Stefano Mattoccia
e-mail: smattoccia@deis.unibo.it
Telefono: +39 051 2093860
Libri
Zainalabedin Navabi, VHDL: Analysis and modelling of
digital systems (2nd Ed), McGraw-Hill 1998
Douglas Perry, VHDL - Third Edition, McGraw-Hill 1998
Kevin Skahill, VHDL for Programmable Logic, Addison-Wesley
Internet
Sito di Reti Logiche L-A Cesena, www.ingce.unibo.it
http://www.fpga.com.cn/hdl/training/vhdl_intr.pdf
http://www.ee.pdx.edu/~mperkows/CLASS_VHDL_99/005.pdf
.
Dispense corso Reti Logiche
Introduzione alle esercitazioni di laboratorio
www.ingce.unibo.it/corsi_di_laurea/piano_studi/programma_didattico_01_02/reti_logiche/IndiceMateriale.htm
Software
Altera Max Plus (versione 10)
www.altera.com
www.ingce.unibo.it/corsi_di_laurea/piano_studi/programma_didattico_01_02/reti_logiche/IndiceMateriale.htmd
Schema logico
Design Entry
Sintesi (Compilazione)
Simulazione
NO
Funzionamento
previsto?
SI
Trasferimento al Chip
(Target FPGA)
Descrizione
Testuale
(VHDL)
Strutturale
Structural
(Blocchi interconnessi)
Comportamentale
Behavioural
I1
Esempio: Decoder
Timing
Concurrency
Rete ideale
/* assegna x ad a */
b:=x;
/* assegna x a b */
x
t
a
b
CONCURRENCY
Quando un programmatore sviluppa del codice con un linguaggio ad
alto livello (i.e. C, Java, Pascal) immagina di scomporre il
problema in una serie di istruzioni che saranno eseguite in modo
sequenziale. PARADIGMA DI PROGRAMMAZIONE SEQUENZIALE.
Al contrario, un progettista hardware decompone il progetto in
blocchi interconnessi che reagiscono ad eventi e generano eventi.
Gli eventi sono le transizioni dei segnali: ogni transizione di un
ingresso, di unuscita o del clock un evento. Ogni evento impone
che tutti i blocchi dipendenti da tale evento vengano valutati.
Lordine in cui vengono valutati i blocchi deve essere ininfluente
sul risultato finale(cioe, qualunque sia lordine di valutazione
delle espressioni associate ai singoli blocchi, lo stato
complessivo raggiunto dalla rete quando tutti gli eventi sono
stati gestiti deve essere sempre il medesimo). Il tipo di
programmazione che consente di modellare questo tipo di
funzionamento e il PARADIGMA DI PROGRAMMAZIONE PARALLELA: infatti
visto che il risultato dellelaborazione deve essere indipendente
dalla sequenza in cui le istruzioni sono state eseguite, allora
possiamo concludere che tutte le istruzioni possono anche essere
eseguite in parallelo,senza che mai una istruzione, per essere
eseguita, debba attendere il completamento di unaltra.
T1 <=
A AND B;
T2 <=
C AND D;
TN <=
E AND F;
U <= T1 OR T2 OR T3;
U <= T1 OR T2 OR T3;
Equivalenti
T1 <=
A AND B;
T2 <=
C AND D;
TN <=
E AND F;
Segnali
Variabili
Costanti
Files
Data types
Nel linguaggio VHDL (Standard Package) sono predefiniti i
seguenti tipi di dato:
BIT
(0,1)
BIT_VECTOR
BOOLEAN (TRUE,FALSE)
INTEGER
REAL
TIME
Formalismo scalare
a3
PORT ( a3,a2,a1,a0 : IN BIT;
y1,y0 : OUT BIT);
y1
a2
ENTITY
a1
a0
y0
MSB
Y[1..0]
A[3..0]
PORT ( a : IN BIT_VECTOR(3 DOWNTO 0);
y : OUT BIT_VECTOR(1 DOWNTO 0));
LSB
ENTITY
In VHDL gli elementi dei vettori possono essere referenziati attraverso gli
indici.
Ad esempio:
mentre per
Ad esempio:
a <= 1;
b_vettore <= 100111;
Ad esempio:
1 0 1
b_vettore
LIBRARY IEEE
Mediante lutilizzo di librerie (keyword LIBRARY) e possibile
aggiungere al VHDL standard nuovi tipi di dato, nuove funzioni,
etc. Il meccanismo e analogo a quello utilizzato dai linguaggi
di programmazione ad alto livello.
LIBRARY IEEE
Tale libreria contiene i seguenti packages:
std_logic_1164 (definisce la std_logic e relative funzioni)
std_logic_arith (funzioni aritmetiche)
std_logic_signed (funzioni aritmetiche su numeri con segno
std_logic_unsigned (funzioni aritmetiche su numeri senza
segno)
utilizzeremo
I file di testo che contengono il codice VHDL DEVONO avere estensione .vhd
Il nome del file VHDL (estensione .vhd) DEVE coincidere con il nome
assegnato all ENTITY.
Internals
(behavioural,
structural,
...)
Input
Output
ENTITY esempio IS
PORT()
ARCHITECTURE
behavioural OF
esempio IS .
ARCHITECTURE
structural OF
esempio IS .
..
ARCHITECTURE
.
LIBRRY IEEE;
-- Standard IEEE library
USE IEEE.std_logic_1164.all; -- Standard logic package
Inclusione di librerie
-- Entity declaration
Interface specification
ENTITY nome_entity
IS
A
B
S
END nome_entity;
-- Architecture description
ARCHITECTURE architettura_entity OF nome_entity IS
<architecture declarations>
BEGIN
<processing statements>
END architettura_entity ;
Architectural specification
Entity
-- Entity declaration
ENTITY nome_entity
IS
END nome_entity;
Architecture
-- Architecture description
ARCHITECTURE architettura_entity OF nome_entity IS
<architecture declarations>
BEGIN
<processing statements>
END architettura_entity ;
La parte nella quale viene specificata la logica vera e propria della rete
il <processing statements>, compresa tra BEGIN ed END.
CONCURRENT PROCESSING
Le espressioni comprese tra BEGIN ed END vengono elaborate tutte
contemporaneamente. Non ha alcun significato lordine con il quale appaiono
nel codice VHDL.
ARCHITECTURE
BEGIN
<concurrent
<concurrent
<concurrent
.
.
.
<concurrent
END;
statement 1>
statement 2>
statement 3>
statement n>
SEQUENTIAL PROCESSING
Mediante listruzione PROCESS e possibile definire una sequenza di istruzioni che
verranno elaborate secondo il paradigma di programmazione sequenziale. Allinterno
di un blocco PROCESS le istruzioni sono elaborate in modo sequenziale dallalto
verso il basso (nellordine in cui vengono scritte). Ogni processo e eseguito in
modo concorrente rispetto ad altri processi o istruzioni concorrenti definite
nellarchitecture.
ARCHITECTURE
BEGIN
PROCESS(sensitivity_list)
<sequential statement 1>
<sequential statement 2>
.
.
.
<sequential statement n>
END PROCESS;
END
sensitivity_list
Lista degli segnali (eventi) ai quali le istruzioni del processo sono
sensibili. Rappresentano quindi gli eventi che possono modificare le
espressioni definite allinterno di un processo. Se nessuno di questi
eventi si verifica il processo rimane inattivo.
AND
Or:
OR
Not:
NOT
Nand:
NAND
Nor:
NOR
Xor:
XOR
Xnor:
XNOR
Esempi:
Y<= NOT A;
Z<= a AND b;
Uguale:
Diverso:
/=
Minore:
<
Minore Uguale:
<=
Maggiore:
>
Maggiore Uguale:
>=
Esempi:
a_boolean <= op1 > op2;
b_boolean <= op1 /= op2;
Operatori come +, -, <, >, <= ,>= sono definiti solo per il tipo INTEGER.
SHIFT
SOMMA
SOTTRAZIONE
MOLTIPLICAZIONE
CONCURRENT STATEMENTS
Concurrent statements possono essere utilizzati solo al di
fuori di un processo e da un punto di vista concettuale sono
eseguiti in modo concorrente. Per questo motivo lordine con
il quale vengono scritti non e importante.
WITH-SELECT-WHEN
Selected signal assignement
Esempio (and2)
AND2
ENTITY and2with IS
PORT (a : IN BIT_VECTOR (1 DOWNTO 0);
y : OUT BIT);
END and2with;
ARCHITECTURE arch_and2with OF and2with IS
BEGIN
WITH a SELECT
y <= 1' WHEN "11",
0' WHEN 00,
0' WHEN 01,
0' WHEN 10;
END arch_and2with;
and2with.vhd
Esempio (and2)
AND2
ENTITY and2withothers IS
PORT (a : IN BIT_VECTOR (1 DOWNTO 0);
y : OUT BIT);
END and2withothers;
ARCHITECTURE arch_and2withothers OF and2withothers IS
BEGIN
WITH a SELECT
y <= 1' WHEN 11",
0' WHEN OTHERS;
END arch_and2withothers;
and2withothers.vhd
WHEN-ELSE
Conditional signal assignement
Esempio (and2)
AND2
ENTITY and2 IS
PORT (a, b : IN BIT;
y
: OUT BIT);
END and2;
ARCHITECTURE arch_and2 OF and2 IS
BEGIN
y<='1' WHEN (A='1' AND B='1') ELSE
'0';
END arch_and2;
and2.vhd
Esempio (and2)
AND2
ENTITY and2whenelse1 IS
PORT (a: IN BIT_VECTOR (1 DOWNTO 0);
y
: OUT BIT);
END and2whenelse1;
ARCHITECTURE arch_and2whenelse1 OF and2whenelse1 IS
BEGIN
y <= 0' WHEN a(0)=0 ELSE
0' WHEN a(1)=0 ELSE
1;
END arch_and2whenelse1;
and2whenelse1.vhd
Esempio (and2)
AND2
ENTITY and2whenelse2 IS
PORT (a: IN BIT_VECTOR (1 DOWNTO 0);
y
: OUT BIT);
END and2whenelse2;
ARCHITECTURE arch_and2whenelse2 OF and2whenelse2 IS
BEGIN
y <= 0' WHEN a(0)=0 ELSE
1' WHEN a(1)=1 ELSE
0;
END arch_and2whenelse2;
and2whenelse2.vhd
Oppure...
Esempio (and2)
AND2
ENTITY and2whenelse3 IS
PORT (a : IN BIT_VECTOR (1 DOWNTO 0);
y : OUT BIT);
END and2whenelse3;
ARCHITECTURE arch_and2whenelse3 OF and2whenelse3 IS
BEGIN
y <= 1' WHEN a=11 ELSE
0;
END arch_and2whenelse3;
and2whenelse3.vhd
Introduzione al
linguaggio VHDL
PARTE II
Stefano Mattoccia
e-mail: smattoccia@deis.unibo.it
Telefono: +39 0547 614559
A se S = 0
A
B
Mux a 2 Vie
Z=
B se S = 1
Logicamente:
A
B
Z = AS + BS
Mux
2-1
AND2
5
INPUT
VCC
NOT
1
3
OR2
OUTPUT
6
INPUT
VCC
AND2
INPUT
VCC
esempio1.vhd
ENTITY esempio1 IS
A
B
Mux
2-1
arch_esempio1;
Oppure...
Le tre assegnazioni vengono eseguite in modo paralello (concorrente)
Mux
2-1
esempio2.vhd
ENTITY esempio2 IS
PORT (A,B,S : IN BIT;
Z : OUT BIT);
END esempio2;
ARCHITECTURE arch_esempio2 OF esempio2 IS
SIGNAL TA,TB: BIT;
BEGIN
TA<=A AND (NOT S);
TB<=B AND S;
Z<=TA OR TB;
END
arch_esempio2;
A
B
Mux
2-1
esempio3.vhd
Z
ARCHITECTURE arch_esempio3 OF esempio3 IS
SIGNAL TA,TB: BIT;
S
BEGIN
Z<=TA OR TB;
TA<=A AND (NOT S);
TB<=B AND S;
END
arch_esempio3;
A
B
Mux
2-1
ENTITY esempio3 IS
PORT (A,B,S : IN BIT;
Z : OUT BIT);
END esempio3;
ARCHITECTURE arch_esempio3 OF esempio3 IS
BEGIN
Z<=A WHEN S='0' ELSE B;
END
arch_esempio3;
esempio4.vhd
Rete combinatoria
Rilevatore di priorit (Priority Encoder)
X3
X2
Priority
X1
P1 P0 =
P1
P0
11
se
x3 =1 e x2=- e x1=-
10
se
x3 =0 e x2=1 e x1=-
01
se
x3 =0 e x2=0 e x1=1
00
se
x3 =0 e x2=0 e x1=0
Priority 1
priority1.vhd
ENTITY priority1 IS
PORT (x3,x2,x1 : IN BIT;
p : OUT BIT_vector(1 DOWNTO 0));
END priority1;
ARCHITECTURE arch_priority1 OF priority1 IS
BEGIN
p<="00"
"01"
"10"
"11"
WHEN
WHEN
WHEN
WHEN
((x3='0')
((x3='0')
((x3='0')
((x3='1')
END arch_priority1;
AND
AND
AND
AND
(x2='0') AND
(x2='0') AND
(x2='1') AND
((x2='1') OR
(x1='0'))
(x1='1'))
((x1='1')
(x2='0'))
ELSE
ELSE
OR (X1='0'))) ELSE
AND ((x1='1') OR (X1='0')));
Priority 2
priority2.vhd
ENTITY priority2 IS
PORT (x3,x2,x1 : IN BIT;
p : OUT BIT_vector(1 DOWNTO 0));
END priority2;
ARCHITECTURE arch_priority2 OF priority2 IS
BEGIN
p<=11" WHEN x3=1' ELSE
10" WHEN x2=1' ELSE
01 WHEN x1=1' ELSE
00;
END arch_priority2;
Priority2Wrong (ERRATO)
E importante lordine con il quale vengono eseguiti i test WHEN-ELSE !
ENTITY priority2wrong IS
PORT (x3,x2,x1 : IN BIT;
p : OUT BIT_vector(1 DOWNTO 0));
END priority2wrong;
priority2wrong.vhd
Priority 4
priority4.vhd
ENTITY priority2 IS
PORT (
X : IN BIT_vector(3 DOWNTO 1);
p : OUT BIT_vector(1 DOWNTO 0));
END priority2;
ARCHITECTURE arch_priority2 OF priority2 IS
BEGIN
WITH X SELECT
P <= "00" WHEN
"01"
"10"
"10"
"11"
"000",
WHEN "001",
WHEN "010",
WHEN "011",
WHEN OTHERS;
END arch_priority2;
PriorityProcess1
ENTITY priorityprocess1 IS
PORT (x3,x2,x1 : IN BIT;
p : OUT BIT_vector(1 DOWNTO 0));
END priorityprocess1;
priorityprocess1.vhd
SEQUENTIAL STATEMENTS
Sequential statements possono essere utilizzati solo
allinterno di processi (PROCESS), funzioni (FUNCTION) e
procedure (PROCEDURE).
Lassegnamento dei segnali allinterno di un processo e
sequenziale e lordine con il quale vengono effettuati gli
assegnamenti influenza la logica di funzionamento.
Linsieme delle istruzioni (statements) che costituiscono un
processo costituiscono un concurrent statement.
IF-THEN-ELSE
CASE-WHEN
LOOP
WAIT
IF-THEN-ELSE
IF <condition> THEN
<istruzione1>;
ELSE
<istruzione2>;
END IF;
IF-THEN-ELSE-ELSIF
IF <condition1> THEN
<itruzione1>;
ELSIF <condition2> THEN
<istruzione2>;
ELSE
<istruzione3>;
END IF;
CASE-WHEN
CASE <selection_signal> IS
WHEN
WHEN
WHEN
..
..
WHEN
WHEN
END CASE;
Il costrutto CASE-WHEN e utilizzato per eseguire un set di
istruzioni selezionate sulla base del valore di uno specifico
SEGNALE <selection_signal>.
La parola chiave OTHERS e utilizzata per eseguire il set di
istruzioni <instruzione_others> nel caso nessuna condizione sia
verificata.
LOOP
WHILE (<condition>) LOOP
<instruction>;
WHILE-LOOP
END LOOP;
FOR-LOOP (0FORWARD)
END LOOP;
FOR-LOOP (BACKWARD)
END LOOP;
Allinterno di un ciclo possibile interrompere literazione
corrente e passare a quella successiva utilizzando listruzione
NEXT.
Un ciclo pu essere completamente interrotto attraverso
listruzione EXIT.
Segnali VS Variabili
Esiste una sostanziale differenza su come viene effettuato
lassegnamento di un valore ad un segnale e ad una variabile
allinterno di un processo (esecuzione sequenziale).
I valori assegnati alle variabili hanno effetto istantaneamente
mentre i valori assegnati ai segnali vengono aggiornati solo
alluscita del processo.
Half-Adder a 1 bit
Progettare una rete che esegua la somma di due numeri di 1 bit:
S = X + Y
Cout
HA
1 Bit
Cout
Sum
0
0
1
1
0
1
0
1
0
0
0
1
0
1
1
0
Sum
ENTITY ha IS
PORT (X,Y
S,COUT
END ha;
ha_base.vhd
: IN
: OUT
BIT;
BIT);
ARCHITECTURE arch_ha OF ha IS
BEGIN
-- Somma
S<=X XOR Y;
-- Carry
COUT<= A AND Y;
END arch_ha;
ENTITY ha_base1 IS
PORT (X,Y
: IN
S,COUT : OUT
END ha_base1;
ha_base1.vhd
BIT;
BIT);
ENTITY ha IS
PORT (X,Y
S,COUT
END ha;
ha.vhd
: IN
: OUT
BIT;
BIT);
ARCHITECTURE arch_ha OF ha IS
BEGIN
PROCESS(X,Y)
BEGIN
IF X /= Y
THEN S<='1';
ELSE S<='0';
END IF;
IF ( X='1' AND Y='1' )
THEN COUT<='1';
ELSE COUT<='0';
END IF;
END PROCESS;
END arch_ha;
ENTITY ha1 IS
PORT(X,Y
S,COUT
END ha1;
ha1.vhd
: IN
: OUT
BIT;
BIT);
-- Carry-Out
COUT<='0';
IF ( X='1' AND Y='1' )
THEN COUT<='1';
END IF;
END PROCESS;
END arch_ha1;
Full-Adder a 1 bit
Progettare Full Adder a
1 bit:
Sum = X + Y + Cin
Cin
X
Cout
FA
1 Bit
Sum
C1T
C2T
S1T
S2T
ENTITY fa IS
PORT (X,Y,CIN : IN
S,COUT : OUT
END fa;
fa.vhd
BIT;
BIT);
ARCHITECTURE arch_fa OF fa IS
BEGIN
PROCESS(X,Y,CIN)
VARIABLE S1T,S2T,C1T,C2T :BIT;
BEGIN
-- Primo Ha
C1T:= X AND Y;
S1T:= X XOR Y;
-- Secondo Ha
C2T:=S1T AND CIN;
S2T:=S1T XOR CIN;
-- assegna valori ai segnali S e COUT
S<=S2T;
COUT<= C1T OR C2T;
END PROCESS;
END arch_fa;
Full-Adder a 4 bit
Cin
X
Y
4 bit utilizzando 4
4
4
FA
4 Bit
Cout
Sum
Cin
Sum(0)
X(0)
1 BIT
FULLADDER
Y(0)
Cout(0)
Sum(1)
X(1)
1 BIT
FULLADDER
Y(1)
Cout(1)
Sum(2)
X(2)
1 BIT
FULLADDER
Y(2)
Cout(2)
Sum(3)
X(3)
1 BIT
FULLADDER
Y(3)
Cout(3)
ENTITY fa_4bit_noloop IS
PORT (X,Y
: IN BIT_VECTOR(3 DOWNTO 0);
CIN
: IN BIT;
S,COUT : OUT BIT_VECTOR(3 DOWNTO 0));
END fa_4bit_noloop;
Fa_4bit_noloop.vhd
BEGIN
-- inizializza variabili
TX:=X;
TY:=Y;
-- *****************
-- *** Primo FA ****
-- *****************
CARRY_IN:=CIN;
-- Primo Ha
C1T:= TX(0) AND TY(0);
S1T:= TX(0) XOR TY(0);
-- Secondo Ha
C2T:=S1T AND CARRY_IN;
S2T:=S1T XOR CARRY_IN;
-- assegna valore al segnale S(0)
S(0)<=S2T;
-- assegna valore al segnale COUT(0)
CARRY_OUT:=C1T OR C2T;
COUT(0)<= CARRY_OUT;
1/3
-- ******************
-- *** Secondo FA ***
-- ******************
-- riporto da precedente operazione
CARRY_IN:=CARRY_OUT;
-- Primo Ha
C1T:= TX(1) AND TY(1);
S1T:= TX(1) XOR TY(1);
-- Secondo Ha
C2T:=S1T AND CARRY_IN;
S2T:=S1T XOR CARRY_IN;
-- assegna valore al segnale S(1)
S(1)<=S2T;
-- assegna valore al segnale COUT(1)
CARRY_OUT:=C1T OR C2T;
COUT(1)<= CARRY_OUT;
-- *****************
-- *** Terzo FA ****
-- *****************
-- riporto da precedente operazione
CARRY_IN:=CARRY_OUT;
-- Primo Ha
C1T:= TX(2) AND TY(2);
S1T:= TX(2) XOR TY(2);
-- Secondo Ha
C2T:=S1T AND CARRY_IN;
S2T:=S1T XOR CARRY_IN;
-- assegna valore al segnale S(2)
S(2)<=S2T;
-- assegna valore al segnale COUT(2)
CARRY_OUT:=C1T OR C2T;
COUT(2)<= CARRY_OUT;
2/3
-- *****************
-- *** Quarto FA ***
-- *****************
-- riporto da precedente operazione
CARRY_IN:=CARRY_OUT;
-- Primo Ha
C1T:= TX(3) AND TY(3);
S1T:= TX(3) XOR TY(3);
-- Secondo Ha
C2T:=S1T AND CARRY_IN;
S2T:=S1T XOR CARRY_IN;
-- assegna valore al segnale S(3)
S(3)<=S2T;
-- assegna valore al segnale COUT(3)
CARRY_OUT:=C1T OR C2T;
COUT(3)<= CARRY_OUT;
END PROCESS;
END arch_fa_4bit_noloop;
3/3
ENTITY fa_4bit IS
PORT (X,Y
: IN
CIN
: IN
S,COUT : OUT
END fa_4bit;
Fa_4bit.vhd
1/1
Introduzione al
linguaggio VHDL
PARTE III
Stefano Mattoccia
e-mail: smattoccia@deis.unibo.it
Telefono: +39 0547 614559
Full-Adder a N bit
Cin
X
Y
FA
N Bit
Cout
Sum
ENTITY fa_Nbit IS
GENERIC(N: NATURAL :=16);
PORT (X,Y
: IN
BIT_VECTOR(N-1 DOWNTO 0);
CIN
: IN
BIT;
S,COUT : OUT BIT_VECTOR(N-1 DOWNTO 0));
END fa_Nbit;
ARCHITECTURE arch_fa_Nbit OF fa_Nbit IS
BEGIN
PROCESS(X,Y,CIN)
VARIABLE TX,TY,TCOUT
VARIABLE CARRY_IN,CARRY_OUT
VARIABLE S1T,S2T,C1T,C2T
Fa_Nbit.vhd
Codice VHDL di
un generico
sommatore a N
bit.
Caso specifico
di N=16.
BEGIN
-- inizializza variabili prima di iniziare il loop
TX:=X;
TY:=Y;
FOR i IN 0 TO N-1 LOOP
IF (i=0) THEN
CARRY_IN:=CIN;
ELSE
CARRY_IN:=CARRY_OUT;
END IF;
-- Primo Ha
C1T:= TX(i) AND TY(i);
S1T:= TX(i) XOR TY(i);
-- Secondo Ha
C2T:=S1T AND CARRY_IN;
S2T:=S1T XOR CARRY_IN;
-- assegna valore al segnale S
S(i)<=S2T;
-- assegna valori al segnale COUT
CARRY_OUT:=C1T OR C2T;
COUT(i)<= CARRY_OUT;
END LOOP;
END PROCESS;
END arch_fa_Nbit;
ALU a N bit
codice di operazione
c
flag
Propriet
del
risultato
I operando
ALU
Y
II operando
U risultato
u = Fc (X , Y)
CI
CI 4 BIT
a0 ADDER
a1
a2
a3
s0
s1
s2
s3
b0
b1
b2
b3
CO
Y
0
M
U
1X
CI
C0
0
0
X+Y
1 X-Y-1
1
X+Y+1
X-Y
Flag
U
Segnali di flag
c
ZF
SF
CF
Flag
X
ALU
Y
alu_Nbit.vhd
ENTITY alu_Nbit IS
GENERIC(N: NATURAL :=4);
PORT (X,Y
: IN
BIT_VECTOR(N-1 DOWNTO 0); -- input
CIN,C0
: IN
BIT;
-- control bits
S,COUT
: OUT BIT_VECTOR(N-1 DOWNTO 0); -- output bits
SF,CF,OVF
: OUT BIT);
-- flags
END alu_Nbit;
ARCHITECTURE arch_alu_Nbit OF alu_Nbit IS
BEGIN
PROCESS(X,Y,CIN,C0)
VARIABLE TX,TY,TCOUT
:BIT_VECTOR(N-1 DOWNTO 0);
VARIABLE CARRY_IN,CARRY_OUT
:BIT;
VARIABLE S1T,S2T,C1T,C2T
:BIT;
BEGIN
-- ****** rete di pre-laborazione ********
TX:=X;
CASE (C0) IS
WHEN '0' => TY:=Y;
WHEN '1' => TY:=NOT(Y);
END CASE;
FOR i IN 0 TO N-1 LOOP
-- seleziona il corretto carry in ingresso
IF (i=0) THEN
-- riporto in ingresso al sommatore CIN
CARRY_IN:=CIN;
ELSE
-- riporto da precedente operazione
CARRY_IN:=CARRY_OUT;
END IF;
-- Primo Ha
C1T:= TX(i) AND TY(i);
S1T:= TX(i) XOR TY(i);
-- Secondo Ha
C2T:=S1T AND CARRY_IN;
S2T:=S1T XOR CARRY_IN;
-- assegna valore al segnale S
S(i)<=S2T;
-- assegna valori al segnale COUT
CARRY_OUT:=C1T OR C2T;
COUT(i)<= CARRY_OUT;
1/2
END LOOP;
2/2
WAIT
Listruzione WAIT consente di sospendere lesecuzione di un processo
fino al verificarsi di un determinato evento.
Gli eventi che possono essere utilizzati in VHDL per riprendere
lesecuzione di un processo sono riassumibili nelle seguenti 3
categorie:
WAIT ON <signal_changes>;
es: WAIT ON clock,a,b
Flip-Flop D
Il codice seguente mostra la realizzazione in VHDL di un Flip-Flop D
utilizzando listruzione WAIT.
Il segnale di ingresso deve propagarsi in uscita quando si verifica
un fronte positivo del clock.
ENTITY flipflopD IS
PORT(D,CLOCK : IN
Q
: OUT
fliflopd.vhd
BIT;
BIT);
END flipflopD;
ARCHITECTURE arch_flipflopD OF flipflopD IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL CLOCK = '1' AND CLOCK'EVENT;
Q<=D;
END PROCESS;
END arch_flipflopD;
Segnali ed attributi
In VHDL ai segnali sono associati degli attributi.
Tali attributi consentono di avere informazioni sullevoluzione temporale
dei segnali.
EVENT
ACTIVE
LAST_VALUE
LAST_EVENT
LAST_ACTIVE
: IN
: OUT
BIT;
BIT);
END flipflopD_reset_sincrono;
ARCHITECTURE arch_flipflopD OF flipflopD _reset_sincrono IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL CLOCK = '1' AND CLOCK'EVENT;
IF (RESET=1)
THEN
Q<=0;
ELSE
Q<=D;
END IF;
END PROCESS;
END arch_flipflopD;
Contatore modulo N
Si desidera progettare un contatore modulo N in VHDL.
Il contatore presenta un ingresso di clock e tre ingressi
sincroni HOLD, UP e RESET:
HOLD
- se 1 blocca il conteggio
UP
RESET
- se 1 azzera luscita
Clock
HOLD
UP
RESET
Contatore
modulo N
N
Z
--
counterbase.vhd
dimensione della base di conteggio
: SMALL_INTEGER :=12;
: SMALL_INTEGER :=11);
---
base di conteggio
max valore di conteggio (BASE-1)
: IN
: IN
: OUT
-- clock
-- control inputs (sincroni)
-- output bits
PACKAGE MYTYPES IS
TYPE SMALL_INTEGER IS RANGE 0 TO 12;
END PACKAGE;
USE WORK.MYTYPES.ALL;
ENTITY CounterBase IS
GENERIC(BASE
MAX
PORT (CLOCK
HOLD,UP,RESET
Z
END CounterBase;
BIT;
BIT;
SMALL_INTEGER);
1/2
2/2
Contatore BCD
Si desidera progettare un contatore BCD modulo 60.
4
Reset
Contatore
BCD
(modulo 60)
Clock
SEC_H
[0..5]
SEC_L
[0..9]
PACKAGE MYTYPES IS
TYPE SMALL_INTEGER IS RANGE 0 TO 10;
END PACKAGE;
USE WORK.MYTYPES.ALL;
ENTITY CounterBCD IS
PORT (CLOCK
RESET
SECH
SECL
END CounterBCD;
:
:
:
:
IN
IN
OUT
OUT
BIT;
BIT;
SMALL_INTEGER;
SMALL_INTEGER);
-----
clock
control input (sincrono)
output, cifra piu' significativa dei secondi
output, cifra meno significativa dei sec
counterbbcd.vhd
1/2
-- Reset (prioritario)
IF (RESET='1')
THEN STATOH:=0;
END IF;
SECONDI_H<=STATOH;
END PROCESS;
-- assegnamenti (concorrenti)
SECL<=SECONDI_L;
SECH<=SECONDI_H;
END arch_CounterBCD;
2/2
4
4
Clock
Reset
Contatore
BCD
(modulo 60)
7
7
SEC_H
[0..5]
SEC_L
[0..9]
PACKAGE MYTYPES IS
TYPE SMALL_INTEGER IS RANGE 0 TO 10; -- dimensione base massima di conteggio
END PACKAGE;
USE WORK.MYTYPES.ALL;
ENTITY CounterBCD7segmenti IS
PORT (CLOCK
: IN
RESET
: IN
SECH
: OUT
SECL
: OUT
SEGMENTI_H
: OUT
SEGMENTI_L
: OUT
BIT;
BIT;
SMALL_INTEGER;
SMALL_INTEGER;
BIT_VECTOR(6 DOWNTO 0);
BIT_VECTOR(6 DOWNTO 0));
-----
clock
control input (sincrono)
output, cifra piu' significativa dei secondi
output, cifra meno significativa dei secondi
END CounterBCD7segmenti;
ARCHITECTURE arch_CounterBCD7segmenti OF CounterBCD7segmenti IS
SIGNAL SECONDI_L :SMALL_INTEGER;
SIGNAL SECONDI_H :SMALL_INTEGER;
BEGIN
-- @@@@@@@@@@@@@@ SECONDI 'LOW' @@@@@@@@@@@@@@@@
LOW:PROCESS
VARIABLE STATOL :SMALL_INTEGER;
BEGIN
WAIT UNTIL (CLOCK='1' AND CLOCK'EVENT);
IF (STATOL=9)
THEN STATOL:=0;
ELSE STATOL:=(STATOL+1);
END IF;
-- Reset (prioritario)
IF (RESET='1')
THEN
STATOL:=0;
END IF;
SECONDI_L<=STATOL;
END PROCESS;
counterbbcd7segmenti.vhd
1/3
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
OTHERS;
-- Errore (E)
2/3
gfedcba
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
0,
1,
2,
3,
4,
5,
OTHERS;
-- Errore (E)
-- assegnamenti (concorrenti)
SECL<=SECONDI_L;
SECH<=SECONDI_H;
END arch_CounterBCD7segmenti;
a
f
c
d
RESET
Centralina
Semaforica
FLASHING
CLOCK
CLOCK
FLASHING
RESET
10
semaforo.vhd
PACKAGE MYTYPES IS
TYPE SMALL_INTEGER IS RANGE 0 TO 11;
END PACKAGE;
--
USE WORK.MYTYPES.ALL;
ENTITY semaforo IS
GENERIC(BASE
MAX
PERIODO_ROSSO
PERIODO_VERDE
PERIODO_GIALLO
PORT (CLOCK
FLASHING
RESET
Z
R,G,V
:
:
:
:
:
:
:
:
:
:
SMALL_INTEGER
SMALL_INTEGER
SMALL_INTEGER
SMALL_INTEGER
SMALL_INTEGER
IN
BIT;
IN
BIT;
IN
BIT;
OUT SMALL_INTEGER;
OUT BIT);
------
:=11;
:=10;
:=5;
:=3;
:=3);
------
base di conteggio
max valore di conteggio (BASE-1)
durata segnale rosso
durata segnale verde
durata segnale verde-giallo
Clock
Se attivo (1) il semaforo lampeggia
Reset
Output contatore (debug)
output bits (R,G,V)
END semaforo;
ARCHITECTURE arch_semaforo OF semaforo IS
BEGIN
PROCESS
VARIABLE STATO
VARIABLE ROSSO,VERDE,GIALLO
:SMALL_INTEGER;
: BIT;
1/3
BEGIN
WAIT UNTIL (CLOCK='1' AND CLOCK'EVENT);
-- fronte positivo del clock
-- funzionamento standard
IF (FLASHING='0')
THEN
-- aggiorna stato
IF (STATO<BASE)
THEN
STATO:=STATO+1;
ELSE
STATO:=0;
END IF;
END IF;
-- semaforo lampeggiante ?
IF (FLASHING='1')
THEN
STATO:=0;
ROSSO:='0';
VERDE:='0';
GIALLO:=NOT(GIALLO);
END IF;
-- Reset ? (prioritario)
IF (RESET='1')
THEN
STATO:=0;
ROSSO:='0';
VERDE:='0';
GIALLO:='0';
END IF;
R<=ROSSO;
V<=VERDE;
G<=GIALLO;
Z<=STATO;
END PROCESS;
END arch_semaforo;
3/3
+E
causa: Vi
Vu
alta
bassa
tempo
Vi
effetto: Vu
alta
T1
T2
bassa
tempo
Il ritardo di propagazione
ritardo di propagazione: tp
Ritardo puro
tp
t < tp
Ritardo inerziale
nessun
effetto
tp
Ritardo Puro
y <= TRANSPORT a AFTER 5 ns;