加法器是数字电路中经常用到的一种基本器件,主要用于两个数或者多个数的加和,加法器又分为半加器和全加器。
半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。
全加器是在半加器的基础上的升级版,除了加数和被加数加和外还要加上上一级传进来的进位信号。
本项目用按键和led灯实现,用按键代表两个二进制位的输入,用一个灯表示结果位,另一个灯表示进位输出。
一、Visio画图
模块图,真值表,波形图如图:
二、写代码
module half_adder(
input wire in_1,
input wire in_2,
output wire sum,
output wire count//注意这里sum 和 count 应该声明为 wire 类型,而不是 reg 类型,因为它们是通过连续赋值语句来生成的。
);
/* 使用 wire 的场景:
用于组合逻辑。
用于连接模块之间的信号。
用于 assign 语句。
使用 reg 的场景:
用于时序逻辑(需要在时钟边沿进行更新的信号)。
在 always 或 initial 块中存储信号。
作为组合逻辑的输出信号,但必须在 always 块中进行赋值。 */
assign {count,sum}=in_1+in_2;
endmodule
三、仿真
仿真文件编写:
`timescale 1ns/1ns
module tb_half_adder();
reg in_1;//被赋值用reg
reg in_2;
wire sum;
wire count;
//初始化
initial
begin
in_1<=1'b0;
in_2<=1'b0;
end
always #10 in_1<={$random}%2;
always #10 in_2<={$random}%2;
//打印系统函数便于观察
initial
begin
$timeformat{-9,0,"ns",6};
$monitor{"@time %t:in_1=%b,in_2=%b,sum=%b,count=%b",$time,in_1,in_2,sum,count};
end
//实例化
half_adder(
.in_1 (in_1),
.in_2 (in_2),
.sum (sum),
.count(count)
);
endmodule
仿真结果如图:
查看打印信息
与真值表一致,仿真验证通过
四、管脚绑定及上板验证
之后进行一次全编译,然后给板上电,接着下载程序,便可进行上板验证
当未按下按键时,两个按键都是高电平,都等于1,所以结果位led灯亮,结果位led不亮;
当按下其中之一的按键,一个为1,一个为0,则结果位led不亮,进位led亮;
当两个按键均按下时,两个按键均为低电平,结果位和进位输出位led均点亮。
(注:led也是低电平点亮,高电平不亮)