Verilog con BASYS 3

Capítulo 3. Multiplexores

3 de febrero de 2024

Un multiplexor es un circuito combinacional utilizado para seleccionar una entradas entre muchas. La selección de una determinada línea de entrada se hace mediante las líneas de selección. Normalmente, un multiplexor tiene 2n  líneas de entrada y n líneas de selección cuyas combinaciones de bits determinan qué entrada se selecciona.

Un multiplexor se puede modelar de diferentes maneras en Verilog.

// 2-1 multiplexer using logic gates

module multiplexor_2-1 ( input in0, in1, sel, output out);


wire w1, w2, w3;


not (w2, sel);

and (w1, in0, w2);

and (w3, sel, in1);

or (out, w1, w3); 

endmodule

// 2-1 multiplexer using dataflow modeling

module mux_2-1 (input in0, in1, sel, output out);

assign out = sel ? in0 : in1; 

endmodule

// 2-1 multiplexer using if-else statement

module mux_2-1 (input in0, in1, sel, output reg out);

always @ (in0, in1, sel)

if (sel == 1) out = in0;

else out = in1;

endmodule

// 2-1 multiplexer using case statement

module mux_2-1 (input in0, in1,sel, output reg out);

always @ (in0, in1, sel)

case (sel)

1'b0: out <= in0;

1'b1: out <= in1;

endcase

endmodule

Creamos el proyecto en Vivado y describimos cuatro multiplexores 2-1 empleando las opciones que acabamos de ver. El código está disponible para descargar al final de la página.

La imagen siguiente muestra el esquema del circuito que hemos sintetizado en la BASYS 3.

Diferencias entre declaraciones if-else y case


El siguiente ejemplo describe dos multiplexores 4-1 empleando declaraciones if-else y case.

Esquema de los dos multiplexores que hemos sintetizado en la BASYS 3.

Las declaraciones if-else se evalúan en orden descendente generando lógica prioritaria, donde la entrada in0 tiene la prioridad más alta y la entrada in3 la más baja.

Las declaraciones case-endcase se evalúan en forma paralela; todas la entradas tiene la misma prioridad.

Puedes descargar el código Verilog aquí abajo.