前言
在数字电路中,加法器是一种常见的逻辑电路,用于将两个数字相加。本文将介绍如何使用Verilog实现各种加法器。
1 加法器种类
整数加法器
- 半加器(Half Adder):它是最简单的加法器,只能进行两个输入位的相加操作,不包括进位位。
- 全加器(Full Adder):它是最基本的加法器,可以对两个输入位和进位位进行相加,并产生一个输出位和进位输出。
- 多位加法器(Bit Adder):它是全加器的扩展,可以对多位输入进行相加操作,并产生多位输出和进位输出。
– 串行加法器(Serial Adder):它是通过按位逐个相加的方式实现加法功能,适用于串行输入和输出的情况。
– 并行加法器(Parallel Adder):它是通过同时对多个位进行相加的方式实现加法功能,适用于并行输入和输出的情况。
浮点加法器
- 浮点加法器(Floating Point Adder):它是用于对浮点数进行加法操作的加法器,通常使用IEEE 754标准的浮点数表示。
- 累加器(Accumulator):它是一种特殊的加法器,可以对输入信号进行累加,输出结果为累加的和。
2 半加法器
半加法器的功能是将两个输入位相加,并输出两个结果:一个是和位,即两个输入位相加的结果;另一个是进位位,表示相加操作是否产生了进位。在Verilog中,可以使用逻辑运算符和位选择器来实现半加法器。
根据真值表,可以快速的得到输入输出关系(逻辑结构)是:
- cout = a^b(表示a异或b)
- sum = a&b(表示a与b)
// 半加器模块定义
module half_adder(
input a, // 输入a
input b, // 输入b
output sum, // 输出和
output carry // 输出进位
);
assign sum = a ^ b; // 异或操作得到和
assign carry = a & b; // 与操作得到进位
endmodule
// 测试模块
module test;
reg a, b; // 输入寄存器
wire sum, carry; // 输出线
// 实例化半加器模块
half_adder ha(
.a(a),
.b(b),
.sum(sum),
.carry(carry)
);
// 测试数据
initial begin
a = 0; b = 0; // 输入为0
#10;
a = 0; b = 1; // 输入为1
#10;
a = 1; b = 0; // 输入为1
#10;
a = 1; b = 1; // 输入为0
#10;
$finish; // 结束仿真
end
// 显示结果
always @(sum, carry)
$display("a = %b, b = %b, sum = %b, carry = %b", a, b, sum, carry);
initial begin
$dumpfile("wave.vcd"); // 指定用作dumpfile的文件
$dumpvars; // dump all vars
end
endmodule
开始执行了, 好激动,只要执行bat 一键批处理。
从打印的 log 看结果完全符合, 看看仿真波形是什么样子
仿真波形对应四个测试用例,妥妥的。这里用的是 gtkwave 查看波形, 非常方便
关于真值表
真值表(truth table)列出电路中每个输入组合的输出结果。有助于了解和验证电路的行为,并验证设计的正确性。真值表通常用于验证小规模和简单的电路。对于较大的电路,其他建模和仿真技术(如行为级建模、模块化测试等)可能更适合。
代码设计的时候,并不要求用真值表。
关于门电路
在使用Verilog编写代码时,可以按照门电路的思路进行设计,但并不一定要完全按照门电路的方式编写。
3. 1 位全加法器
全加法器与半加法器类似,但它还需要考虑来自前一位的进位。为了实现全加法器,我们需要使用两个半加法器和一个或门。
3.1 用两个半加器来组成一个全加器
设计
module add_full(
input A ,
input B ,
input Ci ,
output wire S ,
output wire Co
);
wire c_1;
wire c_2;
wire sum_1;
add_half add_half_1(
.A (A),
.B (B),
.S (sum_1),
.C (c_1)
);