数字电路之CPU设计三

实验三 加法器、运算器的实现

湖南大学数字电路CPU设计实验三GitHub

一、实验目的

1.了解运算器的内部结构。
2.熟悉并行加法器和串行加法器的工作原理。
3.分析模型机的功能,设计 ALU 和移位逻辑。

二、实验内容

1.用 VHDL 语言设计 4 位并行加法器
2.用 VHDL 语言设计 4 位串行加法器
3.用 VHDL 语言设计模型机运算器 ALU
4.用 VHDL 语言设计移位逻辑

三、实验方法

1、 实验方法
采用基于FPGA进行数字逻辑电路设计的方法。
采用的软件工具是Quartus II。
2、 实验步骤
1、新建,编写源代码。
(1).选择保存项和芯片类型:【File】-【new project wizard】-【next】(设置文件路径+设置project name为xor2)-【next】(设置文件名xor2.vhd—在【add】)-【properties】(type=AHDL)-【next】(family=FLEX10K;name=EPF10K10TI144-4)-【next】-【finish】
(2).新建:【file】-【new】(第二个AHDL File)-【OK】
2、写好源代码,保存文件(xor2.vhd)。
3、编译与调试。确定源代码文件为当前工程文件,点击【processing】-【start compilation】进行文件编译,编译成功。
4、波形仿真及验证。新建一个vector waveform file。按照程序所述插入a,b,c三个节点(a、b为输入节点,c为输出节点)。(操作为:右击 -【insert】-【insert node or bus】-【node finder】(pins=all;【list】)-【>>】-【ok】-【ok】)。任意设置a,b的输入波形…点击保存按钮保存。(操作为:点击name(如:A))-右击-【value】-【clock】(如设置period=200;offset=0),同理设置name B(如120,,60),保存)。然后【start simulation】,出name C的输出图。
5、时序仿真或功能仿真。
6、查看RTL Viewer:【Tools】-【netlist viewer】-【RTL viewer】。

四、实验过程

4 位并行加法器
1、 编译过程
a)源代码如图(VHDL设计)

b)编译、调试过程

c) RTL视图

d)结果分析及结论
X,Y,Z 端口输入 3 个二进制数,相加后最后一位结果通过 S 输出,进位通过 C 输出。
C0 提供输入但是固定输入为 0,其他 4 个全加器分别处理最低位到最高位,每一个全加器输
出一位结果,最后一个全加器额外输出一个进位。
例如输入“0000”和“1111”,输出结果为‘0’和“1111”;

2、 波形仿真
a)波形仿真过程(详见实验步骤)
b)波形仿真波形图

c)结果分析及结论
以 2ns 为一周期,每周期两个 4 位二进制数相加,得到得 5 位结果(包括最后一位
进位和 4 位结果),均正确
0-1ns:X,Y,Z 输入 000,相加结果为 0,S 输出 0,C 输出 0,正确
1-2ns:X,Y,Z 输入 001,相加结果为 1,S 输出 1,C 输出 0,正确
2-3ns:X,Y,Z 输入 010,相加结果为 1,S 输出 1,C 输出 0,正确
3-4ns:X,Y,Z 输入 011,相加结果为 10,S 输出 0,C 输出 1,正确
4-5ns:X,Y,Z 输入 100,相加结果为 1,S 输出 1,C 输出 0,正确
5-6ns:X,Y,Z 输入 101,相加结果为 10,S 输出 0,C 输出 1,正确
6-7ns:X,Y,Z 输入 110,相加结果为 10,S 输出 0,C 输出 1,正确
7-6ns:X,Y,Z 输入 111,相加结果为 11,S 输出 1,C 输出 1,正确

3、 时序仿真
a) 时序仿真过程
做好上述步骤后,编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)

b)时序仿真图

b) 结果分析及结论
0-1ns:X,Y,Z 输入 000,相加结果为 0,S 输出 0,C 输出 0,正确
1-2ns:X,Y,Z 输入 001,相加结果为 1,S 输出 1,C 输出 0,正确
2-3ns:X,Y,Z 输入 010,相加结果为 1,S 输出 1,C 输出 0,正确
3-4ns:X,Y,Z 输入 011,相加结果为 10,S 输出 0,C 输出 1,正确
4-5ns:X,Y,Z 输入 100,相加结果为 1,S 输出 1,C 输出 0,正确
5-6ns:X,Y,Z 输入 101,相加结果为 10,S 输出 0,C 输出 1,正确
6-7ns:X,Y,Z 输入 110,相加结果为 10,S 输出 0,C 输出 1,正确
7-6ns:X,Y,Z 输入 111,相加结果为 11,S 输出 1,C 输出 1,正确

4 位串行加法器
1,编译过程
a)源代码如图(VHDL设计)

b)编译、调试过程

c) RTL视图

结果分析及结论
为了不出现未定义的情况,先进行一次重置,Reset 在一开始设 0,将所有的触发器触发成
复位。然后连续 12 个时钟信号周期,同时 Shift 始终输入 1,保证时钟信号有效。
在前 4 个周期的上升沿,依次从低到高输入 4 位二进制数,一位每周期存入 B 寄存器中;
在第 5 到第 8 个周期的上升沿,B 寄存器的 4 位二进制数从低位到高位,一位每周期,通过
全加器与‘0’相加后,原值存入到 A 寄存器中,同时从低到高输入新的 4 位二进制数,一位每
周期存入 B 寄存器中;
在第 9 到第 12 个周期的上升沿,每一个周期将 B 寄存器的一位二进制数输出,与 A 寄存器
的一位二进制数以及进位结果(第一次为 0)相加,将不包括进位的结果重新存入 A 寄存器
中,进位结果在下个周期与 A,B 寄存器输出的二进制数相加。
第 12 个周期的结果就是两个 4 位二进制数除去最高位进位的相加结果。
为了方便调试和观察结果,我们对两个寄存器的 4 个触发器保存的值进行输出,输出端口为O【3…0】和 Q【3…0】。
2,波形仿真
a)波形仿真过程(详见实验步骤)
b)波形仿真波形图

