课程设计报告
题目:硬件结构设计
院(系):
专业: 计算机科学与技术
班级:计算机
学号:
姓名:
指导老师:
设计时间: 14-15 学年 1 学期
2014年12月
目录
一、课程设计目的 (3)
二、设计要求 (3)
三、设计原理 (3)
1.CPU的模块功能简述 (3)
2.CPU的设计原理 (4)
四、实验步骤 (4)
1.开发板的验证 (5)
2.模块仿真 (6)
3.系统仿真 (7)
五、实验结果及结果分析 (8)
扩展指令 (8)
六、实验心得和总结 (9)
一、课程设计目的
本课程是计算机科学与技术专业的主干核心课之一,通过课程设计融会贯通本课程各章节的内容,在实验的基础上综合运用,加深对各主要组成部件的工作原理及其相互间有机联系的理解。
加深计算机工作中“时间-空间”概念的理解,从而清晰地建立计算机的整机概念。
学习设计和调试计算机的基本步骤和方法,提高使用软件仿真工具和电路设计的基本技能。
培养科学研究的独立工作能力,取得工程设计与组装调试的实践和经验。
二、设计要求
完成一个简单但完整的计算机系统,包括存储器、ALU 、总线、控制单元、I/O 等。
要求计算机能够取出并执行若干条指令。
最后通过led 观察执行结果。
三、设计原理
1.CPU 的模块功能简述
CPU 共有6个模块,分别为控制信号输入器、控制器、数据总线、74371寄存器、算术逻辑运算器、储存器,还外加一个频率发生器。
CPU 经过这些模块的组合后可以完成输入两个8位二进制数,并进行一次或多次算术运算或逻辑运算,运算结果可以在运算器中输出验证,还可以将运算结果储存在储存器中。
储存器中可以储存256个8位二进制数,并可以输出特定位置的数据。
CPU 内部结构
PC
总线
IR
微地址 入口电路
控存 ROM
微指令 寄存器
通用REG 组
微指令 译码电路
ALU
微指令
2.CPU的设计原理
在控制信号输入器中主要有四个控制端口器,check、Con、equ、res,分别对控制器输入查看结果、继续上一步操作、单步操作、重置的信号。
控制信号相当于译码器,对指令进行一次译码,并把译码结果传进控制器。
控制器是CPU的核心,CPU在控制器的控制下进行各项操作。
控制器的输入控制信号输入器的产生译码,再次进行译码,产生16位的微指令,然后通过微指令对数据总线、寄存器、运算器、储存器进行操作控制。
微指令的格式
1~2:控制第1个寄存器,10表示寄存器输入数据,并将数据输出至数据总线控制器。
3~4:控制第2个寄存器,10表示寄存器输入数据,并将数据输出至数据总线控制器。
5~6:控制第3个寄存器,10表示寄存器输入数据,并将数据输出至数据总线控制器。
7~10:控制数据总线,1000为输入端口1 的数据,0100输入端口2的数据,0010输入端口3 的数据,0001输入端口的数据。
11~12:控制第4个寄存器,10表示寄存器输入数据,并将数据输出至运算器。
13~14:控制第一个寄存器,10表示寄存器输入数据,并将数据输出至运算器。
15~16:控制储存器,15位为1是写功能,16位为1是读功能。
数据总线寄存器、寄存器、运算器、储存器在控制器的微指令信号控制下进行各项操作,数据总线通过读进第1、2、3个寄存器和运算器中的数据再把数据输出至第4、5个寄存器、储存器和第3个寄存器。
CPU中的5个寄存器是在特定的时候读进信号线中的数据并在特定的时候读出数据至信号线。
运算器则对从第4、5个寄存器输入数据进行算术运算或者逻辑运算,并将运算结果直接输出或者输出至第3个寄存器或者数据总线寄存器。
四、实验步骤
1.开发板的验证
因为开发板只有8个输入端口和8个输出端口,所以添加一个数据寄存器,将两个操作数和储存器的第放在寄存器中,并用原理图的方式连接至CPU。
然后将其余的端口与开发板的端口对应。
输入寄存器设计代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mem is
port(
data_out1:out std_logic_vector(7 downto 0);
data_out2:out std_logic_vector(7 downto 0);
address:out std_logic_vector(7 downto 0)
);
end mem;
architecture Behavioral of mem is
signal do_tmp1 : std_logic_vector(7 downto 0):="11110101";
signal do_tmp2 : std_logic_vector(7 downto 0):="11110101";
signal add_tmp : std_logic_vector(7 downto 0):="11110000";
begin
data_out1<=do_tmp1;
data_out2<=do_tmp2;
address<=add_tmp;
end Behavioral;
连接原理图,编译下载到开发板后拨动开关,但是开发板的LED灯没有任何反应。
经过多次调试后任然没有反应。
2.模块仿真
1.Sel控制输入信号器的仿真,如下图。
根据仿真可知Sel的功能正确。
2.控制器的仿真,如图
根据Sel和Ctrl的仿真可知,为控制器的功能正确,根据指令可以得到正确的微指令。
3.数据总线寄存器的仿真,如图
4.运算器的仿真,如图
3.系统仿真
1.先让CPU对操作执行逻辑运算
根据上图可知,执行逻辑运算的取反功能,A=11110101的反是00001010,可知从运算输出可以得到结果,但是不能把结果存储进储存器并从储存器输出。
执行算术运算
根据仿真结果可知,系统的运算结果正确,但不能存储进储存器并输出。
五、实验结果及结果分析
扩展指令
因为CPU主要以控制器为核心,没有程序储存器,因此无法添加间接寻址,取指令之类的微指令。
这个CPU的微指令主要是对Sel输出的译码,但是Sel只有4个控制输入端,而这4高个输入分别表示查看结果、继续上一步操作、单步操作、重置,因此无法只在控制器中添加微指令。
要添加微指令必须添加控制输入信号器的输入控制端。
根据目前这个CPU的模块,CPU可以实现的功能都已经实现,微指令可以说已经不能再添加了。
六、实验心得和总结
通过这次课程设计,我对于CPU的构造的认识更深刻了,更加理解了CPU的组成及执行过程,也了解了一些组合逻辑控制实现CPU的过程。
由于对VHDL不很熟悉,导致在编程过程中出现很多语法错误。
后来逐步调试通过后,仿真发现结果完全不对。
在同学帮助下,找到了程序中的语意错误。
在第一次判断操作数分支中,没有按指令流程走,后来发现原来是取指令与判断操作数冲突了,在其中加了一个MDR->MAR微指令后解决了这个难题。
可是这时候结果仍然不正确,但加减操作正确了。
后来找出了微命令下址出问题了。
经过多次检验后,确认微指令全正确了,再次仿真结果正确。
本实验有相当的综合性:在实践过程中,我们充分使用了组成原理、微机接口、数字电路等相关知识。
通过本次实验,我对CPU的结构和工作原理有了切实的认识。
尤其在总线,时序,微指令等方面,投入的时间不少,体会很深。
我们深刻理解了总线作为指令和数据传输的道路和桥梁,在CUP的工作过程中扮演的重要角色;弄懂了通过时序的调节解决总线的冲突的方法;在全面细致地分析了CUP结构和工作原理的基础上,我们掌握了编写微指令的方法与技巧。
更加值得珍视的是这一次实验的经历,我依然记得刚刚拿到实验要求时的一筹莫展,一条一条的指令不懂其作用到底是什么,我按照已经给出的参考部分,一点点地分析,遇到不明白的地方,大家都能各抒己见。
我们面临rom部分不正确的问题,无法取址问题……
很多细节问题我想没有同学们的帮助,没有大家的智慧,我可能依然不能克服。
当然后来我后来又对CPU进行了一些改进的工作,看着我的第一个CPU逐渐强大,我心中充满喜悦。
当然,这个CPU只是最简单的模型。