¿Combinación de línea de selección no utilizada en 3x1 MUX?

2

Al diseñar un mux 3: 1 necesitamos 2 líneas de selección, pero una combinación no es útil, digamos 2'b11. Si se produce esta combinación, la salida se convierte en 0 independientemente del valor de las líneas de entrada. ¿No es correcta la salida de 'x' en este caso? Entonces, ¿es una condición adicional para hacer que la salida 'x' se requiera en este código?

module mux(
  input wire a,
  input wire b,
  input wire c,
  input wire[1:0] sel,
  output wire y
);
  assign y = (a&(sel==2'b00))|(b&(sel==2'b01))|(c&(sel==2'b10))|(1'bx&(sel==2'b11));
  endmodule
    
pregunta user4707328

2 respuestas

4

Hay una manera mucho mejor de hacer un multiplexor, usando un vector.

Ejemplo:

module mux(
  input wire a,
  input wire b,
  input wire c,
  input wire[1:0] sel,
  output wire y
);
  wire [3:0] mux = {1'b0,c,b,a};
  assign y = mux[sel];
endmodule

En este caso, asigna sus salidas a la variable 'mux' y luego la salida será el elemento sel 'th en el vector.

Realmente no existe un mux 3: 1: siempre tendrá una entrada \ $ 2 ^ n \ $ donde \ $ n \ $ es el número de bits en la señal de selección. Así que tienes que tener alguna forma de manejar la condición extra. Una opción es elegir una constante fija como 0 o 1 (que depende de a qué se conecta más adelante, por ejemplo, es posible que desee un 1 si está manejando un bus que se considera 'inactivo' cuando está alto). Alternativamente, puede agregar algún tipo de comprobación de errores, por ejemplo, tener un bit de salida adicional para indicar que hubo un error (o tener la lógica opuesta y significa que la salida es válida).

Ejemplo:

module mux(
  input wire a,
  input wire b,
  input wire c,
  input wire[1:0] sel,
  output wire y,
  output wire valid
);
  wire [3:0] mux = {1'b0,c,b,a};
  assign y = mux[sel];
  assign valid = (sel != 2'b11);
endmodule

En este ejemplo, cuando la señal sel tiene un valor que no es 3, entonces la señal de salida valid será alta para indicar que la entrada fue correcta. De lo contrario, si la entrada es 3, entonces la señal valid será baja para indicar que la entrada no fue válida.

Vale la pena señalar las razones por las que es preferible usar un vector de esta manera. En primer lugar, es bastante fácil de seguir: si comparas tu código con el ejemplo, es mucho más claro lo que sucede utilizando un vector comparado con tener que descodificar la lógica. En segundo lugar, y lo que es más importante, permite una parametrización más fácil, puede agregar un parámetro a su bloque que escalará correctamente la señal de selección y la señal de mux en función del parámetro, aunque para hacer esto, también tendría que convertir las señales de entrada en un vector también que incluso eliminaría la necesidad de la variable 'mux'.

    
respondido por el Tom Carpenter
3

Si bien el uso del valor x en una simulación se puede usar para identificar un comportamiento inesperado, dicha declaración no tendrá sentido si sintetiza su código en una representación a nivel de nivel.

Y one-liners puede ser bonito, pero hacen que el código sea más difícil de leer. Además, las construcciones pueden no ser identificadas correctamente por la herramienta de síntesis, lo que resulta en optimizaciones ineficientes. En este caso específico, le aconsejaría que utilice la declaración de caso "estándar":

module mux(
  input wire a,
  input wire b,
  input wire c,
  input wire[1:0] sel,
  output reg y
);  
  always @(*) begin
    case (sel)
      2'b00 : y = a;
      2'b01 : y = b;
      2'b10 : y = c;
      2'b11 : y = 1'b0;
    endcase
  end 
endmodule

Esto es obviamente una cuestión de opinión, pero aunque no es tan bonito, será mucho más fácil de leer porque la relación entre el valor sel y la asignación a y se declara explícitamente.

@TomCarpenter ya explicó en detalle los problemas relacionados con la selección no válida y también introdujo una señal válida que es una muy buena solución para este problema, por lo que no me extenderé sobre ese tema.

    
respondido por el Vitor

Lea otras preguntas en las etiquetas