【问题标题】:Verilog - Addition with negative numbersVerilog - 负数加法
【发布时间】: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 是否为负数,并将操作切换为正数减去正数。唉,它没有用,我只是不知道为什么。

非常感谢您的帮助,谢谢!

【问题讨论】:

    标签: verilog negative-number


    【解决方案1】:

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

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

    尝试:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多