我用"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发布于 2019-06-01 07:26:25
问题是您只将SW的3个最重要的位放在您的组合块的敏感度列表中。这意味着,如果SW[9:7]发生变化,编译器将只执行always@(SW[9:7])块。
如果您想要模拟器在SW的任何位发生变化时更新OUT,请将您的灵敏度列表更改为:
always@(*)
begin
/*...*/
end还值得注意的是,在创建可综合的组合逻辑时,通常使用在Verilog-2001中添加的always@(*)。在硬件中,真正的逻辑对右边的每个变量都是“敏感的”。这意味着:如果您描述的逻辑的任何输入发生变化,输出也将发生变化。
https://stackoverflow.com/questions/56402227
复制相似问题