我有一个问题,似乎负数被解释为正数,并且添加了两个值而不是减去。这是我的代码:
module color_controller(
input [10:0] hcount,
input [10:0] vcount,
input CLK,
input [1:0] mux,
input blank,
input [1:0] sw,
output reg [7:0] RGB,
output reg [11:0] x
);
wire [2:0] a;
always @(posedge CLK)
if(mux == 2'b10)
x <= x + 1'b1;
else if(mux == 2'b01)
x <= x - 1'b1;
else x <= x;
assign a = {blank, sw};
always @(a)
begin
case(a)
0 : RGB = 8'b00111000;
1 : RGB = 8'b00111111;
2 : if(hcount > (304 + x) && hcount < (336 + x) && vcount > 224 && vcount < 256)
RGB = 8'b11000000;
else
RGB = 8'b00000000;
3 : if(vcount < 60)
RGB = 8'b00000111;
else if(vcount < 120)
RGB = 8'b00111000;
else if(vcount < 180)
RGB = 8'b11000000;
else if(vcount < 240)
RGB = 8'b00111111;
else if(vcount < 300)
RGB = 8'b11000111;
else if(vcount < 360)
RGB = 8'b11111000;
else if(vcount < 420)
RGB = 8'b00000000;
else
RGB = 8'b11111111;
default : RGB = 8'b00000000;
endcase
end
我现在要做的就是在显示器上沿x轴移动一个方框。我可以让它沿正(右)轴向左移动,向右移动直到位移值x变为负值。
我认为这是因为2的2的comp表示是FFF,但无论出于什么原因它都会到达
if(hcount > (304 + x))
它会忘记x是负数,并且我得到一个非常大的值,这样hcount将永远不会到达它,我将看不到任何内容。
我尝试通过修改以下代码来解决此问题:
2 : if(x[11] == 1'b0)
if(hcount > (304 + x) && hcount < (336 + x) && vcount > 224 && vcount < 256)
RGB = 8'b11000000;
else
RGB = 8'b00000000;
else
if(hcount > (304 - (~x+1)) && hcount < (336 - (~x+1)) && vcount > 224 && vcount < 256)
RGB = 8'b11000000;
else
RGB = 8'b00000000;
我希望附加代码检查x是否为负数,并将操作切换为正数减去正数。唉,它不起作用,我只是不知道为什么。
非常感谢帮助,谢谢!
答案 0 :(得分:0)
在verilog中,它是有符号或无符号的算术而不是数字。这个数字只是一个位模式,可以根据需要进行解释。
如果所有操作数都已签名,则Verilog仅执行带符号的算术运算。 304
是无符号十进制,强制无符号算术。这些数字还应具有与之相关的宽度,以便在宽度不足以表示值时提高代码可读性和相关警告。
尝试:
if( hcount > (12'sd304 + x) )
或
if( hcount > ($signed(304) + x) )