Hardware if-else的else块对不同条件的作用不同
我正在用if-else块编写一个简单的移位寄存器。我注意到,当控制信号为Hardware if-else的else块对不同条件的作用不同,hardware,verilog,fpga,hdl,Hardware,Verilog,Fpga,Hdl,我正在用if-else块编写一个简单的移位寄存器。我注意到,当控制信号为control=2'b00(意味着它保留默认值)时,else块正常工作,但当我给出控制值control=2'b11时,它开始向右移动,这不是我想要的 为什么else块有选择性地工作?即使在else情况下control=2'b00和control=2'b11都落下 代码和屏幕截图如下: module shift( input clock, input reset, input [1:0] control, input in,
control=2'b00
(意味着它保留默认值)时,else块正常工作,但当我给出控制值control=2'b11
时,它开始向右移动,这不是我想要的
为什么else块有选择性地工作?即使在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
上述措施也不起作用。。但我用箱子把它修好了
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;
非常简单:它根本不属于else情况
第一个条件只看低位(匹配b'd1),因此b'01和b'11都向右移位。非常简单:它根本不属于else情况
您的第一个条件只看低位(匹配b'd1),因此b'01和b'11都向右移动。
控件[0]
在您输入11
时是1
,因此我认为它工作正常。你需要一个更强大的条件来让它按照你想要的方式工作:
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;
当您输入
11
时,控件[0]
是1
,因此我认为它工作正常。你需要一个更强大的条件来让它按照你想要的方式工作:
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;
谢谢我通过使用上面编辑中的代码添加了进一步的控制,但这也不起作用,但现在我用case修复了它。编辑中的代码也有完全相同的问题。。。很高兴听到你修好了。谢谢。。我通过使用上面编辑中的代码添加了进一步的控制,但这也不起作用,但现在我用case修复了它。编辑中的代码也有完全相同的问题。。。很高兴听到你修好了,谢谢。我设法用case添加了更多控件。。虽然我仍然想知道为什么在我的原始帖子中添加了if else的编辑后,它不起作用?@I惩罚:你没有显示你的
右侧
和左侧
,但在我看来,你犯了与开始时完全相同的错误。我的意思是,如果设置了right
,您的逻辑设置为向右移动,而不关心left
的值是多少。hmmm。我假设您谈论的是关于if-else的编辑,而不是案例。。这就是你的意思:if(right&&&left)//shift right
?如果不是,请举例说明你的意思“不关心左
值。感谢you@ipunished:是的,right&~left
是您需要使用的条件。谢谢。我设法用case添加了更多控件。。虽然我仍然想知道为什么在我的原始帖子中添加了if else的编辑后,它不起作用?@I惩罚:你没有显示你的右侧
和左侧
,但在我看来,你犯了与开始时完全相同的错误。我的意思是,如果设置了right
,您的逻辑设置为向右移动,而不关心left
的值是多少。hmmm。我假设您谈论的是关于if-else的编辑,而不是案例。。这就是你的意思:if(right&&&left)//shift right
?如果没有,请举例说明“不关心左
值”的含义。谢谢you@ipunished:是的,right&~left
是您需要使用的条件。