Aller au contenu

Logique combinatoire

Logique combinatoire en utilisant assign

  • Les affectations continues (assign)

Exemple

  • Équation booléenne
assign a = b & c;
  • Mux 2 vers 1 (Opérateur ternaire)

assign y = x? z : w;
- 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

  • Un multiplexeur 2 vers 1
always_comb
begin
   if(x) y = z;
   else  y = w;
end

// ou

always_comb
begin
   y = w;
   if(x) y = z;
end
  • Un multiplexeur 4 vers 1
// 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