c) 结果分析及结论
Shift 始终设置为 1,保证时钟信号有效
一开始 Reset 设置为 0,对整个加法器进行重置。
在时钟信号的第一个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0000”,O 不变,为“0000”;在时钟信号的第二个周期,SI 输入为 1,B 寄存器在上升沿保存该值,Q 结果为“1000”,O 不变,为“0000”;
在时钟信号的第三个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0100”,O 不变,为“0000”;
在时钟信号的第四个周期,SI 输入为 1,B 寄存器在上升沿保存该值,Q 结果为“1010”,O 不变,为“0000”;
在时钟信号的第五个周期,SI 输入为 1,B 寄存器在上升沿保存该值,Q 结果为“1101”,B 的输出一位在 A 的输出一位与全加器相加后,保存到 O 的最高位,O变为“0000”;
在时钟信号的第六个周期,SI 输入为 1,B 寄存器在上升沿保存该值,Q 结果为“1110”,B 的输出一位在 A 的输出一位与全加器相加后,保存到 O 的最高位,O变为“1000”;
在时钟信号的第七个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0111”,B 的输出一位在 A 的输出一位与全加器相加后,保存到 O 的最高位,O变为“0100”;
在时钟信号的第八个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0011”,B 的输出一位在 A 的输出一位与全加器相加后,保存到 O 的最高位,O变为“1010”;
在时钟信号的第九个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0001”,B 的输出一位在与全加器相加后,保存到 O 的最高位,O 变为“1101”;
在时钟信号的第十个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0000”,B 的输出一位在与全加器相加后,保存到 O 的最高位,O 变为“0110”;
在时钟信号的第十一个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0000”,B 的输出一位在与全加器相加后,保存到 O 的最高位,O 变为“1011”;
在时钟信号的第十二个周期,SI 输入为 0,B 寄存器在上升沿保存该值,Q 结果为“0000”,B 的输出一位在与全加器相加后,保存到 O 的最高位,O 变为“1101”;
以上结果符合预期,正确

3,时序仿真
d) 时序仿真过程
做好上述步骤后,编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)
b)时序仿真图

e) 结果分析及结论
时序仿真不仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统更接近的一种仿真结果。不过,要注意的是,这个时间延时是仿真软件“估算”出来的。

模型机运算器 ALU
1,编译过程
a)源代码如图(VHDL设计)

b)编译、调试过程

c) RTL视图

d)结果分析及结论
当前四位为“1001”时,将后四位中的前两位与后两位相加,保存到 R1 中,输出;
当前四位为“0110”时,将后四位中的前两位与后两位相减,保存到 R1 中,输出;
当前四位为“1011”时,将后四位中的前两位与后两位做或运算,保存到 R1 中,
输出;
当前四位为“0101”时,将后四位中的前两位做非运算,保存到 R1 中,输出;
当前四位为“1010”,最后两位是“00”时,将后四位中的前两位做循环右移计算,保存到 R1 中,输出;
当前四位为“1001”时,最后两位是“11”时,将后四位中的前两位做循环左移计算,保存到 R1 中,输出;

2,波形仿真
a) 波形仿真过程(详见实验步骤)

b)波形仿真波形图

c)结果分析及结论
定制 8-1 多路复用器,本质上还是 8-1 多路复用器,只是得到方式是通过改变类属参量得到的,接收多个输入信号,按每个输入信号可恢复方式合成单个输出信号。

3,时序仿真
f) 时序仿真过程
做好上述步骤后,编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)

b)时序仿真图

g) 结果分析及结论
当前四位为“1001”时,将后四位中的前两位与后两位相加,保存到 R1 中,输出;
当前四位为“0110”时,将后四位中的前两位与后两位相减,保存到 R1 中,输出;
当前四位为“1011”时,将后四位中的前两位与后两位做或运算,保存到 R1 中,输出;
当前四位为“0101”时,将后四位中的前两位做非运算,保存到 R1 中,输出;
当前四位为“1010”,最后两位是“00”时,将后四位中的前两位做循环右移计算,保
存到 R1 中,输出;
当前四位为“1001”时,最后两位是“11”时,将后四位中的前两位做循环左移计算,
保存到 R1 中,输出;
仿真中结果均符合预期,正确

移位逻辑
1,编译过程
a)源代码如图(VHDL设计)

b)编译、调试过程

c) RTL视图

d)结果分析及结论
数据通路确定后,就可以设计指令系统中每条指令所需要的机器周期数。对于微程序控制的计算机,根据总线结构,需考虑哪些微操作可以安排在同一条微指令中,哪些微操作不能安排在同一条微指令中。
2,波形仿真
a)波形仿真过程(详见实验步骤)
b)波形仿真波形图

c)结果分析及结论
3,时序仿真
h) 时序仿真过程
做好上述步骤后,编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)
b)时序仿真图

五、实验结论(实验总结与实验心得)

在本次实验难度较大,在其他同学的帮助下和自己的查阅资料之后,逐步熟练了QuartusII的使用,以及易错点,改正了初步程序的错误之后,各个程序和原理图编译成功,紧接着进行功能仿真和时序仿真,结果与理论结果完全符合。再进行模拟机指令译码器的编写,根据实验一实验的文档得到指令译码器功能表,根据功能表,使用when-else语言进行编写,在丰富查阅资料和询问学长学姐之后,程序完成,编译成功,再根据程序得到原理图和RTL视图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值