Logique combinatoire
Logique combinatoire en utilisant assign
- Les affectations continues (
assign
)
Exemple
- Mux 2 vers 1 (Opérateur ternaire)
- Mux 4 vers 1 (Opérateur ternaire)
// x -> sur 2 bits
assign y = (x == 0)? w0
: (x == 1)? w1
: (x == 2)? w2
: w3; // x == 3
- Un multiplexeur incomplet (3 vers 1) (Opérateur ternaire)
// x -> sur 2 bits
assign y = (x == 0)? w0
: (x == 1)? w1
: w2; // x == 2 ou x == 3
// ou
assign y = (x == 0)? w0
: (x == 1)? w1
: (x == 2)? w2
: 0; // x == 3
Logique combinatoire en utilisant les processus
- La sortie d'un bloc combinatoire ne dépend que de la valeur de ses entrées.
- Pour les mêmes valeurs des entrées on doit toujours avoir les mêmes valeurs de sortie.
- Pas de mémorisation, pas de boucle.
- Pour ne pas se tromper:
- liste de sensibilité automatique en utilisant
always_comb
,
- n'utiliser que des affectations immédiates (
=
),
- donner systématiquement une valeur par défaut aux sorties ou être sûr de couvrir tous les cas,
Exemple
always_comb
begin
if(x) y = z;
else y = w;
end
// ou
always_comb
begin
y = w;
if(x) y = z;
end
// x -> sur 2 bits
always_comb
begin
case(x)
0 : y = w0;
1 : y = w1;
2 : y = w2;
3 : y = w3;
end
- Un multiplexeur incomplet (3 vers 1)
// x -> sur 2 bits
always_comb
begin
case(x)
0 : y = w0;
1 : y = w1;
default : y = w2; // les cas 2 et 3
end
// ou
always_comb
begin
case(x)
0 : y = w0;
1 : y = w1;
2 : y = w2;
default : y = 0; // valeur par défaut
end
// ou
always_comb
begin
y = 0; // valeur par défaut
case(x)
0 : y = w0;
1 : y = w1;
2 : y = w2;
end