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.