código verilog MUX

2

¿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
    
pregunta sotiris

2 respuestas

1

Su primer módulo, decoder_24 , es un decodificador. Tiene 2 entradas y 4 salidas. Afirma exactamente una de las salidas, dependiendo de qué combinaciones de entradas 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 son cada una de 4 bits de ancho. Dependiendo de qué combinación de líneas de selección se afirma, la entrada de datos pasa a la salida.

Cómo funciona, es que hay 4 multiplexores de un solo bit en paralelo. Cada una está controlada 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 consultar el módulo multiplexer_41 para averiguarlo.

    
respondido por el The Photon
0
  

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 una longitud de 1 bit.

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 de caso se sintetiza en un multiplexor. Si piensa por un momento cómo funciona el caso, verás que es casi lo mismo que mux.

En cuanto a la realización: La declaración del caso es una Declaración de comportamiento , y debe estar dentro de Bloqueo de procedimientos . 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 lejos e hice un proyecto simple en Altera Quartus II. Creo que con Xilinx FPGA no habrá muchas diferencias.

Después de crear un proyecto, podemos ver el resultado en un visor rtl.

Elresumendelacompilaciónnosdicequeelproyectomuxusa2LUTde4entradas.ParacomprendermejorcómosecreamuxenLUTs,puedeveresto:

En este caso, las funciones de LUT se representan como un esquema.

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

    
respondido por el StAlxndr

Lea otras preguntas en las etiquetas