#verilog
#verilog
Вопрос:
Я пытаюсь реализовать мультиплексор 4×1 в Verilog. Я хочу подключить enable (en) в качестве порта, ввод которого ‘1’ (high) может НА мультиплексоре, а ‘0’ (low) отключить этот мультиплексор. Пожалуйста, предложите некоторые изменения в моем коде. Заранее спасибо.
module mux_4_to_1(
input d,c,b,a, //Inputs
input s1,s0, //Select Lines
input en, //enable
output reg y //output
);
always @ (*)
begin
case (s0 | s1)
2'b00 : y <= a;
2'b01 : y <= b;
2'b10 : y <= c;
2'b11 : y <= d;
default : y <= 0;
endcase
end
endmodule
Ответ №1:
Вы хотите en
действовать как глобальный коммутатор для включения или выключения мультиплексора, чтобы он получал наивысший приоритет.
always @ (*)
begin
if (en) begin
case ({s0, s1}) // pay attention here
2'b00 : y = a;
2'b01 : y = b;
2'b10 : y = c;
2'b11 : y = d;
default : y = 0;
endcase
end
else begin
y = 1'b0; // your question didn't specify the expected output when OFF
end
end
Пожалуйста, обратите внимание, что я изменился case (s0 | s1)
на case ({s0, s1})
.
s0 | s1
возвращает результат шириной в 1 бит, в то время как вам нужна конкатенация s0
и s1
.
Кроме того, я заменил все NBA <=
на BA =
.
И default
ветвь на самом деле не могла произойти в silicon, потому что вы указали все возможные комбинации. Но если вы считаете, что это может быть полезно при моделировании, вы можете оставить его.