Logica combinatoria in linguaggio
Verilog
Lucidi del Corso di Elettronica Digitale
Modulo 7
Università di Cagliari
Dipartimento di Ingegneria Elettrica ed Elettronica
Laboratorio di Elettronica (EOLAB)
Logica Combinatoria
„
Logica combinatoria: un blocco di logica in cui
le M uscite sono,
sono in ogni istante,
istante funzione logica
degli N ingressi in quell’istante e NON della
storia passata degli ingressi
x1
x2
y1
y2
Logica
combinatoria
xN
17 Novembre 2009
yM
ED - Verilog combinatorio
Massimo Barbaro
2
Stili descrittivi di logica combinatoria
„
„
„
Strutturale: la funzione viene descritta come
interconnessione di p
primitive logiche
g
((and, or, not, nand,
nor, etc.). E’ necessario sintetizzare il circuito logico a
partire dalla descrizione iniziale
Dataflow: la funzione viene descritta in termini di
trasformazioni algebriche degli ingressi per mezzo di
continuous assigments
g
(parola-chiave assign).
(p
g ) E’
necessario sintetizzare il circuito logico a partire dalla
descrizione iniziale (come la descrizione strutturale ma
si usano espressioni algebriche anzi che porte)
Algoritmico/RTL: la funzione viene descritta per mezzo
di blocchi p
procedurali ((always)
y ) in termini algoritmici
g
(if…else, case, for). Si può partire da una descrizione
descrittiva del sistema senza necessariamente passare
dalla sintesi logica
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
3
Descrizione strutturale
„
„
„
Si basa sull’uso di primitive logiche (AND,
NAND OR,
NAND,
OR NOR,
NOR XOR,
XOR XNOR,
XNOR BUF,
BUF NOT) che
rappresentano l’equivalente della porta logica
disegnata in uno schematico.
schematico
Tutti i segnali interni ed esterni sono NET
( bbi
(abbiamo
usato
t solo
l i NET di tipo
ti wire)
i )
Coincide con una descrizione testuale di uno
schematico (l’equivalente di una netlist spice
rispetto ad un circuito disegnato)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
4
Descrizione strutturale: esempio
„
Vediamo come esempio la descrizione di un
half adder
half-adder
A
nA
nAB
S
B
nB
AnB
C
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
5
Descrizione strutturale: half-adder
module ha(A,B,C,S);
input A,B;
output C,S;
wire A,B,C,S,nA,nB,nAB,AnB;
not n1(nA,A);
not n2(nB,B);
and a1(nAB,nA,B);
and a2(AnB,A,nB);
or o1(S,nAB,AnB);
and a3(C,A,B);
endmodule
17 Novembre 2009
Ingressi e uscite a singolo bit
Segnali interni (interconnessione
fra porte)
La parola chiave not indica il tipo di
porta
L’assegnazione dei nodi è
posizionale (come in SPICE): il
primo segnale della lista è
sempre l’uscita
ED - Verilog combinatorio
Massimo Barbaro
6
Istanziazione di una primitiva logica
„
Per istanziare una primitiva logica, come in
spice si scrive una riga (una per componente)
spice,
Tipo di porta
Uscita (SEMPRE il primo della lista)
and a1 (nAB, nA, B);
Nome del’istanza
del istanza
Ingressi
Il nome dell’istanze può essere omesso, ma è meglio metterlo per
chiarezza
hi
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
7
Descrizione strutturale
A differenza di spice TUTTI i nodi interni devono essere
dichiarati ((subito dopo
p la definizione delle p
porte, all’inizio
del modulo). Possono non essere dichiarati solo i wire a
dimensione di un solo bit
Per connettere ll’uscita
uscita di una porta con ll’ingresso
ingresso di
un’altra gli si dà semplicemente lo stesso nome
„
„
nA
nAB
….
and a1(nAB,nA,B);
a1(nAB nA B);
B
S
Nodo interno: wire
17 Novembre 2009
ED - Verilog combinatorio
….
or o1(S,nAB,AnB);
o1(S nAB AnB);
….
Massimo Barbaro
8
Descrizione strutturale: primitive
and: porta and (Z=AB)
or: porta or (Z=A+B)
nand: porta nand (Z=(AB)’)
nor: porta nor (Z
(Z=(A+B)’)
(A B) )
xor: porta xor (Z=AB’+A’B)
xnor: porta xnor (Z=(AB’+A’B)’)
buf: buffer
(
(Z=A)
)
not: porta not (Z=A’)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
9
Descrizione strutturale
„
„
„
Una descrizione strutturale può fare uso non solo delle
primitive ma anche di altri moduli p
p
precedentemente
definiti (nello stesso file, o in un altro file che fa parte
dello stesso progetto).
Per istanziare un modulo si procede come per le altre
primitive: prima il nome del modulo, poi il nome della
singola
g
istanza di q
quel modulo seguito
g
dalla lista dei
terminali
Ci sono due modi per associare un nodo ad una
particolare porta di un modulo
„
„
Posizionale: nella lista conta l’ordine quindi i segnali sono
associati alla porta corrispondente nella definizione del modulo
Per nome: si associano uno per uno i nodi alla porta
corrispondente
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
10
Istanziazione di un modulo
Sottomodulo con 1
ingresso e 1 uscita (per
i moduli non è
obbligatorio che l’uscita
l uscita
sia in prima posizione)
module mio_modulo(A,B);
input A;
output B;
…..
endmodule
module top(X,Y,Z);
top(X Y Z);
input X,Y;
output Z;
wire aa,bb,cc,dd;
mio_modulo m1(cc,dd);
mio modulo m2(
mio_modulo
m2(.B(aa),
B(aa) .A(bb));
A(bb));
…
endmodule
17 Novembre 2009
ED - Verilog combinatorio
Assegnazione
posizionale:
cc->A
dd->B
Assegnazione per
nome:
bb->A
aa->B
Massimo Barbaro
11
Sottomodulo: esempio
module sommatore(A,B,S);
i
input
t [3:0]
[3 0] A,B;
AB
output [4:0] S;
wire
i [2:0]
[2 0] C;
C
wire [3:0] A,B;
wire
i [4:0]
[4 0] S;
S
ha g1(A[0],B[0],C[0],S[0]);
f g2(A[1],B[1],C[0],C[1],S[1]);
fa
2(A[1] B[1] C[0] C[1] S[1])
fa g3(A[2],B[2],C[1],C[2],S[2]);
f g4(A[3],B[3],C[2],S[4],S[3]);
fa
4(A[3] B[3] C[2] S[4] S[3])
endmodule
17 Novembre 2009
ED - Verilog combinatorio
Ogni segnale interno
deve
essere
esplicitamente
dichiarato con la sua
dimensione (numero
di bit).
Q i di di A devo
Quindi
d
di
dire
sia che è un ingresso
(input) sia che è un
filo (wire).
Solo i wire a singolo
bit possono essere
omessi
Massimo Barbaro
12
Descrizione dataflow
„
„
„
„
„
Si basa sulla definizione algebrica delle uscite rispetto
agli
g ingressi,
g
le uscite sono direttamente definite con
l’opportuna espressione algebrica
Il nome dataflow (flusso di dati) deriva dal fatto che le
uscite sono la trasformazione algebrica degli ingressi
Tutti i segnali interni ed esterni sono NET (in particolare
WIRE) il cui valore viene definito tramite un continuous
assignment
E’ simile alla descrizione strutturale, le porte logiche
sono sostituite da operatori logici all’interno di
un’espressione
Ad esempio per descrivere lo half-adder
half adder si può
descrivere semplicemente l’espressione algebrica che
genera le due uscite a partire dagli ingressi
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
13
Dataflow: operatori logici
&: and fra due bit
|: or fra due bit
^: xor fra due bit
~^:: xnor fra due bit
~: not di un singolo bit
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
14
Dataflow: half-adder
module ha(A,B,C,S);
input A,B;
output C,S;
wire A,B,C,S;
assign C=A&B;
assign
i S=((~A)&B)|(A&(~B));
S (( A)&B)|(A&( B))
endmodule
assign: parola-chiave necessaria per assegnare ad un
segnale
g
((in q
questo caso di uscita,, ma p
potrebbe essere
un segnale interno) una espressione logica funzione
degli ingressi e di eventuali altri nodi interni
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
15
Descrizioni dataflow e strutturale
„
„
„
Le due descrizioni, per come le abbiamo
utilizzate sono assolutamente EQUIVALENTI
utilizzate,
L’unica informazione che ci danno è infatti
quella logica e funzionale ed abbiamo già
verificato che le diverse descrizioni possibili di
una funzione logica
g
sono tutte equivalenti
q
fino a
che non vengono trasformate in circuiti e
transistor
Per il momento, anche la descrizione strutturale
non corrisponde a qualcosa di fisico (non è
d tt che
detto
h il circuito
i it sarà
à implementato
i l
t t con le
l
porte istanziate)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
16
Descrizione algoritmica/RTL
„
„
„
La descrizione algoritmico/RTL fa uso di istruzioni
procedurali eseguite all
all’interno
interno di un blocco always
(ovviamente NON in un blocco initial in cui le istruzione
vengono eseguite una volta sola)
Il blocco always quindi, se scritto seguendo opportune
regole, può essere usato per rappresentare un generico
bl
blocco
di logica
l i combinatoria
bi t i
Le regole per una corretta implementazione di un blocco
combinatorio sono fondamentali perché si rischia,
rischia non
seguendole, di rappresentare un blocco completamente
differente (sequenziale) senza accorgersene
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
17
Always: sensitivity list
„
„
„
„
I blocchi always che implementano logica combinatoria
sono leggermente
gg
diversi da q
quelli utilizzati finora nella
generazione di testbench: la loro esecuzione viene
attivata solo in corrispondenza della variazione di un
insieme di segnali detto sensitivity list
La sensitivity list viene indicata fra parentesi tonde subito
dopo
p il simbolo @ ((at)) che segue
g
la p
parola-chiave
always. I nomi dei segnali della lista vengono separati
dalla parola chiave or.
Nella sensitivity list,
list ovviamente,
ovviamente andranno gli ingressi
alla funzione combinatoria (ogni volta che cambia uno
qualsiasi tra g
q
gli ingressi
g
devono essere aggiornate
gg
le
uscite ossia eseguito l’always)
Le uscite del blocco devono essere di tipo reg perché
sono assegnate in un blocco procedurale (l’always)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
18
Always: sensitivity list
x1
x2
Logica
Combinatoria
xN
yM
…
always @(x1 or x2 or x3 … or xn)
begin
….
end
…
17 Novembre 2009
y1
y2
ED - Verilog combinatorio
Sensitivity list:
l’always viene
eseguito solo se
cambia uno
l i i ffra i
qualsiasi
segnali x1, x2,…,
xn
Massimo Barbaro
19
Always: assegnazione delle uscite
x1
x2
Logica
Combinatoria
xN
yM
always @(x1 or x2 or x3 … or xN)
begin
….
y1= …. ;
….
yM=…. ;
end
17 Novembre 2009
y1
y2
ED - Verilog combinatorio
Le
uscite
devono
sempre
essere
assegnate altrimenti il
loro
valore
dipenderebbe
dalla
storia degli ingressi
perché manterrebbero
il valore precedente
Massimo Barbaro
20
Esempio: half-adder
„
L’implementazione con un always di un blocco
combinatorio già implementato in dataflow e strutturale:
module ha(A,B,C,S);
i
input
t A,B;
AB
output C,S;
reg C,S;
CS
always @(A or B)
begin
C=A&B;
S=A^B;
end
endmodule
17 Novembre 2009
C e S sono reg perché sono
assegnati in un blocco procedurale
La sensitivity list contiene tutti gli
ingressi al blocco
L’assegnamento ad un reg NON
richiede la parola chiave assign
(usata solo per i wire) e viene fatto
SOLO dentro un always o un
initial
ED - Verilog combinatorio
Massimo Barbaro
21
Costrutti algoritmici
„
„
La descrizione precedente non ha alcun
vantaggio rispetto a quella strutturale e tanto
meno dataflow (anzi, la descrizione dataflow è
praticamente identica,, con la sola differenza che
p
le uscite sono wire ed assegnate con un
assign)
Si ottiene un enorme vantaggio (in semplicità e
leggibiltà
di
descrizione,
facilità
di
i l
implementazione)
t i
) sfruttando
f tt d
costrutti
t tti più
iù
raffinati che possono essere evidentemente
usati solo in un blocco procedurale: if…else,
if else
case, for
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
22
Istruzione condizionale (if…else)
„
L’istruzione condizionale ha la stessa sintassi del
linguaggio
g gg C:
if(espressione)
blocco1
else
blocco2
Se espressione è vera viene eseguito blocco1 altrimenti
blocco2 (un blocco sono istruzioni racchiuse fra
begin…end)
Se espressione è un segnale su N bit allora è vera se il
numero rappresentato è diverso da zero, falsa se il
numero è zero o se contiene delle X o Z
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
23
Esempio: multiplexer
module mux2_1(A,B,sel,Z);
input A,B,sel;
A B sel;
output Z;
reg Z;
always @(A or B or sel)
begin
if(sel)
Z=A;;
else
Z=B;
end
d
endmodule
17 Novembre 2009
ED - Verilog combinatorio
Multiplexer: se
sel=1
l 1 passa A
altrimenti B
Tutti gli ingressi
sono specificati
nella sensitivity
list
In qualsiasi ramo
della if l’uscita
viene assegnata
Massimo Barbaro
24
IF…ELSE combinatorio
„
„
Perché la struttura if…else implementi
veramente della logica combinatoria bisogna
che per qualsiasi combinazione degli ingressi
ll’uscita
uscita (o le uscite) venga SEMPRE assegnata.
assegnata
Se esistesse anche una sola combinazione di
i
ingresso
per cuii l’uscita
l’
it non è assegnata,
t
l’uscita stessa, essendo un reg, manterrebbe il
valore
l
assunto
t
precedentemente
d t
t
quindi
i di
dipenderebbe dalla storia del circuito (avremmo
d
dunque
l i
logica
sequenziale
i l
e
NON
combinatoria)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
25
Esempio: multiplexer
module mux2_1(A,B,sel,Z);
input A,B,sel;
A B sel;
output Z;
reg Z;
always @(A or B or sel)
begin
Z=B;
if(sel)
( )
Z=A;
end
endmodule
17 Novembre 2009
ED - Verilog combinatorio
Non è necessario
che ci siano tutti i
rami della if ma che
la Z sia sempre
assegnata.
In questo caso per
prima
cosa
si
assegna B a Z e poi,
se sel=1, si cambia il
suo valore in A. Un
assegnamento viene
comunque eseguito
per ogni valore degli
ingressi
Massimo Barbaro
26
Esempio: multiplexer 4x1
module mux4_1(A,B,C,D,sel,Z);
input A,B,C,D;
A B C D;
input [1:0] sel; always @(A or B or C or D or sel)
output Z;
if(sel[1])
if(sel[0])
reg Z;
Z=A;;
else
Z=B;
….
else
l
if(sel[0])
Z=C;
else
Z=D;
endmodule
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
27
Istruzione CASE
„
Se i casi possibili sono molti più di due si
possono usare delle if annidate oppure
l’istruzione case
case (espressione)
val1: blocco1;
val2: blocco2;
…
valN: bloccoN;
default: blocco0;
endcase
17 Novembre 2009
Se espressione non ricade
in uno dei valori elencati si
esegue
g il default ((blocco0).
)
ED - Verilog combinatorio
Massimo Barbaro
28
Istruzione CASE
„
„
„
A seconda del valore di espressione viene
eseguito uno dei blocchi di istruzioni
istruzioni.
Se espressione non ricade in uno dei valori
elencati
l
ti sii esegue il default
d f lt (blocco0).
(bl
0)
Il match fra espressione e val è fatto bit a bit
tenendo conto dei valori x e z, quindi:
„
„
„
Se val2=2’b01 e espressione=2’b01 eseguo blocco2
Se val2=2’b01 e espressione=2’b0x NON eseguo
blocco2
Se val2=2’b0x e espressione=2’b01 NON eseguo
blocco2
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
29
Esempio: multiplexer 4x1
module mux4_1(A,B,C,D,sel,Z);
p A,B,C,D;
, , , ;
input
input [1:0] sel;
output Z;
reg Z;
always @(A or B or C or D or sel)
case (sel)
( l)
2’b00: Z=D;
2’b01: Z=C;;
2’b10: Z=B;
2’b11: Z=A;
default: Z=A;
endcase
endmodule
17 Novembre 2009
ED - Verilog combinatorio
Il
default
è
necessario perché
case confronta i
bit considerando
anche
h i valori
l i X e
Z ed in questo
caso non abbiamo
specificato azioni
quando
i
bit
assumono
tali
valori (quindi non
abbiamo
specificato tutte le
combinazioni
di
ingresso)
Massimo Barbaro
30
Istruzione CASEX
„
L’istruzione casex permette di non specificare
tutti i casi e raggruppare insiemi di casi in cui
viene eseguita la stessa operazione
casex (espressione)
val1: blocco1;
val2: blocco2;
…
valN: bloccoN;
default: blocco0;
endcase
17 Novembre 2009
ED - Verilog combinatorio
La differenza
L
diff
coll case
normale consiste nel
fatto che in valN si
possono
specificare
gruppi
g
pp di bit come X o
Z ed in tal caso quei
bit
non
vengono
considerati
id ti
(d ’t
(don’t
care)
Massimo Barbaro
31
Istruzione CASEX
„
„
„
A seconda del valore di espressione viene eseguito uno
dei blocchi di istruzioni.
Se espressione non ricade in uno dei valori elencati si
g il default ((blocco0).
)
esegue
Il match fra espressione e val è fatto bit a bit ma un
valore di X o Z viene interpretato come don’t care
(qualsiasi valore abbia quel bit l’espressione corrisponde
se corrispondono gli altri bit)
„
„
„
Se val2=2’b01
S
l2 2’b01 e espressione=2’b01
i
2’b01 eseguo blocco2
bl
2
Se val2=2’b01 e espressione=2’b0x NON eseguo blocco2
Se val2
val2=2’b0x
2 b0x e espressione
espressione=2’b01
2 b01 ESEGUO blocco2
Il match avviene per qualsiasi
valore di questo bit
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
32
Esempio: priority encoder
module pri_enc(A, Z);
input [1:0] A;
output Z;
reg Z;
always @(A)
casex ((A))
2’b1x: Z=1;
2’b01: Z=0;
d f lt Z=x;
default:
Z
endcase
endmodule
Il priority encoder è un
codificatore che prende
in ingresso N bit e mette
in uscita M=log2N bit
che
h
rappresentano
t
l
la
codifica di quale bit di
ingresso
g
è attivo ((alto).
)
I bit di ingresso hanno
priorità quindi se quello
a priorità massima è 1,
1
a prescindere dal valore
degli ingressi si mette in
uscita la sua codifica
E’ utilizzato nella gestione delle
interrupt
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
33
Istruzione FOR
„
La for equivale alla corrispondente istruzione C esegue
cioè un certo numero di istruzioni per un determinato
numero di volte
for (i=start; espressione; i=newexpr)
begin
…
end
La variabile i non può essere né un wire né un reg ma
deve essere di tipo integer.
Finché espressione è vera viene eseguito il blocco e
viene valutato il nuovo valore di i con newexpr
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
34
Istruzione FOR
„
„
„
Il numero di iterazioni nel ciclo for deve essere
predeterminato a priori e NON può dipendere dai
segnali di ingresso, altrimenti non avremmo logica
combinatoria
Poiché il ciclo for è troppo simile ad un istruzione di
linguaggio di programmazione deve essere usato con
molto
lt attenzione
tt
i
perché
hé può
ò facilmente
f il
t dar
d
l
luogo
a
descrizioni inesatte di logica combinatoria (gli sono
preferibili i costrutti if..else
if else e case)
Praticamente l’unico caso in cui useremo i cicli for
saranno i testbench (modulo 8) ossia i moduli usati per
verificare il funzionamento di un modulo (è utile per
generare tutte le possibili combinazioni di ingresso)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
35
Esempio: priority encoder
module pri_enc(A, Z);
input [7:0] A;
output [2:0] Z;
reg [2:0] Z;
integer K;
y @(
@(A))
always
begin
Z=3’bx;
f (K 0 K 8 K
for(K=0;K<8;
K=K+1)
K 1)
if(A[K])
Z=K;
end
endmodule
17 Novembre 2009
ED - Verilog combinatorio
K è un integer
Z è sempre
assegnato
I bit più
significativi di A
hanno priorità
maggiore
Massimo Barbaro
36
Descrizione algoritmica: sottomoduli
„
Non è detto che l’intero blocco combinatorio debba
essere descritto con un unico always, è anche possibile
suddividere
ddi id
gerarchicamente
hi
t il modulo
d l in
i sottomoduli,
tt
d li
ciascuno dei quali può a sua volta essere un modulo
separato o semplicemente un always dentro il modulo
top
I1
I2
int1
Modulo 1 int2
O1
Modulo 3
int3
I3
3
I4
17 Novembre 2009
M d l 2
Modulo
Modulo 0
ED - Verilog combinatorio
O2
Massimo Barbaro
37
Sottomoduli
I1
I2
Modulo 1
int1
i t2
int2
O1
Modulo 3
int3
I3
I4
Modulo 2
O2
Modulo 0
Ad esempio,
p
si p
possono
scrivere 3 moduli, uno per
ogni
sottomodulo,
e
metterli
tt li
i i
insieme
nell
modulo top (m0)
17 Novembre 2009
module m1(A,B,X,Y);
…
endmodule
module m2(A,B,X,Y);
…
endmodule
module
odu e m3(A,B,C,X);
3( , ,C, );
…
endmodule
module
d l m0(I1,I2,I3,I4,O1,O2);
0(I1 I2 I3 I4 O1 O2)
…
m1 g1(I1,I2,int1,int2);
m2 g
g2(I3,I4,int3,O2);
( , ,
, );
m3 g3(int1,int2,int3,O1);
…
endmodule
ED - Verilog combinatorio
Massimo Barbaro
38
Sottomoduli
I1
I2
Modulo 1
int1
i t2
int2
O1
Modulo 3
int3
I3
I4
Modulo 2
O2
Modulo 0
■ Oppure si può scrivere un
unico modulo contenente 3
always differenti, uno per ogni
sottomodulo.
■ La sensitivity-list
sensitivity list del singolo
always
contiene solo gli
ingressi
al
sottomodulo
specifico
ifi implementato
i l
t t
17 Novembre 2009
module m0(I1,I2,I3,I4,O1,O2);
…
always @(I1,I2)
begin
…
end
always @(int1,
@(int1 int2,
int2 int3)
begin
…
end
always @(I3,I4)
begin
…
end
…
endmodule
ED - Verilog combinatorio
Massimo Barbaro
39
Espressioni: operatori
Aritmetici (2 operandi, risultato su N bit)
+ (somma) (Es.
(Es 5+2=7)
- (sottrazione)
* (moltiplicazione)
/ (divisione)
Bitwise (bit a bit) (2 operandi, risultato su N bit)
~ (negazione) (Es. ~(0100)= 1011)
& (and) (Es. (0111)&(1101)= 0101)
| (or)
^ (xor)
~^,^~ (xnor)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
40
Espressioni: operatori
Riduzione (1 operando, risultato su 1 bit)
& (and) (Es.
(Es &(01101)=0 , &(1111)=1)
~& (nand)
| (or) (Es.
(Es |(0101)=1 , |(0000)=0)
~| (nor), ^ (xor)
~^,^~
, ((xnor))
Logici (2 operandi, risultato 1 bit)
! (negazione logica) (Es. !3 è falso, !0 è vero)
&&, || (and e or di due espressioni)
==,!= (uguaglianza e disuglianza di espressioni, se
un operatore contiene x o z risulta falsa)
===,!== (uguaglianza e disuguaglianza con verifica
bit a bit dei valori x e z)
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
41
Espressioni: operatori
Relazionali (2 operandi, risultato 1 bit)
< (minore)
<= (minore uguale)
> (maggiore)
>= (maggiore uguale)
Shift (2 operandi, risultato su N bit)
>> (shift destro) (Es. 0110>>2 = 0001)
<< (shift sinistro) (Es
(Es. 0110<<1 = 1100)
(i bit inseriti negli shift destro e sinistro
sono sempre 0
0, per uno shift devo indicare di quanti
bit voglio shiftare )
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
42
Espressioni: operatori
Condizionale (3 operandi, risultato è un’espressione)
(espressione)?S1:S2
se espressione è vera valuta S1 altrimenti S2
Esempio:
Z=(sel==1)?A:B; (multiplexer, se sel=1 assegna A
altrimenti B))
Concatenazione
{,} concatena i due vettori
E
Esempio:
i Z
Z={A,B};
{A B}
Replica
{int{ }} ripete int volte un certo vettore
Esempio: Z={3{A}} -> Z={A,A,A}
17 Novembre 2009
ED - Verilog combinatorio
Massimo Barbaro
43