我用“ always”和“ case”语句编写了一些关于7对1多路复用器的verilog代码,但是当我在ModelSim中进行仿真时,结果似乎无法按预期工作
多路复用器逻辑的一部分:
when SW[9:7] = 000, OUT = SW[0]
矛盾:
In the simulation when SW[0] is changed to 1, the outcome stays at 0.
module SevenToOneMUX(SW, OUT);
input [9:0] SW;
output reg OUT;
always@(SW[9:7])
begin
case (SW[9:7])
3'b000: OUT = SW[0];
3'b001: OUT = SW[1];
3'b010: OUT = SW[2];
3'b011: OUT = SW[3];
3'b100: OUT = SW[4];
3'b101: OUT = SW[5];
3'b110: OUT = SW[6];
endcase
end
endmodule
答案 0 :(得分:1)
问题在于,您只将SW
的3个最高有效位放在了组合块的敏感度列表中。这意味着如果always@(SW[9:7])
发生更改,编译器将仅执行SW[9:7]
块。
如果您希望模拟器在OUT
的任何一位更改时更新SW
,请将您的敏感度列表更改为以下内容:
always@(*)
begin
/*...*/
end
还应注意,在创建可合成的组合逻辑时,通常使用Verilog-2001中添加的always@(*)
。在硬件中,实际逻辑将对每个右侧变量“敏感”。这意味着:如果您描述的逻辑的任何输入发生更改,则输出也会更改。