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)
我一直在研究一个 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)