我正在使用if else块编写一个简单的移位寄存器。我注意到,当控制信号为control = 2'b00
时(意味着它保留了默认值),else块会正常工作(但是当我给出控制值control = 2'b11
时,它开始向右移动,这不是我想要的是。
为什么else块有选择地工作?即使control = 2'b00
和control = 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
编辑:
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;
答案 0 :(得分:2)
很简单:它根本不属于其他情况。
你的第一个条件只看低位(匹配b'd1),因此b'01和b'11都向右移动。
答案 1 :(得分:2)
control[0]
时, 1
为11
,因此我认为它按预期工作。你需要一个更强大的条件才能让它以你想要的方式运作:
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;