否则阻止if-else对不同条件采取不同的行动

时间:2013-01-16 19:24:46

标签: hardware verilog fpga hdl

我正在使用if else块编写一个简单的移位寄存器。我注意到,当控制信号为control = 2'b00时(意味着它保留了默认值),else块会正常工作(但是当我给出控制值control = 2'b11时,它开始向右移动,这不是我想要的是。

为什么else块有选择地工作?即使control = 2'b00control = 2'b11同时属于其他情况?

下面的代码和截图:

module shift(
input clock,
input reset,
input [1:0] control,
input in,
output [7:0] out
);

reg [7:0] r_reg, r_next; //a 7 bit shift register which will be output as is, this can be changed to any size

always @ (posedge clock or posedge reset)
begin
    if(reset)
        r_reg <= 0;
    else
        r_reg <= r_next;
end

always @ (*)

begin

if(control[0]) //shift right
    r_next = {in, r_reg[7:1]};

else if(control[1]) //shift left
    r_next = {r_reg[6:0], in};

else
    r_next = r_reg; //default state stays the same

end

assign out = r_reg;

endmodule

enter image description here

编辑:

if(right) //shift right
    r_next = {in, r_reg[7:1]};

else if(left) //shift left
    r_next = {r_reg[6:0], in};

else if((~right & ~left) || (right & left))
    r_next = r_reg; //default state stays the same

以上也不起作用..但我用案例修复了它。

case(control)
    2'b01: r_next = {in, r_reg[7:1]};
    2'b10: r_next = {r_reg[6:0], in};
    default: r_next = r_reg;

2 个答案:

答案 0 :(得分:2)

很简单:它根本不属于其他情况。

你的第一个条件只看低位(匹配b'd1),因此b'01和b'11都向右移动。

答案 1 :(得分:2)

当您输入control[0]时,

111,因此我认为它按预期工作。你需要一个更强大的条件才能让它以你想要的方式运作:

if (control == 2'b01)          // shift right
    r_next = {in, r_reg[7:1]};

else if (control == 2'b10)     // shift left
    r_next = {r_reg[6:0], in};

else                           // default state stays the same
    r_next = r_reg;