一、半加器
半加器是一种用于对两个输入位进行求和的基本逻辑电路。它有两个输入位,分别为A和B,以及两个输出位,分别为和(Sum)和进位(Carry)。
代码实现:
/*
* @Description: 一位半加器实现,半加器是指对输入的两个一位二进制数相加(A与B),输出一个结果位(SUM)和进位(C),
没有进位的输入加法器电路,是一个实现一位二进制数的加法电路。
* @Author: Fu Yu
* @Date: 2023-07-20 19:33:10
* @LastEditTime: 2023-07-21 10:50:44
* @LastEditors: Fu Yu
*/
module adder (
input wire A ,
input wire B ,
output wire SUM ,//输出本位和
output wire Cout //输出进位
);
//第一种方法
assign SUM = A^B;
assign Cout = A&B;
// //第二种
// assign {Cout,sun} = A + B;
endmodule //adder
测试文件:
/*
* @Description: 半加器测试文件
* @Author: Fu Yu
* @Date: 2023-07-20 19:44:01
* @LastEditTime: 2023-07-21 10:03:32
* @LastEditors: Fu Yu
*/
`timescale 1ns/1ns
module adder_tb();
//定义激励信号
reg tb_A;
reg tb_B;
//定义输出信号
wire tb_SUM;
wire tb_Cout;
//模块实例化
adder u_adder(
. A (tb_A) ,
. B (tb_B) ,
. SUM (tb_SUM) ,
. Cout (tb_Cout)
);
initial begin
tb_A = 0;
tb_B = 0;
#1;
tb_A = 1;
tb_B = 0;
#1;
tb_A = 0;
tb_B = 1;
#1;
tb_A = 1;
tb_B = 1;
#1;
end
endmodule
二、1位全加器
1位全加器是在半加器的基础上进一步添加了一个输入位Carry-In(进位输入),用于处理来自上一位的进位。它有三个输入位A、B和Carry-In,以及两个输出位Sum和Carry-Out。
代码实现:
/*
* @Description: 1位全加器设计
* @Author: Fu Yu
* @Date: 2023-07-21 10:55:36
* @LastEditTime: 2023-07-21 23:28:26
* @LastEditors: Fu Yu
*/
module full_adder(
input wire x ,
input wire y ,
input wire cin ,//低位的进位
output wire s ,//本位的和
output wire cout //进位
);
//第一种
assign {cout , s} = x + y + cin;
// //第二种
// assign s = x^y^cin;
// assign cout = (x&y)|(y&cin)|(x&cin);//(x&y) | (x^y&cin)
endmodule
测试文件:
/*
* @Description: 1位全加器测试文件
* @Author: Fu Yu
* @Date: 2023-07-21 12:13:35
* @LastEditTime: 2023-07-21 13:34:30
* @LastEditors: Fu Yu
*/
`timescale 1ns/1ns
module full_adder_tb();
//激励信号的定义
reg tb_x;
reg tb_y;
reg tb_cin;
//输出信号的定义
wire tb_s;
wire tb_cout;
initial begin
repeat(10)begin
tb_x = {$random}%2;
tb_y = {$random}%2;
tb_cin = {$random}%2;
#1;
end
end
full_adder u_full_adder(
. x (tb_x) ,
. y (tb_y) ,
. cin (tb_cin) ,//低位的进位
. s (tb_s) ,//本位的和
. cout (tb_cout) //进位
);
endmodule
三、n位全加器
n位全加器是将多个1位全加器连接在一起,实现对n位二进制数进行相加的逻辑电路。它由n个1位全加器和一个最高位(Most Significant Bit,MSB)的进位输入(Carry-In)组成。每个1位全加器的进位输入来自前一个1位全加器的进位输出。
代码设计:
/*
* @Description: n位全加器设计
* @Author: Fu Yu
* @Date: 2023-07-21 13:38:31
* @LastEditTime: 2023-07-21 23:27:44
* @LastEditors: Fu Yu
*/
module adder_Nbit #(parameter N = 8)(
input wire [N-1:0] x ,
input wire [N-1:0] y ,
input wire cin ,
output wire cout ,
output wire [N-1:0] sum
);
// assign {cout,sum} = x + y + cin;
wire [N:0] C;
genvar i;
generate
for(i=0;i<N;i=i+1)
begin :my_adder//实例化循环名字
full_adder u_full_adder(
. x (x[i]),
. y (y[i]),
. cin (C[i]),
. s (sum[i]),
. cout (C[i+1])
);
end
endgenerate
assign C[0] = cin;//第一个全加器输入
assign cout = C[N];//输出最高的进位
endmodule
测试文件:
/*
* @Description: n位全加器仿真
* @Author: Fu Yu
* @Date: 2023-07-21 23:08:10
* @LastEditTime: 2023-07-21 23:11:39
* @LastEditors: Fu Yu
*/
`timescale 1ns/1ns
module adder_Nbit_tb();
parameter N = 6;
//定义激励信号
reg [N-1:0] tb_x;
reg [N-1:0] tb_y;
reg tb_cin;
//定义输出信号
wire tb_cout;
wire [N-1:0] tb_sum;
initial begin
tb_cin = 0;
repeat(10)begin
tb_x = {$random}%(2**(N-1));
tb_y = {$random}%(2**(N-1));
#1;
end
end
adder_Nbit #(.N(N)) u_adder_Nbit(
. x (tb_x) ,
. y (tb_y) ,
. cin (tb_cin) ,
. cout (tb_cout) ,
. sum (tb_sum)
);
endmodule