概述
目录
1.理论学习
2.半加器实验
2.1实验目标
2.2系统框图
2.3真值表与波形图
2.4硬件资源说明
2.5代码
RTL代码:
仿真代码:
仿真结果:
3.全加器实验
3.1实验目标
3.2系统框图
3.3真值表与波形图
3.4硬件资源说明
3.5代码
RTL代码:
仿真代码:
1.理论学习
数字电路中加法器是经常用到的一种基本器件,主要用于两个数或者多个数的加和,加法器又分为半加器(half adder)和全加器(full adder)。
半加器是指对两个输入数据位相加,输出一个求和结果位和进位,没有进位输入的加法器电路。实现两个一位二进制数的加法运算电路,是加法器的基本单元。
全加器是在半加器的基础上的升级版,输入除了加数和被加数外还要加上上一级传进来的进位信号。
2.半加器实验
2.1实验目标
设计并实现一个半加器,使用开发板上的按键 KEY1、 KEY2 作为输入,LED 灯D6 表示相加和的输出, LED 灯 D7 表示进位输出。
2.2系统框图
2.3真值表与波形图
2.4硬件资源说明
KEY1、KEY2分别对应in1、in2,LED 灯D6、LED 灯 D7分别作为输出和与进位。
2.5代码
RTL代码:
`timescale
1ns/1ns
module
half_adder01
(
input
wire
in1 ,
//加数1
input
wire
in2 ,
//加数2
output
reg
sum ,
//加和
output
reg
cout
//进位
);
//第一种:拼接符
//assign
{cout, sum} = in1 + in2;
//第二种
/*always@(*)
case ({in1,in2})
2'b00:
{cout, sum} =
2'b00;
2'b11:
{cout, sum} =
2'b10;
2'b01:
{cout, sum} =
2'b01;
2'b10:
{cout, sum} =
2'b01;
default:
{cout, sum} =
2'b00;
endcase*/
//第三种:逻辑运算
//异或运算
always@(*)
if(in1 == in2)
sum = 0;
else
sum = 1;
//与运算
always@(*)
if((in1 == 1) && (sum == 0))
cout = 1;
else
cout = 0;
endmodule
仿真代码:
`timescale
1ns/1ns
module
tb_half_adder();
//wire
define
wire
sum;
wire
cout;
reg
in1;
reg
in2;
//初始化输入信号
initial
begin
in1 <=
1'b0;
in2 <=
1'b0;
end
always #10 in1 <= {$random} % 2;
always #10 in2 <= {$random} % 2;
initial
begin
$timeformat(-9, 0, "ns", 6);
$monitor("@time %t: in1=%b in2=%b sum=%b cout=%b", $time, in1, in2, sum, cout);
end
half_adder
half_adder_inst
(
.in1
(in1
),
.in2
(in2
),
.sum
(sum
),
.cout
(cout )
);
endmodule
仿真结果:
3.全加器实验
3.1实验目标
由上面半加器的基础,实现全加器只需在输入部分添加一个进位即可。
3.2系统框图
全加器的单位是半加器故采用层次化设计,直接例化半加器的功能进行设计。一来设计更加简便,二来结构更加清晰。
3.3真值表与波形图
3.4硬件资源说明
KEY1、KEY2、 KEY3 分别作为被加数 in1、被加数 in2 和进位信号 cin 的信号输入;
LED 灯 D5作为和的输出 sum,以 LED 灯 D6 作为进位的输出 count。
3.5代码
RTL代码:
`timescale
1ns/1ns
module
full_adder
//输入信号的声明
(
input
wire
in1 ,
//加数1
input
wire
in2 ,
//加数2
input
wire
cin ,
output
wire
sum ,
//两个数的加和
output
wire
cout
//加和后的进位
);
wire
h0_sum;
//中间连线
wire
h0_cout;
//中间连线
wire
h1_cout;
//中间连线
half_adder
half_adder_inst0
(
//前面是实例化(调用)的模块的名字相当于是告诉顶层我要使用来自half_adder这个模块的功能
.in1
(in1
),
//input
in1
前面in1是相当于half_adder模块中的信号,(in1)顶层中的信号,然后最前面加上“.”,可以形象的理解为把这两个信号线连接到一起(rtl中的实例化过程和Testbench中的实例化过程是一样的,可以对比理解学习)
.in2
(in2
),
//input
in2
.sum
(h0_sum ),
//ouptut
sum
.cout
(h0_cout)
//output
cout
);
half_adder
half_adder_inst1
(
//同一个模块可以被实例化多次(所以相同功能只设计一个通用模块即可),但是在顶层的名字一定要区别开,这样子才能表达出是实例化的两个相同功能的模块
.in1
(h0_sum ),
//input
in1
.in2
(cin
),
//input
in2
.sum
(sum
),
//ouptut
sum
.cout
(h1_cout)
//output
cout
);
//cout:总的进位信号
assign
cout = h0_cout | h1_cout;
endmodule
仿真代码:
`timescale
1ns/1ns
module
tb_full_adder();
wire
sum;
wire
cout;
//reg
define
reg
in1;
reg
in2;
reg
cin;
//初始化输入信号
initial
begin
in1 <= 1'b0;
in2 <= 1'b0;
cin <= 1'b0;
end
//in1:产生输入随机数,模拟加数1的输入情况
always #10 in1 <= {$random} % 2;
//取模求余数,产生随机数1'b0、1'b1,每隔10ns产生一次随机数
always #10 in2 <= {$random} % 2;
always #10 cin <= {$random} % 2;
initial begin
$timeformat(-9, 0, "ns", 6);
$monitor("@time %t: in1=%b in2=%b cin=%b sum=%b cout=%b", $time, in1, in2, cin, sum, cout);
end
full_adder
full_adder_inst
(
.in1
(in1
),
//input
in1
.in2
(in2
),
//input
in2
.cin
(cin
),
//input
cin
.sum
(sum
),
//output
sum
.cout
(cout
)
//output
cout
);
endmodule
最后
以上就是秀丽白开水为你收集整理的FPGA组合逻辑—加法器1.理论学习2.半加器实验3.全加器实验的全部内容,希望文章能够帮你解决FPGA组合逻辑—加法器1.理论学习2.半加器实验3.全加器实验所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复