全加器模块例化实现4位加法器
一、 实验目的
用模块例化方式,用4个全加器实现一个四位加法器
掌握模块例化的方法,了解进位与二进制数加法的操作流程,用小的逻辑单元组合成大的逻辑单元,理解加法器的构造。
二、 实验内容
1. 实验流程
① 分析实验目的,本次实验用模块例化的方式,用4个全加器实现四位加法器,关键在于规划好四个全加器的进位关系和输出。
② 每个全加器模块,输入本位的两个加数以及来自低位的进位,输出本位的计算结果和向高位的进位
③ 由于最高位可能有进位,故四位加法器计算的结果应该有五位数。
④ 综上在top文件中应当输入两个4位向量,表示两个加数,输出一个5位向量,表示计算结果,在top.v文件中还需要调用4个全加器,用来进行每位的加法,由于每个全加器会有向高位的进位,故还需要定义变量用来传递进位信息。
⑤ 根据实验分析写代码并上板实验。
2. Verilog代码分析
(1) Design source(.v文件):
top.v:
module fourbitadder(
input [3:0]X,
input [3:0]Y,
output [4:0]R
);
wire [2:0]a;//存储进位
onebitfulladder r0(.A(X[0]),
.B(Y[0]),
.Cin(0),
.S(R[0]),
.Co(a[0])
);
onebitfulladder r1(.A(X[1]),
.B(Y[1]),
.Cin(a[0]),
.S(R[1]),
.Co(a[1])
);
onebitfulladder r2(.A(X[2]),
.B(Y[2]),
.Cin(a[1]),
.S(R[2]),
.Co(a[2])
);
onebitfulladder r3(.A(X[3]),
.B(Y[3]),
.Cin(a[2]),
.S(R[3]),
.Co(R[4])
);
Endmodule
一位全加器:
module onebitfulladder(
input A,
input B,
input Cin,
output S,
output Co
);
assign{Co,S}=A+B+Cin;
endmodule
.v分析:
Ⅰtop.v文件:
① input两个四位向量X,Y表示两个加数,通过拨动开关可以控制相加的两数的实际大小。
② output一个五位的向量R表示计算的结果,最高位表示来自X,Y最高位相加的进位
③ 定义了一个三位的wire类型向量,用于储存低三位的进位,在模块调用中传递信息。
④ 调用4个子模块,每个子模块都是一个全加器,最低位时Cin低位进位为0,最高位时向高位的进位到R[4]
Ⅱonebitfulladder.v文件:
① input两个加数A,B以及来自低位的进位Cin。
② output计算结果S和向高位的进位Co。
③ assign语句赋值,用拼接符对进位和计算结果直接赋值
(2) Constraints source(.xdc文件)
# Nexys4 Pin Assignments
############################
# On-board Slide Switches #
############################
set_property PACKAGE_PIN J15 [get_ports X[0]]
set_property IOSTANDARD LVCMOS33 [get_ports X[0]]
set_property PACKAGE_PIN L16 [get_ports X[1]]
set_property IOSTANDARD LVCMOS33 [get_ports X[1]]
set_property PACKAGE_PIN M13 [get_ports X[2]]
set_property IOSTANDARD LVCMOS33 [get_ports X[2]]
set_property PACKAGE_PIN R15 [get_ports X[3]]
set_property IOSTANDARD LVCMOS33 [get_ports X[3]]
set_property PACKAGE_PIN R17 [get_ports Y[0]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[0]]
set_property PACKAGE_PIN T18 [get_ports Y[1]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[1]]
set_property PACKAGE_PIN U18 [get_ports Y[2]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[2]]
set_property PACKAGE_PIN R13 [get_ports Y[3]]
set_property IOSTANDARD LVCMOS33 [get_ports Y[3]]
#set_property PACKAGE_PIN T8 [get_ports swt[8]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[8]]
#set_property PACKAGE_PIN U8 [get_ports swt[9]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[9]]
#set_property PACKAGE_PIN R16 [get_ports swt[10]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[10]]
#set_property PACKAGE_PIN T13 [get_ports swt[11]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[11]]
#set_property PACKAGE_PIN H6 [get_ports swt[12]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[12]]
#set_property PACKAGE_PIN U12 [get_ports swt[13]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[13]]
#set_property PACKAGE_PIN U11 [get_ports swt[14]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[14]]
#set_property PACKAGE_PIN V10 [get_ports swt[15]]
#set_property IOSTANDARD LVCMOS33 [get_ports swt[15]]
############################
# On-board led #
############################
set_property PACKAGE_PIN H17 [get_ports R[0]]
set_property IOSTANDARD LVCMOS33 [get_ports R[0]]
set_property PACKAGE_PIN K15 [get_ports R[1]]
set_property IOSTANDARD LVCMOS33 [get_ports R[1]]
set_property PACKAGE_PIN J13 [get_ports R[2]]
set_property IOSTANDARD LVCMOS33 [get_ports R[2]]
set_property PACKAGE_PIN N14 [get_ports R[3]]
set_property IOSTANDARD LVCMOS33 [get_ports R[3]]
set_property PACKAGE_PIN R18 [get_ports R[4]]
set_property IOSTANDARD LVCMOS33 [get_ports R[4]]
#set_property PACKAGE_PIN V17 [get_ports led[5]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[5]]
#set_property PACKAGE_PIN U17 [get_ports led[6]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[6]]
#set_property PACKAGE_PIN U16 [get_ports led[7]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[7]]
#set_property PACKAGE_PIN V16 [get_ports led[8]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[8]]
#set_property PACKAGE_PIN T15 [get_ports led[9]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[9]]
#set_property PACKAGE_PIN U14 [get_ports led[10]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[10]]
#set_property PACKAGE_PIN T16 [get_ports led[11]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[11]]
#set_property PACKAGE_PIN V15 [get_ports led[12]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[12]]
#set_property PACKAGE_PIN V14 [get_ports led[13]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[13]]
#set_property PACKAGE_PIN V12 [get_ports led[14]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[14]]
#set_property PACKAGE_PIN V11 [get_ports led[15]]
#set_property IOSTANDARD LVCMOS33 [get_ports led[15]]
.xdc分析
① “#”代表被注释的引脚。
② 每个引脚两行语句:第一行代表引脚在实验板上的位置;第二行代表输入输出标准电平3.3V
③ 引脚锁定文件使用到的引脚名称与design source中所使用到变量名称相对应
④ 本次实验中用到 8个输入引脚和5和 led灯输出引脚
(3) Elaborated design:
三、 实验结论
① 本次实验中,我了解了全加器的功能:用两个加数,低位进位计算本位结果和向高位的进位。
② 通过调用4个全加器模块进行从低位到高位的逐步相加输出进位,我对4位加法器的构造有了更加深刻的印象,经过本次实验,我能够实现任意有限位的加法器,可以通过调用一位全加器实现,也可以通过调用四位全加器等逻辑功能单位实现。
③ 通过上一次的7段数码管的实验和本次实验,我对模块例化的两种方法都进行了尝试,比较发现,使用本次实验中模块例化的方式能够在今后更加复杂的电路中保证更高的正确率。
四、 思考与讨论
(一) 问题与提升:
对超前进位加法器和行波进位加法器的比较
RCA(行波) | CLA(超前) | |
---|---|---|
特点结构 | 低位全加器的Cout连接到高位全加器的Cin | 每个全加器的进位输入并不来自于前一级全加器,而始来自超前进位的逻辑 |
优点 | 电路布局简单,设计方便 | 计算Ci+1的延迟时间固定为三级门延迟,与加法器的位数无关 |
缺点 | 高位的运算必须等待低位的运算完成,延迟时间长 | 如果进一步拓宽加法器的位数,电路将变得非常复杂 |
(二) 实验感想:
本次实验通过对全加器功能构造的了解,同时对比半加器等的功能,我理解了高位全加器电路的逻辑,并且能将大而复杂的电路模块进行拆分简化,这有助于我对今后更加复杂电路的理解。通过对比超前进位加法器和行波进位加法器,我明白了不同情境下对实现相同功能电路的性能的要求可能会不同,这是我在今后的学习中需要注意的