计算机15 西安交通大学 组成原理 最终报告要点Word文件下载.docx
《计算机15 西安交通大学 组成原理 最终报告要点Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机15 西安交通大学 组成原理 最终报告要点Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
![计算机15 西安交通大学 组成原理 最终报告要点Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/14/fded4711-3223-4b9e-a9aa-7b583b252e68/fded4711-3223-4b9e-a9aa-7b583b252e681.gif)
三、实验原理
图1-一个指令的执行流程图
指令系统在整个计算机系统结构设计中处于核心的地位。
指令系统设计不仅直接关系到计算机系统硬件的设计,而且必然影响后期系统软件的设计。
1)指令类型:
算数类:
ADDSUB逻辑类:
ANDOR
寄存器访问类:
SETMOV存储器访问类:
LOADSTORE
条件转移类:
BEQ无条件转移类:
JMP
2)指令格式:
字长:
使用固定长度16位
操作码:
为方便使用及操作,规定为4位
操作数:
为使用多个操作数,每个操作数规定为1至3位
3)指令系统依据MIPS指令集设计,指令字长为16位,整个指令系统包括了运算指令、转移指令和存储指令等三类。
这三类指令根据IR15—IR14进行分类:
IR15为0时运算指令算术逻辑指令的IR14—IR12对应运算器ALU的3位运算操作码。
;
IR15为1其他指令
IR15、IR14为10时转移指令;
IR15、IR14为11时存储指令。
当IR0=1时,本指令中有对DR的写操作。
当IR1=1时,本指令影响标志位Z。
当IR2=1时,本指令影响标志位C。
NOP指令实际上是一条“MOVR0,R0”指令,只是不改变目的寄存器的内容。
4)由于取指阶段和存储器读写阶段都要访问存储器,速度较慢;
而指令译码和运算都由CPU本身完成,设置取指阶段和存储器读写阶段各占一拍时间,指令译码和运算共占一拍时间。
因此,一条指令执行需要3拍时间
t1:
取指。
在t2的上升沿,将从存储器取出的指令写入指令寄存器IR。
t2:
根据指令寄存器IR的内容进行指令译码;
根据指令译码得到的控制信号进行运算和其它操作。
t3:
存储器读、写操作;
在t3的下降沿将运算结果写入目的寄存器,改变C标志和Z标志;
在t3的下降沿,改变PC的值,为取下一条指令做好准备。
1)基本组成:
指令寄存器IR
指令译码器ID
时序发生器
组合逻辑电路
2)时序控制:
因为采用了组合逻辑控制器,因此采用三级时序控制,指令周期下分机器周期、节拍电位、节拍脉冲
指令译码器
指令译码器是计算机控制器中最重要的部分。
所谓组合逻辑控制器就是指指令译码电路是由组合逻辑实现的。
组合逻辑控制器又称硬连线控制器,是早期设计计算机的一种方法。
这种控制器中的控制信号直接由各种类型的逻辑门和触发器等组合产生。
这样,一旦控制部件构成后,除非重新设计和物理上对它重新连线,否则要想增加新的功能是不可能的。
结构上的这种缺陷使得硬连线控制器的设计和调试变得非常复杂而且代价很大。
所以,硬连线控制器曾一度被微程序控制器所取代。
但是随着新一代机器及VLSI技术的发展,这种控制器又得到了重视,如RISC机广泛使用这种控制器。
1)组合逻辑控制器原理
图2组合逻辑控制器的结构方框图
图2是组合逻辑控制器的结构方框图。
逻辑网络的输入信号来源有三个:
(1)指令操作码译码器的输出In;
(2)来自时序发生器的节拍电位信号Tk;
(3)来自执行部件的反馈信号Bj。
逻辑网络的输出信号就是微操作控制信号,用来对执行部件进行控制。
显然,组合逻辑控制器的基本原理,可描述为:
某一微操作控制信号Cm是指令操作码译码器的输出In、时序信号(节拍电位信号Tk)和状态条件信号Bj的逻辑函数。
即
Cm=f(In,Tk,Bj)
用这种方法设计控制器,需要根据每条指令的要求,让节拍电位和时序脉冲有步骤地去控制机器的各有关部分,一步一步地执行指令所规定的微操作,从而在一个指令周期内完成一条指令所规定的全部操作。
一般来说,组合逻辑控制器的设计步骤如下。
(1)绘制指令流程图
为了确定指令执行过程所需的基本步骤,通常是以指令为纲,按指令类型分类,将每条指令归纳成若干微操作,然后根据操作的先后次序画出流程图。
(2)安排指令操作时间表
指令流程图的进一步具体化,把每一条指令的微操作序列分配到各个机器周期的各个时序节拍信号上。
要求尽量多的安排公共操作,避免出现互斥。
(3)安排微命令表
以指令流程图为依据,表示出在哪个机器周期的哪个节拍有哪些指令要求哪些微命令。
(4)进行微操作逻辑综合
根据微操作时间表,将执行某一微操作的所有条件(哪条指令、哪个机器周期、哪个节拍和脉冲等)都考虑在内,加以分类组合,列出各微操作产生的逻辑表达式,并加以简化。
(5)实现电路
根据上面所得逻辑表达式,用硬件电路模块来实现。
3.3通用寄存器组
通用寄存器组是CPU的重要组成部分。
从存储器取来的数据要放在通用寄存器中;
从外部设备取来的数据除DMA方式外,要放在通用寄存器中。
向存储器输出的数据也是从通用寄存器中取出的;
向外部设备输出的数据除DMA方式外也是从通用寄存器中取出的。
由于从通用寄存器组中取数据比从存储器或者外部设备取数据速度快得多,因此参加算术运算和逻辑运算的数据一般是从通用寄存器组中取出的,它向算术逻辑单元ALU提供了进行算术运算和逻辑运算所需要的2个操作数,同时又是运算结果的暂存地。
通用寄存器组内寄存器的数目与CPU性能有关,CPU性能越高,通用寄存器组内的寄存器数目越多。
由于算术逻辑运算需要2个操作数,因此通用寄存器组有2个读端口,负责提供进行算术逻辑单元需要的源操作数和目的操作数。
通用寄存器组有1个写端口,负责将运算结果保存到指定的寄存器内。
3.4存储器
存储器按存取方式分,可分为随机存储器和顺序存储器。
如果存储器中的任何存储单元的内容都可随机存取,称为随机存储器,计算机中的主存储器都是随机存储器。
如果存储器只能按某种顺序存取,则称为顺序存储器,磁带是顺序存储器,磁盘是半顺序存储器,它们的特点是存储容量大,存取速度慢,一般作为外部存储器使用。
如果按存储器的读写功能分,有些存储器的内容是固定不变的,即只能读出不能写入,这种存储器称为只读存储器(ROM);
既能读出又能写入的存储器,称为随机读写存储器(RAM)。
实际上真正的ROM基本上不用了,用的是光可擦除可编程的ROM(EPROM)和电可擦除可编程的ROM(EEPROM)。
EEPROM用的越来越多,有取代EPROM之势,比如容量很大的闪存(FLASH)现在用的就很广泛,常说的U盘就是用FLASH做的。
按信息的可保存性分,存储器可分为非永久性记忆存储器和永久性记忆存储器。
ROM、EPROM、EEPROM都是永久记忆存储器,它们断电后存储内容可保存。
RAM则是非永久性记忆存储器,断电后存储器中存储的内容丢失。
基本部件组成:
1)取指:
主存:
MM,内存地址寄存器MAR,MDR,PC,IR,ID,CU
2)计算:
主要的部件为ALU
其他还需要:
MUX,LA,LB(暂存器),LB,RESULT(存放结果),RF等
图3-系统的数据通路图
四、设计思路与源代码
实验CPU由5部分组成:
取指部分instru_fetch、指令译码部分decoder_unit、执行部分exe_unit、存储器部分memory_unit和通用寄存器组fegfile。
另外,还有一个程序包exe_cpu_components,将各低层设计实体作为元件存储,供各设计实体使用。
顶层设计实体exe_cpu完成5个组成部分的连接。
实验CPU总体框图见图2-1。
图2-1实验CPU总体框图
4.1通用寄存器组regfile
通用寄存器组内包含4个16位寄存器。
这是一个具有1个写入端口、2个读出端口的通用寄存器组。
写入端口将指令执行后得到的目的寄存器的值在t3的下降沿写入目的寄存器。
只有具有写目的寄存器功能的指令执行结束时才写目的寄存器。
有些指令,如JMP指令等执行结束后不改变通用寄存器组的值。
通用寄存器组的2个读出端口,一个是目的寄存器读出端口,一个是源寄存器读出端口,从这2个端口读出的内容供执行部分exe_unit和存储器部分memory_unit使用。
通用寄存器组内还有2个标志位:
z_out和c_out,在t3的下降沿根据指令执行的结果改变或者不改变它们的值。
这2个标志位的值送执行部分exe_unit使用。
4.2取指部分instru_fetch
取指部分完成4项工作:
(1)产生时钟信号t1、t2和t3,供实验CPU各部分使用。
(2)在复位信号reset为低时将PC复位为0;
在一条指令执行结束后,根据指令执行的结果在t3的下降沿改变PC的值。
(3)将从存储器读出的指令的第一个字在t2的上升沿送指令寄存器IR。
(4)计算PC+1的值pc_inc,为双字指令取第二个指令字做准备。
传统上取指部分属控制器部分。
4.3指令译码部分decoder_unit
指令译码部分根据指令寄存器IR的值产生实验CPU所需要的各种控制信号和其他信号:
信号名
意义
SR
源寄存器号(编址)
DR
目的寄存器号(编址)
op_code
控制ALU进行8种运算操作的3位编码
zj_instruct
为1表示本条指令是条“JNZADR”指令
cj_instruct
为1表示本条指令是条“JNCADR”指令
lj_instruct
为1表示本条指令是条“JMPADR”指令
DRWr
为1表示在t3的下降沿将本条指令的执行结果写入目的寄存器
Mem_Write
为1表示本条指令有存储器写操作,存储器的地址是源寄存器的内容
DW_intruct
为1表示本条指令是双字指令
change_z
为1表示本条指令可能改变z(结果为0)标志
change_c
为1表示本条指令本条指令可能改变c(进位)标志
sel_memdata
为1表示本条指令写入目的寄存器的值来自读存储器
r_sjmp_addr
计算条件转移指令转移地址所需要的16位相对地址。
它是由条件转移指令中的8位相对地址经过符号扩展生成的
4.4执行部分exe_unit
执行部分完成下列任务:
(1)8种算术逻辑运算:
加、加1、减、减1、与、或、非和数据传送,并临时将运算结果存放在result中。
根据运算结果产生进位标志,临时存放在c_tmp中;
根据运算结果产生结果为0标志,临时存放在z_tmp中。
(2)产生存储器读写所需要的存储器地址Mem_Addr。
存储器地址是根据下列情况决定的:
在t1节拍时选择pc,在双字指令时选择pc_inc?
第3节拍?
,在LDR指令时选择SR(源寄存器)内容,在STR指令时选择DR(目的寄存器)内容。
(3)产生条件转移指令(JNC和JNZ)所需要的转移标志c_z_j_flag(为1表示转移)和转移地址sjmp_addr。
4.5存储器部分memory_unit
存储器部分主要完成对存储器的读写:
(1)memory_unit内部设置了一个大小为
的RAM,将需要要运行的程序的机器代码在程序运行前写入RAM中。
(2)存储器地址Mem_addr来自执行部分,写信号Mem_Write由指令译码部分产生。
当Mem_Write为1时在t3节拍完成写操作,其余情况下均进行读操作。
(3)在t1节拍中完成读指令的第1个字。
(4)对双字指令,在t3完成读指令的第2个字。
(5)对JMP指令,在t3读出转移地址,放在data_read中。
(6)对MVRD指令,在t3读出立即数DATA,放在data_read中。
(7)对LDR指令,在t3读出存储器的值,放在data_read中。
(8)对STR指令,在t3将源寄存器的值写入存储器中。
(9)对在t3下降沿写入目的寄存器的值进行选择。
在LDR指令中,选中读出的存储器的值;
在其他指令中,选中执行部分送来的运算结果result。
4.6程序包exp_cpu_components
程序包exp_cpu_components把实验CPU中除顶层设计实体exp_cpu以外的设计实体作为元件(component)予以说明,供实验CPU中的其它设计实体作为元件予以引用。
4.7顶层设计实体exp_cpu
顶层设计实体exp_cpu把5个二级设计实体regfile、instru_fetch、decoder_unit、exe_unit和memory_unit作为元件引用,每个例化一次,用信号把它们连接起来,构成实验CPU。
clk外部输入的时钟。
reset外部输入的CPU复位信号,低电平有效。
为了方便调试与测试,将信号reg_sel(选择寄存器)作为输入,reg_content(寄存器输出)、c_flag、z_flag作为输出信号进行观察,对应关系如表2所示:
表2reg_sel、reg_content对应关系
reg_sel(选择信号)
reg_content(输出内容)
000000
R0
000001
R1
000010
R2
000011
R3
000100
"
0000000"
&
t3&
"
000"
t2&
t1
111110
pc
111111
IR
其它
x"
0000"
在一个工程(project)中,较低层的设计实体其实相当于元件,与一块印制板上的电路差不多;
顶层设计实体对较低层设计实体每例化一次,相当于在印制板上上安放一个元件,而顶层设计实体中的信号相当于印制板上的连线。
因此,在一个工程中,如果有一个非顶层设计实体从来没有被其他设计实体例化过,那么这个设计实体在这个工程中就是多余的,起不到任何作用。
顶层设计实体中除了由较低层设计实体构成的元件外,通常还有一些由process语句、信号赋值语句等构成的其他独立电路块,通过信号把元件和独立电路块互相连接,最后形成了一个完整的电路设计。
(1)Mem_Addr是存储器地址总线。
(2)z_tmp是运算产生的结果为0标志,z_out是本条指令执行完成后的结果为0标志。
(3)c_tmp是运算产生的进位标志,c_out是本条指令执行完成后的进位标志。
(4)IR是指令寄存器。
(5)c_z_j_flag是条件转移指令“JNCADR”或者“JNZADR”产生的条件转移标志。
(6)sjmp_addr是条件转移指令“JNCADR”或者“JNZADR”产生的条件转移地址。
(7)result是运算器产生的运算结果。
五、实验步骤
1.编写VHDL代码
2.调试程序
3.仿真
六、实验现象
测试程序:
MVRDR2,0x5555
MVRDR3,0xffff
ADDR3,R2
SUBR3,R2
INCR3
DECR3
ORR3,R2
指令执行过程如下:
1.先看一下指令执行过程中各数据寄存器的值:
(1)寄存器片选2号,第一条指令执行,R2的值变成0x5555
(2)寄存器片选3号,第二条指令执行R3的值变成0xffff,接着执行第三条指令,R3与R2相加放入R3中为0x5554,接着第四条指令R3-R2放入R3中,R3为0xaaaa,接着第五条指令使R3加1,第六条是R3减一,但由于间隔太短造成了冲突,第七条指令使R3变成了0xffff。
2、接着看一下特殊寄存器PC和IR的值
(1)我们可以关注一下程序运行过程中PC值变化的情况,寄存器片选111110号(即PC),可见其是不断自增的。
Pc
(2)关注一下指令运行过程中IR寄存器的情况,可以看到IR中的值都是我们事先设定好的指令格式中相应的指令。
七、实验心得
这次实验的规模、难度、开放性、持续时间、学分等等,在本科这几年中都应该算是前所未有的。
首先,本次实验对我们来说是比较大型的,它培养了我们的科学工作作风,教给我们科学的工作方法,帮助我们学会化繁为简,学会管理好和高效利用我们的时间。
我的体会是,一定要在实验伊始制定出比较详尽的进度安排,想清楚什么时间应该做好什么工作,不能太急于求成而忽略一些潜在的问题,也不能拖拖拉拉浪费时间;
而且在实验这段时间内最好集中全部精力做实验,不做的时候尽量不要花太多心思在其他事情上面,保持思路和状态,对实验的进程会大有好处。
另外,这次实验对磨练意志也是有相当作用的。
从开始的无从下手,设计细节的繁琐乏味,到调试阶段的心急如焚,整个过程都需要实验者的耐心和信心。
可以说,没有意志和周围同学的鼓励、老师的帮助指导我们是很难完成这个实验的。
在设计阶段,我们查阅了很多资料,这其中既包括以前的课本,如计算机组成原理、数字电路设计、汇编语言程序设计等,还包括下个学期的课本,计算机体系结构,也包括了一些图书馆查阅的其他资料,这不仅使我们复习了以前所学的知识,同时开阔了我们的眼界,让我们对CPU的设计这一领域有了更多的了解;
而逻辑设计的实现,包括VHDL程序的编写,软件模拟等。
专题实验结束了,但对计算机组成的学习还未结束,前路漫漫,我会继续努力。
八、程序源代码
针对于课本上的源代码,主要修改了Memory部分:
libraryieee;
useieee.std_logic_1164.all;
usework.exp_cpu_components.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitymemory_unitis
port(
reset:
instd_logic;
clk,t3:
Mem_addr:
instd_logic_vector(15downto0);
Mem_Write:
instd_logic;
sel_memdata:
instd_logic;
--为1时,存储器的读出数据作为写入DR的数据
SR_data:
instd_logic_vector(15downto0);
--写入存储器的数据
result:
--运算结果
data_read:
bufferstd_logic_vector(15downto0);
DR_data_out:
outstd_logic_vector(15downto0)--写入DR的数据
);
endmemory_unit;
architecturebehavofmemory_unitis
subtypemem_wordisstd_logic_vector(15downto0);
typememoryisarray(0to5)ofmem_word;
signalmem_initial:
memory;
begin
R_W_Memory_proc:
process(reset,SR_data,clk,t3,Mem_Write,Mem_addr,data_read)--读写存储器处理
mem_initial(0)<
=x"
7101"
;
mem_initial
(1)<
1107"
mem_initial
(2)<
e400"
mem_initial(3)<
d801"
mem_initial(4)<
8120"
mem_initial(5)<
0008"
ifreset='
0'
then
--ob<
="
ZZZZZZZZZZZZZZZZ"
--将存储器数据总线置为高阻,即读存储器。
else
ifMem_Write='
1'
andt3='
then
mem_initial(conv_integer(Mem_addr))<
=SR_DATA;
--写存储器,来自源R
--rw<
=clk;
else
--ob<
--将存储器数据总线置为高阻,读存储器
='
data_read<
=mem_initial(conv_integer(Mem_addr));
--从存储器读出的指令或者数据由
endif;
endif;
endprocess;
sele_DR_proc:
process(sel_memdata,data_read,result)
ifsel_memdata='
DR_data_out<
=data_read;
--存储器数据作为写DR的数据
=result;
--运算结果作为写DR的数据
endbehav;