He construido un multiplexor 4-1 usando tres multiplexores 2-1, pero tengo muchos problemas para depurar mi código. He intentado usar las declaraciones $display
como métodos de depuración rudimentarios, pero no parece estar ayudando. Aquí está mi código:
module multiplex4_to_1(S, C, O); //S[0] is and, S[1] is or
input [3:0] S; //S[2] is add, S[3] is less
input [1:0] C; //C[0] picks and/or + add/less
//C[1] picks m1 or m2
output O;
wire m1_out, m2_out;
multiplex m1(S[1], S[0], C[0], m1_out),
m2(S[3], S[2], C[0], m2_out),
m3(m2_out, m1_out, C[1], O);
endmodule
module multiplex(A, B, C, D);
input A, B, C;
output D;
wire x, y, z;
not n1(x, A);
and a1(y, A, C),
a2(z, x, B);
or o1(D, z, y);
endmodule
Mi banco de pruebas es:
module test_adder;
reg [3:0] S;
reg [1:0] C;
wire O;
multiplex4_to_1 m(S, C, O);
initial
begin
$monitor("%b %b %b %b OUTPUT: %b", S[3], S[2], S[1], S[0], O);
S = 4'b0011; C = 2'b01;
#1 S = 4'b0001; C = 2'b01;
#1 S = 4'b0010; C = 2'b01;
end
endmodule
El multiplexor 2-1 funciona bien, pero parece que cuando los pongo juntos, algo se rompe.
La salida esperada serían las dos, dado un C = 2'b01'
, generaría S[0]
. El bit menos significativo de C
elige entre S[0:1]
y S[2:3]
, y C[1]
elige entre estas dos opciones.
La salida para el código anterior es
0 0 1 1 OUTPUT: 1
0 0 0 1 OUTPUT: 1
0 0 1 0 OUTPUT: 1
Pero espero:
0 0 1 1 OUTPUT: 1
0 0 0 1 OUTPUT: 0
0 0 1 0 OUTPUT: 1