Verilog 有符号加减法错误

Verilog Signed Addition Subtraction error

我一直在研究一个 Verilog 程序,该程序应该在每个时钟增量上将带符号的 8 位输入添加到 16 位输出,并在接收到复位信号时复位。加法部分工作正常,甚至添加负 1 值也可以,但我在模拟小于该值的数字时得到奇怪的结果。我上次使用 Verilog 已经大约一年了,尽管尝试了我能想到的一切,但我不确定问题出在哪里。就代码而言,这是我所拥有的:

module varcount (clk, reset, in, out);
input clk, reset;
input [7:0] in;
output reg [15:0] out;
reg [15:0] temp;
reg [15:0]count;
parameter X=1000000;
always @ (posedge clk)
   begin
    if (in[7] == 1)
    begin
    temp = 16'b00000000000000001 + !in;
    count = count - temp;
    if (reset)
    begin
        count = 0;
        out = 0;
    end
    out = count;
end
    else
    begin
        count = count + in;
        if (reset)
        begin
            count = 0;
            out = 0;
        end
        out = count;
    end
end
endmodule

这是我的模拟输入:

这是我得到的输出。

这似乎是我程序中的直接错误,但我无法识别。

问题是您正在对 in 进行逻辑否定而不是按位否定。

您的代码可以通过

大大简化
  • reset 条件分支移动到顶层
  • 使用 signed 数据类型
  • 使用 Verilog-2001 风格的端口声明

例如:

module varcount (input clk, reset, 
          wire signed [7:0] in, 
   output reg signed [15:0] out);
 always @ (posedge clk)
            if (reset)
              out = 0;
            else
              out = out + in;
endmodule

我在你的代码中看到了这个:

temp = 16'b00000000000000001 + !in;
count = count - temp;

temp 看起来像是在尝试计算二进制补码。 ! 是逻辑非。你会想要 ~ 有点明智的反转。

所以你可以:

sum  <= a + (~b +1'b1);

sum <= a - b;

-b == (~b +1'b1)