MUX código verilog

¿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

Respuestas (2)

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_41módulo para averiguarlo.

Gracias. Comentario útil. Sin embargo, todavía te perdí un poco al final. Creo que si tratas de explicarme qué significan los números entre paréntesis lo conseguiré. por ejemplo, en la línea de abajo, ¿qué representa el número 3? entrada0[3]
Cuando declaras input [3:0] input0, estás diciendo que input0es un bus con 4 cables. Los cables individuales son input0[0], input0[1], etc.
@sotiris Ese es el índice del bit que está pasando (basado en cero, por supuesto).

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.

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

Aquí las funciones de LUT se representan como un esquema.

¡Espero no haberte confundido aún más!