¿Alguien puede explicar la diferencia entre los dos códigos a continuación? Ambos escritos en Verilog, Xilinx. Si alguien puede explicar cómo funciona el segundo, se lo agradecería mucho.
module decoder_24(in1, in2, out1, out2, out3, out4);
input in1,in2;
output out1,out2,out3,out4;
assign out1 =!(!in2&!in1);
assign out2 =!(!in2&in1);
assign out3 =!(in2&!in1);
assign out4 =!(in2&in1);
endmodule
module multiplexer41_4bit(input0, input1, input2, input3, sel0, sel1, out);
input [3:0] input0,input1,input2,input3;
input sel0,sel1;
output [3:0] out;
//multiplexer0
multiplexer_41 M41_0(input0[0],input1[0],input2[0],input3[0],sel0,sel1,out[0]);
//multiplexer1
multiplexer_41 M41_1(input0[1],input1[1],input2[1],input3[1],sel0,sel1,out[1]);
//multiplexer2
multiplexer_41 M41_2(input0[2],input1[2],input2[2],input3[2],sel0,sel1,out[2]);
//multiplexer0
multiplexer_41 M41_3(input0[3],input1[3],input2[3],input3[3],sel0,sel1,out[3]);
endmodule
Segundo:
case({m_sel2,m_sel1})
2'b00: m_out = m_in1;
2'b01: m_out = m_in2;
2'b10: m_out = m_in3;
2'b11: m_out = m_in4;
default: m_out = 1'b0;
endcase
Su primer módulo, decoder_24
, es un decodificador. Tiene 2 entradas y 4 salidas. Afirma exactamente una de las salidas, según las combinaciones de entradas que se afirmen.
Su segundo módulo, multiplexer41_4bit
, es un multiplexor. Tiene 4 entradas de datos, 2 entradas de selección y una salida. Las entradas de datos y la salida tienen 4 bits de ancho cada una. Según la combinación de líneas de selección que se afirman, una de las entradas de datos se pasa a la salida.
Cómo funciona, hay 4 multiplexores de un solo bit en paralelo. Cada uno está controlado por las líneas de selección, y tiene sus entradas de datos conectadas a un bit de cada una de las 4 entradas de datos y su salida conectada a uno de los bits de la salida. En cuanto a cómo funcionan los multiplexores de un bit, debe mirar el multiplexer_41
módulo para averiguarlo.
Si alguien puede explicar cómo funciona el segundo, se lo agradecería mucho.
case({m_sel2,m_sel1})
2'b00: m_out = m_in1;
2'b01: m_out = m_in2;
2'b10: m_out = m_in3;
2'b11: m_out = m_in4;
default: m_out = 1'b0;
endcase
Consideremos que todas las señales (m_sel2, m_sel1, m_out, m_in1, m_in2, m_in3, m_in4) tienen 1 bit de longitud.
Tnen {m_sel2,m_sel1}
- es la concatenación de dos señales m_sel2 y m_sel1. Si m_sel2 = 1'b0 y m_sel1 = 1'b1, entonces {m_sel2,m_sel1} será igual a 2'b01.
La declaración del caso se sintetiza en un multiplexor. Si piensa por un momento en cómo funciona el caso, encontrará que es más o menos lo mismo que mux.
En cuanto a la realización: la declaración de caso es una declaración de comportamiento y debe estar dentro del bloque de procedimiento . Así que agregué un código menor:
module mux_4x1(m_sel2, m_sel1, m_in1, m_in2, m_in3, m_in4, m_out);
input m_sel2, m_sel1;
input m_in1, m_in2, m_in3, m_in4;
output reg m_out;
always @(m_sel2, m_sel1, m_in1, m_in2, m_in3, m_in4)
begin
case ({m_sel2, m_sel1})
2'b00: m_out <= m_in1;
2'b01: m_out <= m_in2;
2'b10: m_out <= m_in3;
2'b11: m_out <= m_in4;
default: m_out <= 1'b0;
endcase;
end
endmodule
Así que fui un poco más allá e hice un proyecto simple en Altera Quartus II. Creo que con Xilinx FPGA no habrá muchas diferencias.
Después de construir un proyecto, podemos ver el resultado en un visor rtl.
El resumen de compilación nos dice que el proyecto mux usa 2 LUT de 4 entradas. Para comprender mejor cómo se crea mux en LUT, puede ver esto:
Aquí las funciones de LUT se representan como un esquema.
¡Espero no haberte confundido aún más!
sotiris
el fotón
input [3:0] input0
, estás diciendo queinput0
es un bus con 4 cables. Los cables individuales soninput0[0]
,input0[1]
, etc.jeff langemeier