Verilog-负数加法

Verilog-负数加法,verilog,negative-number,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

我遇到了一个问题,一个负数被解释为正数,两个值相加而不是相减。这是我的密码:

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是负数,我得到了一个非常大的值,因此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是否为负数,并将操作切换为正数减去正数。唉,它不起作用,我只是不知道为什么


非常感谢您的帮助,谢谢

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

Verilog仅在所有操作数都有符号时执行有符号算术。304是无符号十进制强制无符号算术。这些数字还应该有一个与其关联的宽度,以提高代码可读性,并在宽度不足以表示该值时发出相关警告

尝试:

            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;
if( hcount > (12'sd304 + x) )
if( hcount > ($signed(304) + x) )