我一直致力于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
这是我的模拟输入:
这是我得到的输出。
这似乎是我程序中的直接错误,但我无法识别它。
答案 0 :(得分:0)
问题是你在对in
进行逻辑否定而不是按位否定。
可以大大简化您的代码
reset
条件分支移至顶级signed
数据类型例如:
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)