半加器和全加器设计
- 首先我们要了解什么是半加器和全加器:
- 半加器和全加器都是用于计算二进制加法的单元
- 区别在于,半加器只有两个输入,即a,b。而全加器则多了一个输入cin,cin是进位输入
- 所以
- 半加器: a,b作为输入 sum本位和,cout进位输出作为输出
- 全加器: a,b,cin(进位输入)作为输入 sum本位和,cout进位输出作为输出
- 通过查看半加器的真值表我们可以得出,sum本位和是a与b异或门得出,cout是a与b经与门得出
半加器
上代码
module palf_add(
input a,
input b,
output sum,
output cout
);
// 方法一
assign sum = a^b;
assign cout = a&b;
// 方法二 门级原语设计
xor u1(sum,a,b);
and u2(cout,a,b);
// 方法三
//wire sum,cout; 也可以不定义线网型,wire型为默认
assign {cout,sum} = a+b;
endmodule
//下面为仿真代码
//仿真代码可以根据真值表
a = 0;b = 0;#100;
a = 1;b = 0;#100;
a = 0;b = 1;#100;
a = 1;b = 1;#100;

- 半加器的真值表较简单不在展示,根据程序综合后得到半加器波形如图所示:

一位全加器设计


- 全加器的设计与半加器同理,可以利用门级电路图来进行程序编写
- 如图即为一位全加器的逻辑电路图

//方法一
module qwe(a,b,cin,sum,cout
);
input a,b,cin;
output reg sum,cout;
// reg m1,m2,m3; 定义wire型三个门级输出作为后面门的输入
always @(a or b or cin)
begin
{sum,cout} = a + b + cin;
end
endmodule

//方法二
//利用门级原语设计一位全加器
module qazx(sum,cout,a,b,cin);
output sum,cout;
input a,b,cin;
wire s1,c1,c2;
xor u1(s1,a,b); //s1输出端口,a,b为输入端口 异或门
xor u2(sum,s1,cin);
and u3(c1,a,b);
and u4(c2,s1,cin);
or u5(cout,c1,c2);
endmodule
initial begin
// Initialize Inputs
//$为系统任务
$display("Running testbench");//显示这句话
$monitor($time,"a=%b,b=%b,cin=%b,---,cout=%b,sum=%b\n",a,b,cin,cout,sum);
//a=。。。。%表示以二进制形式显示
a = 0;b = 0;cin = 0;//初始均为零
#100 a=1'b0;b=1'b1;cin=1'b0;
#100 a=1'b1;b=1'b0;cin=1'b0;
#100 a=1'b1;b=1'b1;cin=1'b0;
#100 a=1'b0;b=1'b0;cin=1'b1;
#100 a=1'b0;b=1'b1;cin=1'b1;
#100 a=1'b1;b=1'b0;cin=1'b1;
#100 a=1'b1;b=1'b1;cin=1'b1;
#100 $stop;
end
//==============================================
//仿真激励代码,与上面效果相同
a = 0;b = 0;cin = 0;#100;
a = 1;b = 0;cin = 0;#100;
a = 0;b = 1;cin = 0;#100;
a = 0;b = 0;cin = 1;#100;
a = 1;b = 1;cin = 0;#100;
a = 0;b = 1;cin = 1;#100;
a = 1;b = 0;cin = 1;#100;
a = 1;b = 1;cin = 1;#100;
- 错误:注意区分“ ’ ”和“ ` ”的区别!!!!!!!!!
- 下面为仿真结果:

- 由两个方法的综合波形图可知,波形图一致,参照真值表确认无误
- 本文关于全加器的设计只介绍了两种较简单的方法,如需更多方法设计全加器可以点这里
- END