跳转到主要内容

FPGA中有符号数和无符号数的加法运算

judy 提交于

FPGA中有符号数和无符号数的加法运算

首先定义一个B比特的二进制数:<img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13293-388…; alt="">

verilog HDL表示正数就按一般的规则即可,这里主要讲如何表示负数?

无符号数

将(1)转换成十进制为:<img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13293-388…; alt="">

有符号数

有符号数则指所有二进制数均是补码形式的整数。

首先声明端口时增加signed关键字即可。对于B比特的二进制数据,装换成十进制数为:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13293-388…; alt=""></center>

//verilog HDL
module top(
input signed [3:0] a,
input signed [3:0] b,
output signed [3:0] sum,
output carry
);
assign {carry,sum} = a + b;
endmodule

//simulate verilog
`timescale 1 ns /1 ps
module top_tb;
reg [3:0] a;
reg [3:0] b;
wire [3:0] sum;
wire carry;
initial begin
a = 4'b0000;
b = 4'b0000;
#100;
a = 4'b0001;
b = 4'b0001;
#100;
a = 4'b0010;
b = 4'b0010;
#100;
a = 4'b0011;
b = 4'b0011;
#100;
a = 4'b0100;
b = 4'b0100;
#100;
a = 4'b0101;
b = 4'b0101;
#100;
a = 4'b0110;
b = 4'b0110;
#100;
a = 4'b0111;
b = 4'b0111;
#100;
a = 4'b1000;
b = 4'b1000;
#100;
a = 4'b1001;
b = 4'b1001;
#100;
a = 4'b1010;
b = 4'b1010;
#100;
a = 4'b1011;
b = 4'b1011;
#100;
a = 4'b1100;
b = 4'b1100;
#100;
a = 4'b1101;
b = 4'b1101;
#100;
a = 4'b1110;
b = 4'b1110;
#100;
a = 4'b1111;
b = 4'b1111;
#100;
end
top U1(
.a(a),
.b(b),
.sum(sum),
.carry(carry)
);
endmodule

仿真波形:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13293-388…; alt=""></center>

有图可知:

后八种情况是溢出至进位。

对于B比特的二进制,有符号整数的范围:

-2^(B-1)~2^(B-1)-1

文章转载自:<a href="http://blog.chinaaet.com/tutu_1583">tutu_1583</a&gt;