Verilog签名加法减法错误

时间:2017-02-10 01:35:00

标签: verilog addition signed

我一直致力于Verilog程序,它应该在每个时钟增量上为16位输出添加一个带符号的8位输入,并在接收到复位信号时复位。添加部分工作正常,甚至添加负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

这是我的模拟输入:

enter image description here

这是我得到的输出。

enter image description here

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

2 个答案:

答案 0 :(得分:0)

问题是你在对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

答案 1 :(得分:0)

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

temp = 16'b00000000000000001 + !in;
count = count - temp;
临时看起来像你试图计算二重补。 !是合乎逻辑的NOT。你希望~有点反转。

所以你可以:

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

sum <= a - b;

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