FPGA有符号数输入signed的类型设置

FPGA有符号数输入signed的类型设置

src & tb :input signed的情况

module signed_verify (out_add,out_minus,out_mult,out_divide,out_compare,a,b);
output wire signed[15:0]out_add;
output wire signed[15:0]out_minus;
output wire signed[15:0]out_mult;
output wire signed[15:0]out_divide;
output wire signed[15:0]out_compare;
input signed [7:0] a;
input signed [7:0] b;

assign out_add = a+b;
assign out_minus = a-b;
assign out_mult = a*b;
assign out_divide = a/b;
assign out_compare =(a>b)?a:b;
endmodule

`timescale 1ns/1ps
module signed_tb;
reg [7:0] a=0;
reg [7:0] b=0;
wire[15:0] out_add,out_minus,out_mult,out_divide,out_compare;

signed_verify U0(
.out_add (out_add),
.out_minus (out_minus),
.out_mult (out_mult),
.out_divide (out_divide),
.out_compare (out_compare),
.a (a),
.b (b)
);

initial
begin
#20
a=30;b=5;
#20
a=-30;b=5;
#20
a=30;b=-5;
#20
a=-30;b=-5;
#20
a=8’b0001_1110;b=8’b0000_0101; //Complement code
#20
a=8’b1110_0010;b=8’b0000_0101;
#20
a=8’b0001_1110;b=8’b1111_1011;
#20
a=8’b1110_0010;b=8’b1111_1011;
#20
$stop;
end
endmodule

仿真结果:

FPGA有符号数输入signed的类型设置

在input写了signed,tb里面的输入要么用十进制有符号输入,要么用二进制补码输入,结果完全正确。


src & tb :input 不加 signed的情况

module signed_verify (out_add,out_minus,out_mult,out_divide,out_compare,a,b);
output wire signed[15:0]out_add;
output wire signed[15:0]out_minus;
output wire signed[15:0]out_mult;
output wire signed[15:0]out_divide;
output wire signed[15:0]out_compare;
input [7:0] a; //no signed
input [7:0] b; //no signed

wire signed[15:0] out_add,out_minus,out_mult,out_divide,out_compare;

assign out_add = a+b;
assign out_minus = a-b;
assign out_mult = a*b;
assign out_divide = a/b;
assign out_compare =(a>b)?a:b;
endmodule

`timescale 1ns/1ps
module signed_tb;
reg [7:0] a=0;
reg [7:0] b=0;
wire signed[15:0] out_add,out_minus,out_mult,out_divide,out_compare;

signed_verify U0(
.out_add (out_add),
.out_minus (out_minus),
.out_mult (out_mult),
.out_divide (out_divide),
.out_compare(out_compare),
.a (a),
.b (b)
);

initial
begin
#20
a=30;b=5;
#20
a=-30;b=5;
#20
a=30;b=-5;
#20
a=-30;b=-5;
#20
a=8’b0001_1110;b=8’b0000_0101; //Complement code
#20
a=8’b1110_0010;b=8’b0000_0101;
#20
a=8’b0001_1110;b=8’b1111_1011;
#20
a=8’b1110_0010;b=8’b1111_1011;
#20
$stop;
end
endmodule

仿真结果:

1:查看signed的波形图

FPGA有符号数输入signed的类型设置

2:查看unsigned的波形图:

FPGA有符号数输入signed的类型设置

没写signed,tb里面即使输入用十进制有符号输入,二进制补码输入,结果不正确。但不难发现,如果把输入查看的类型设置成unsigned,但从波形上看正确,结论就是参与计算的数有一个没有设置成signed,结果都是默认unsigned计算的。


后续验证发现,在源程序不设置signed而在测试里设置signed,结果不正确; 而在源程序输入输出设置成了signed,测试可以不设置成signed,只标明位宽即可。

比较粗浅,仅供参考,希望对初学者有点帮助。