首先,让我们区别一下半加器与全加器。
半加器(HA)有两个代表数字(A0,B0)有两个输出端,用于输出和S0及进位C1(只考虑两个1位二进制数A和B相加,不考虑低进位来的进位数相加称为半加)
全加器(FA)有三个输入端,以输入Ai、Bi、Ci,有两个输出端Si,Ci+1(除了两个1位二进制数,还与低位向本位的进数相加称为全加器。)
半加器没有接收进位的输入端,全加器有进位输入端,在将两个多位二进制数相加时,除了最低位外,每一位都要考虑来自低位的进位,半加器则不用考虑,只需要考虑两个输入端相加即可。
那么,如何用FPGA实现半加器的功能呢?
首先,我们用Visio软件来进行简单的绘图:
In_1和In_2代表了两个输入 ,sum代表了两个输入之和,而count代表了两个输入的进位,再用Visio进行绘图时,我们同时绘制了真值表和波形图,以便ModelSim仿真结束后进行对照。
下面是进行代码编写
module half_adder
(
input wire in_1,
input wire in_2,
output wire sum,
output wire count
);
assign {count,sum} = in_1 + in_2;
endmodule
在Quartus中进行RTL视图,如下:
下面进行tb赋值程序的编写:
`timescale 1ns/1ns
module tb_half_adder();
reg in_1;
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,sum=%b",$time,in_1,in_2,sum,count);
end
half_adder half_adder_inst
(
.in_1 (in_1),
.in_2 (in_2),
.sum (sum),
.count (count)
);
endmodule
在此赋值程序中,random函数的作用是产生一个随机数,用这个随机数%2的余数非0即1,以用作输入。
点击仿真得到的波形图如下:
与Visio进行对照结果几乎一致,仿真完成