¿Qué pasa con mi multiplexor Verilog?

0

Creé un multiplexor de 2 bits de 2 vías:

module mux2(c, x, y, m);
  input c;
  input [3:0] x;
  input [3:0] y;
  output [9:0] m;

  assign m[3:0] = (~c & x) | (c & y);
  assign m[9:4] = 0;
endmodule

Lo instalé desde mi módulo de nivel superior:

module top(SW, LEDR);
  input [9:0] SW;
  output [9:0] LEDR;

  mux2 mymux(SW[9], SW[3:0], SW[7:4], LEDR[9:0]);
endmodule

Hice una simulación funcional en Altera Quartus Prime Lite en un Cyclone V 5CSEMA5F31C6 (importando asignaciones de DE1_SoC.qsf ) y obtuve esta forma de onda inesperada:

Comoseesperaba,lasalidaMsigueaXcuandoCesbaja;sinembargo,MnosigueaYcuandoCesalta.Ensulugar,parecetenerunacombinacióndevaloresXeY.

Aquíhayunaversiónexpandidadelaformadeondaanterior:

Supongo que estoy instanciado mux2 incorrectamente pero no veo lo que hice mal.

    
pregunta Ellen Spertus

1 respuesta

3

En lugar de

assign m[3:0] = (~c & x) | (c & y);

debes usar un operador ternario como tal

assign m[3:0] = c ? y : x;

Alternativamente, puedes expandir c para que tenga el mismo ancho que xey, así como:

assign m[3:0] = (~{4{c}} & x) | ({4{c}} & y);

No, el operador ternario es mucho más conciso.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas