【发布时间】:2015-01-26 02:25:31
【问题描述】:
我遇到了一个问题,似乎负数被解释为正数,并且两个值被相加而不是相减。这是我的代码:
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 变为负值。
我认为发生这种情况是因为 -1 的 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 是否为负数,并将操作切换为正数减去正数。唉,它没有用,我只是不知道为什么。
非常感谢您的帮助,谢谢!
【问题讨论】: