Verilog - 添加负数

时间:2015-01-26 02:25:32

标签: verilog negative-number

我有一个问题,似乎负数被解释为正数,并且添加了两个值而不是减去。这是我的代码:

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是否为负数,并将操作切换为正数减去正数。唉,它不起作用,我只是不知道为什么。

非常感谢帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

在verilog中,它是有符号或无符号的算术而不是数字。这个数字只是一个位模式,可以根据需要进行解释。

如果所有操作数都已签名,则Verilog仅执行带符号的算术运算。 304是无符号十进制,强制无符号算术。这些数字还应具有与之相关的宽度,以便在宽度不足以表示值时提高代码可读性和相关警告。

尝试:

if( hcount > (12'sd304 + x) )

if( hcount > ($signed(304) + x) )