西安交通大学计算机组成原理实验报告.docx
《西安交通大学计算机组成原理实验报告.docx》由会员分享,可在线阅读,更多相关《西安交通大学计算机组成原理实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
西安交通大学计算机组成原理实验报告
西安交通大学
计算机组成原理实验报告
姓名:
***
班级:
物联网**
学号:
实验一存储器的访问与实现
一、实验目的
1、理解计算机主存储器的分类及作用;
2、掌握ROM、RAM的读写方法。
二、实验原理
存储器按存取方式分,可分为随机存储器和顺序存储器。
如果存储器中的任何存储单元的内容都可随机存取,称为随机存储器,计算机中的主存储器都是随机存储器。
如果存储器只能按某种顺序存取,则称为顺序存储器,磁带是顺序存储器,磁盘是半顺序存储器,它们的特点是存储容量大,存取速度慢,一般作为外部存储器使用。
如果按存储器的读写功能分,有些存储器的内容是固定不变的,即只能读出不能写入,这种存储器称为只读存储器(ROM);既能读出又能写入的存储器,称为随机读写存储器(RAM)。
实际上真正的ROM基本上不用了,用的是光可擦除可编程的ROM(EPROM)和电可擦除可编程的ROM(EEPROM)。
EEPROM用的越来越多,有取代EPROM之势,比如容量很大的闪存(FLASH)现在用的就很广泛,常说的U盘就是用FLASH做的。
按信息的可保存性分,存储器可分为非永久性记忆存储器和永久性记忆存储器。
ROM、EPROM、EEPROM都是永久记忆存储器,它们断电后存储内容可保存。
RAM则是非永久性记忆存储器,断电后存储器中存储的内容丢失。
随机读写存储器类型
随机存储器按其元件的类型来分,有双极存储器和MOS存储器两类。
在存取速度和价格两方面,双极存储器比MOS存储器高,故双极存储器主要用于高速的小容量存储体系。
在MOS存储器中,根据存储信息机构的原理不同,又分为静态随机存储器(SRAM)和动态随机存储器(DRAM)。
静态随机存储器采用双稳态触发器来保存信息,只要不断电,信息就不会丢失;动态随机存储器利用记忆电容来保存信息,使用时只有不断地给电容充电才能使信息保持。
静态随机存储器的集成度较低,功耗也较大;动态随机存储器的集成度较高,功耗低。
现在计算机中,内存容量较大,常由动态随机存储器构成。
静态随机存储器
静态存储器由存储体、地址译码电路、读写电路和控制电路组成。
一个4096×1位的SRAM的结构框图如图6-37所示。
图中,A0~A11为地址线,用来寻址存储器中的某一个单元。
DIN、DOUT为数据线,实现数据的输入、输出。
W//R为读写控制信号线,用来实现读写操作控制。
/CS为片选信号。
图6-37SRAM结构框图
动态随机存储器
动态随机存储器(DRAM)和SRAM一样,也是由许多基本存储电路按照行和列来组成的。
DRAM是以MOS管栅极和衬底间电容上的电荷来存储信息的。
由于MOS管栅极上的电荷会因漏电而泄放,故存储单元中的信息只能保持若干秒,为此DRAM必须附加刷新逻辑电路。
另外,DRAM将地址分为行地址和列地址,并分时复用以减少引脚数目。
常见的4164芯片即是DRAM。
三、实验要求
1、实验设计目标
设计一个能够对实验台上的存储器读写的部件,满足以下目标:
(1)、一个16位的存储器地址寄存器(MAR)。
该寄存器在reset为低电平时清零,在时钟clk的上升沿加1,地址寄存器在超过ox000f后下一个时钟上升沿回到0。
一个标志寄存器(flag),在reset为低电平时复位为0,当存储器地址寄存器等于0x000f后,下一个时钟clk的上升沿标志寄存器翻转。
(2)、在标志寄存器为0时执行存储器存数功能,从存储器的0单元开始存16个16位数。
按动一次单脉冲按钮,存一次数,存的数由内部产生,不由实验台开关输入。
(3)、当标志寄存器为1时,执行从存储器的0单元开始的读数功能。
按动一次单脉冲按钮,读一次数,一直读16个数。
读出的数据送入一个16位信号R[15..0]暂存。
提示:
当需要从存储器读取数据时,首先将"ZZZZZZZZZZZZZZZZ"赋值给数据总线,然后才能读取存储器中的数据。
2、顶层设计实体的引脚要求
引脚要求对应关系如下:
(1)clk对应实验台上的时钟(单脉冲)。
(2)reset对应实验台上的CPU复位信号CPU_RST。
(3)存储器地址总线A[15..0]对应实验台上的指示灯A15—A0。
(4)存储器数据总线D[15..0]对应实验台上的数据指示灯D15—D0。
(5)16位信号R[15..0]对应实验台上的指示灯R15—R0。
(6)存储器读写信号FWR对应实验台上的FWR。
(7)
四、实验步骤
实验台设置成FPGA-CPU附加外部RAM运行模式“011”。
该调试模式要能够实现模拟FPGA-CPU对实验台存储器的存数、取数功能。
即REGSEL=0、CLKSEL=1、FDSEL=1。
使用实验台上的单脉冲,即STEP_CLK短路子短接,短路子RUN_CLK断开。
由于当FDSEL=0时,指示灯D15—D0显示的是开关SD15—SD0的值,因此开关FDSEL必须为1。
这种方式除了FPGA-CPU的时钟是单脉冲外,其余都与单片机控制FPGA-CPU调试模式完全一样。
将设计在QuartusⅡ下输入,编译后下载到TEC-CA上的FPGA中。
首先按实验台上的CPU复位按钮,使存储器地址寄存器复位为0,然后不断观察实验台上的指示灯,察看结果与预想的是否一致。
1、实验思路:
2、源代码
libraryIEEE;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitymemoryis
port(reset,clk:
instd_logic;--复位、时钟
FWR:
outstd_logic;--RAM的读写
D:
inoutstd_logic_vector(15downto0);--数据
A:
outstd_logic_vector(15downto0);--地址
R:
outstd_logic_vector(15downto0)--寄存器
);
endmemory;
architecturebehavofmemoryis
signalcounter:
std_logic_vector(15downto0);
signalwdata:
std_logic_vector(15downto0);
signalstart,flag:
std_logic;--开始计数(读写)、结束(状态)
begin
A<=counter;
wdata<="00000000001"&counter(4downto0);--数据16bit的形成
process(reset,clk)
begin
ifreset='0'then
counter<=x"0000";
elsifclk'eventandclk='1'then--计数
if(start='1')and(counter/=x"000f")then
counter<=counter+'1';
elsif(start='1')and(counter=x"000f")then
counter<=x"0000";
endif;
endif;
endprocess;
process(reset,clk)
begin
ifreset='0'then
start<='0';
elsifclk'eventandclk='1'then
start<='1';
endif;
endprocess;
process(reset,counter,clk)
begin
ifreset='0'then
flag<='0';
elsifclk'eventandclk='1'then
ifcounter=x"000f"then
flag<=notflag;
endif;
endif;
endprocess;
process(reset,counter,clk,start,flag,wdata,D)
begin
ifreset='0'then
FWR<='1';
elsifstart='1'then
ifflag='0'then
D<=wdata;
FWR<=clk;
else
D<="ZZZZZZZZZZZZZZZZ";
FWR<='1';
R<=D;
endif;
endif;
endprocess;--增加flag引出信号,观察他的变化。
endbehav;
五、实验结果及分析
仿真结果如下图所示,分为两个阶段,第一个阶段是写入数据阶段,经过16个时钟脉冲后,进入第二个阶段;第二个阶段是读出数据阶段,同样经历16个时钟脉冲,读出的数据首先暂存在一个寄存器中,然后再送入数据总线。
六、思考题
如果从存储器中读出数据时不首先向数据总线送出"ZZZZZZZZZZZZZZZZ",那么会发生什么问题?
答:
如果在从存储器中读出数据时不首先向数据总线送出高阻状态,那么读状态和写状态就可能会混淆重叠,从而造成错误。
七、实验心得
通过本次实验,我更好地理解了计算机主存储器的分类及作用,同时也更好地了解和掌握了ROM、RAM的读写方法。
通过实验,我可以将书本上的理论知识与实际的实验内容及结果结合起来,这让我更好地掌握课堂上学习的知识。
不过在实验中也遇到了不少问题,幸运的是,在老师的指导与帮助下,我最终完成了实验,希望以后会有更多的实验机会。
实验二运算器的设计与实现
——加法器的设计
一、实验目的
1、掌握基本的算术运算和逻辑运算的运算规则和实现方法;
2、掌握基本运算器的信息传送通路;
3、掌握运算器的工作原理,设计并实现具有定点、浮点运算功能的模块。
二、实验原理
运算器是既能实现算术运算又能完成逻辑运算的部件。
算术运算主要包括加减乘除运算,逻辑运算主要包括与、或、非、异或和移位运算。
运算器(ALU)通常有两个数据输入端(opr1和opr2),一个数据输出端(result),运算模式控制信号(code)和标志位(cin,flag)等。
下图为运算器的逻辑框图:
图2-1运算器
运算器包含加法器、减法器、乘法器、与门、或门、非门、异或门和移位器。
各组成部件的原理如下所述。
(本实验中设计的运算器操作数为8位字长)。
加法器
从进位传递时间和门电路的扇入、扇出来考虑,将8位数据分为两组,采取组内并行、组间串行的设计方案。
该加法器的设计框图如下所示:
图2-28位的加法器
其中,Gi=opr1(i)andopr2(i)(i=1,…,7),Gi为第i位的本地进位,Pi=opr1(i)xoropr2(i)(i=1,…,7),P(i)为传递条件。
4位先行加法器的逻辑图如下所示:
图2-34位先行加法器逻辑图
于是根据逻辑图可以得出4位先行加法器的逻辑表达式如下:
Gi=opr1(i-1)opr2(i-1)
Pi=opr1(i-1)
opr2(i-1)
S1=P1
C0
C1=G1+P1C0
S2=P2
C1
C2=G2+P2C1=G2+P2G1+P2P1C0
S3=P3
C2
C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0
S4=P4
C3
C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0
四、实验内容
由于时间关系,第二次实验老师要求我们只需要做加法器,所以实验内容主要是设计一个基本的加法器。
顶层设计实体的引脚对应关系:
(1)运算控制信号set对应实验台上开关SA0;
(2)低位向高位的进位或者借位信号cin对应实验台上开关SA1;
(3)操作码code[2..0]对应实验台上开关SA5~SA2;
(4)第一操作数opr1[7..0]对应于实验台上开关SD7~SD0;
(5)第二操作数opr2[7..0]对应实验台上开关SD15~SD8;
(6)运算结果result[15..0]对应实验台上指示灯A7~A0;
(7)运算结果标志位flag对应实验台上指示灯A8。
注:
运算器模块框图:
运算器(ALU)通常有两个数据输入端(opr1和opr2),一个数据输出端(result),运算模式控制信号(code)和标志位(cin,flag)等。
下图为运算器的逻辑框图:
图2-1运算器
∙运算器包含加法器(含用先行进位的构成的加法器)、减法器、乘法器、与门、或门、非门、异或门和移位器等及浮点运算模块;运算器模块中也可以加入寄存器组(Registerfile)
∙本实验中设计的运算器操作数可以分别为8/16/32位字长((32位字长运算可以只进行仿真分析)
五、实验源代码
8位加法器
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYadder8IS
PORT(
a:
INstd_logic_vector(7DOWNTO0);
b:
INstd_logic_vector(7DOWNTO0);
cin:
INstd_logic;
cout:
OUTstd_logic;
sum:
OUTstd_logic_vector(7DOWNTO0)
);
ENDadder8;
ARCHITECTURErippleOFadder8IS
COMPONENTfulladder
PORT(
a,b,CarryIn:
INSTD_LOGIC;
Sum,CarryOut:
OUTSTD_LOGIC
);
ENDCOMPONENT;
SIGNALcarry:
std_logic_vector(7DOWNTO1);
BEGIN
f0:
fulladderPORTMAP(
a=>a(0),
b=>b(0),
CarryIn=>cin,
Sum=>sum(0),
CarryOut=>carry
(1)
);
f1:
fulladderPORTMAP(
a=>a
(1),
b=>b
(1),
CarryIn=>carry
(1),
Sum=>sum
(1),
CarryOut=>carry
(2)
);
f2:
fulladderPORTMAP(
a=>a
(2),
b=>b
(2),
CarryIn=>carry
(2),
Sum=>sum
(2),
CarryOut=>carry(3)
);
f3:
fulladderPORTMAP(
a=>a(3),
b=>b(3),
CarryIn=>carry(3),
Sum=>sum(3),
CarryOut=>carry(4)
);
f4:
fulladderPORTMAP(
a=>a(4),
b=>b(4),
CarryIn=>carry(4),
Sum=>sum(4),
CarryOut=>carry(5)
);
f5:
fulladderPORTMAP(
a=>a(5),
b=>b(5),
CarryIn=>carry(5),
Sum=>sum(5),
CarryOut=>carry(6)
);
f6:
fulladderPORTMAP(
a=>a(6),
b=>b(6),
CarryIn=>carry(6),
Sum=>sum(6),
CarryOut=>carry(7)
);
f7:
fulladderPORTMAP(
a=>a(7),
b=>b(7),
CarryIn=>carry(7),
Sum=>sum(7),
CarryOut=>cout
);
ENDripple;
六、实验结果
加法器设计:
第一操作数opr1[7..0]对应于实验台上开关SD7~SD0;
第二操作数opr2[7..0]对应实验台上开关SD15~SD8;
运算结果result[15..0]对应实验台上指示灯A7~A0。
通过开关SD7~SD0表示第一操作数,开关SD15~SD8表示第二操作数,相加在指示灯A7~A0上即可得到结果。
七、实验心得
通过这次实验,我对基本的算术运算和逻辑运算的运算规则和实现方法的掌握加深了。
除此之外,通过实验,我基本掌握运算器的工作原理,我还学习了如何用运算器实现信息传送通路。
这次实验我们主要学习了加法器的设计与实现。
起初大家都还不熟悉,所以从一位加法器开始做起,慢慢地熟悉起来之后,可以做到八位了。
在此,我很感谢姜老师在实验过程中对我的帮助,因为有老师的帮助我才可以在规定时间里完成实验,并收获了不少知识!
实验三指令译码器(硬连线控制器)的设计与实现
一、实验目的
1、理解指令译码器的作用和重要性;
2、理解控制器中指令与微操作的关系;
3、学习设计指令译码器。
二、实验原理
指令译码器是计算机控制器中最重要的部分。
所谓组合逻辑控制器就是指指令译码电路是由组合逻辑实现的。
组合逻辑控制器又称硬连线控制器,是早期设计计算机的一种方法。
这种控制器中的控制信号直接由各种类型的逻辑门和触发器等组合产生。
这样,一旦控制部件构成后,除非重新设计和物理上对它重新连线,否则要想增加新的功能是不可能的。
结构上的这种缺陷使得硬连线控制器的设计和调试变得非常复杂而且代价很大。
所以,硬连线控制器曾一度被微程序控制器所取代。
但是随着新一代机器及VLSI技术的发展,这种控制器又得到了重视,如RISC机广泛使用这种控制器。
.
图1组合逻辑控制器的结构方框图
图1是组合逻辑控制器的结构方框图。
逻辑网络的输入信号来源有三个:
(1)指令操作码译码器的输出In;
(2)来自时序发生器的节拍电位信号Tk;(3)来自执行部件的反馈信
号Bj。
逻辑网络的输出信号就是微操作控制信号,用来对执行部件进行控制。
组合逻辑控制器的基本原理,可描述为:
某一微操作控制信号Cm是指令操作码译码器的输出In、时序信号(节拍电位信号Tk)和状态条件信号Bj的逻辑函数。
即
Cm=f(In,Tk,Bj)
用这种方法设计控制器,需要根据每条指令的要求,让节拍电位和时序脉冲有步骤地去控制机器的各有关部分,一步一步地执行指令所规定的微操作,从而在一个指令周期内完成一条指令所规定的全部操作。
一般来说,组合逻辑控制器的设计步骤如下。
(1)绘制指令流程图
为了确定指令执行过程所需的基本步骤,通常是以指令为线索,按指令类型分类,将每条指令归纳成若干微操作,然后根据操作的先后次序画出流程图。
(2)安排指令操作时间表
指令流程图的进一步具体化,把每一条指令的微操作序列分配到各个机器周期的各个时序节拍信号上。
要求尽量多的安排公共操作,避免出现互斥。
(3)安排微命令表
以指令流程图为依据,表示出在哪个机器周期的哪个节拍有哪些指令要求哪些微命令。
(4)进行微操作逻辑综合
根据微操作时间表,将执行某一微操作的所有条件(哪条指令、哪个机器周期、哪个节拍和脉冲等)都考虑在内,加以分类组合,列出各微操作产生的逻辑表达式,并加以简化。
(5)实现电路
根据上面所得逻辑表达式,用逻辑门电路的组合或大规模集成电路来实现。
三、实验内容
1、设计目标
根据提供的指令集(附件1),设计CPU的指令译码器,本实验指令译码器的设计相对简单,因为节拍(t1、t2和t3)信号只在存储器读写时需要对存储器地址分时使用时需要考虑,所以这里暂不考虑节拍脉冲t,也就是说微操作控制信号只是指令操作码In和Bj的函数:
Cm=f(In,Bj)
式中的In主要代表指令操作码IR[15..12],还有辅助操作码(如算术逻辑指令时的IR[2..0],我们这里要求只考虑指令操作码IR[15..12]。
Bj代表进位标志C和结果为0标志Z。
要求产生的微操作控制信号如下:
op_code控制ALU进行8种运算操作的3位编码。
c_z_j_flag为1表示需要条件转移。
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表示本条指令写入目的寄存器的值来自读存储器。
2、顶层设计实体的引脚要求
引脚要求的对应关系如下:
(1)指令IR[15..12]对应实验台开关SD3—SD0
进位C对应实验台开关SD4
结果为0标志Z对应实验台开关SD5
(2)控制信号对应如下:
op_code[2..0]指示灯R2、R1、R0
c_z_j_flag指示灯R3
lj_instruct指示灯R4
DRWr指示灯R5
Mem_Write指示灯R6
DW_intruct指示灯R7
change_z指示灯R8
change_c指示灯R9
sel_memdata指示灯R10
四、实验源程序及注释
指令译码器:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
--实体的定义部分
entityinstruction_decoderis
port(IRH:
instd_logic_vector(3downto0);//指令操作码IR[15..12]
c,z:
instd_logic;//c表示进位标志,z表示结果为0标志
op_code:
outstd_logic_vector(2downto0);//控制ALU进行8种运算操作的3位编码
c_z_j_flag:
outstd_logic;//为1表示需要操作转移
lj_instruct:
out