8位CPU的设计VHDL语言综合性实验实验报告.docx
- 文档编号:28679986
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:65
- 大小:235.66KB
8位CPU的设计VHDL语言综合性实验实验报告.docx
《8位CPU的设计VHDL语言综合性实验实验报告.docx》由会员分享,可在线阅读,更多相关《8位CPU的设计VHDL语言综合性实验实验报告.docx(65页珍藏版)》请在冰豆网上搜索。
8位CPU的设计VHDL语言综合性实验实验报告
综合性实验报告
计算机组成原理
年级专业班级:
10级软工R3班
小组号:
5
完成日期:
2012-06-06
小组成员、组内分工及各成员成绩
学号
姓名
(组长排第一个)
分工
工作量比例(组长指定)
自评成绩
(组长指定)
201031000326
杨湧
通用寄存器
34%
100
201031000325
严英鹏
ALU相关
22%
100
201031000430
郑兆龙
存储器
22%
100
201031000327
杨宇
控制逻辑
22%
100
【分工包括:
取指及调试、控制逻辑、执行(ALU相关)、通用寄存器组、存储器等】
(一)实验类型:
验证性+设计性
(二)实验类别:
综合性专业基础实验
(三)实验学时数:
8学时
(四)实验目的
理解和验证参考代码,并在其基础上,通过适当改造,尝试设计一个简单的CPU,并测试其结果。
(五)实验内容
设计一个能验证计算机CPU工作原理的实验系统,包括取指部分、指令译码部分、执行部分、通用寄存器组以及存储器,并测试其结果。
(六)实验要求
根本目标:
缩小到8位的数据通路,也即是4位OP和4位的地址码。
(参考代码是16位数据通路,也即8位OP和8位的地址码)
(参见实践报告.doc中的9-11页的指令系统总体说明)
学生按照实验要求,在实验平台上实现具有存储与运算功能的计算机系统,并能通过测试,以验证其正确性。
具体要求如下:
(1)取指及调试(组长兼任)。
熟悉指令取指过程,并把16位的部分改为8位。
使用DebugController和系统中的调试模块(reg_testa.vhd,reg_test.vhd)。
(2)熟悉电原理图的连接,以通用寄存器组部分为例。
实现上,用实验4所用的简单通用寄存器组(4个寄存器+1个2-4译码器+2个4选1多路开关)设计方法,替代参考代码中的通用寄存器组部分。
(3)学习和掌握控制逻辑。
设计一套指令集(可在原参考代码指令集的基础上做删减,从中选取16条基本的指令),并修改控制器中指令集的译码部分。
(4)执行部件,ALU的改造。
可在原参考代码的基础上,改变某些运算功能的实现方式,比如加、减、增1、减1等算术运算。
实现上,原参考代码采用了最少编码量的“+”、“-”号实现。
可以改用通过portmap语句调用系统自带的加法器,也可以进一步自己编写加法器,然后用portmap语句调用。
(5)存储器部分的加入。
原参考代码采用的带外部存储器的模式。
实现上,可以在实验3的基础上,设计一个适合加到本CPU系统的存储器部分,通过与原参考代码系统连接外带存储器的数据线、控制线和地址线相连接。
此部分设计中,存储器的指令置入是一个难点。
可以考虑简单点的作为只读模式把指令写死在存储器中(可用于验证指令的执行);或者考虑在reset的那一拍里,实现存储器中待指令的置入。
存储器模块单独调试可行后再加到系统上。
(七)实验设备
TEC-CA组成原理实验箱。
(八)实验课承担单位:
信息学院
(九)总结构图(组长负责组织填写)
(十)指令集(组长负责组织填写)
(参考实验大纲中的示例,结合各小组自己的设计),撰写内容可参照参考材料的实践报告.doc中的指令系统总体说明(p9-11页)
(1)指令格式分类(按指令字长和操作数不同):
单字单操作数指令
74
32
10
OPCODEDEST_REG00
OPCODEOFFSET
包括:
DEC,INC,SHL,SHR,JR,JRC,JRNC,JRZ,JRNZ,JRS,JRNS
单字双操作数指令
74
32
10
OPCODEDEST_REGSOUR_REG
包括:
ADD,SUB,AND,CMP,XOR,TEST,OR,MVRR,ADC,SBB,LDRR,STRR
单字无操作数指令
74
32
10
OPCODE0000
包括:
CLC,STC
双字单操作数指令
74
32
10
OPCODE0000
ADR
包括:
JMPA
双字双操作数指令
74
32
10
OPCODEDEST_REG00
DATA
包括:
MVRD
(2)指令的分组及节拍:
由于没有中断操作,本机指令的执行步骤可概括如下:
读取指令:
地址寄存器<-指令地址,修改PC内容使其指向下一条将要执行的指令;
读内存,指令寄存器<-读出的内容。
分析指令
执行指令:
通用寄存器之间的运算或传送,可1步完成;
读写内存,通常要两步完成。
根据指令的执行步骤不同,可以把全部指令分为A、B两组。
其中A组指令完成的是通用寄存器之间的数据运算或传送,或其他一些特殊操作,在取指之后可一步完成,包括:
ADD、SUB、AND、XOR、OR、INC、DEC、CMP、ADC、JR、JRC、JRNC;B组指令完成的是一次内存读写操作,在取指之后可两步完成,包括:
JMPA,LDRR,STRR,MVRD。
在编码的时候以指令操作码的最高位来区分A、B组指令,0为A组指令,1为B组指令。
在控制器方面我们选用了组合逻辑控制器方案。
使用节拍来标记每条指令的执行步骤。
由指令而定,在我们的系统中不同的执行步骤只有5个,故使用3位节拍就足够了。
000
001
B组指令
101111
A组指令
011
(3)指令汇总表:
节拍
指令
编码
Sci
SST
I7I6
I5I4I3
I2I1I0
/WR
REC
注释
000
01
11
10
100
000
1
01
AR<-PC,PC<-PC+1
001
00
11
00
000
000
1
10
IR<-MEM
011
ADD
0000
00
00
01
000
000
1
00
DR<-DR+SR
SUB
0001
00
00
01
000
001
1
00
DR<-DR-SR
AND
0010
00
00
01
000
010
1
00
DR<-DRandSR
XOR
0011
00
00
01
000
100
1
00
DR<-DRxorSR
OR
0100
00
00
01
000
011
1
00
DR<-DRorSR
INC
0101
01
00
01
010
000
1
00
DR<-DR+1
DEC
0110
01
00
01
010
001
1
00
DR<-DR-1
CMP
0111
00
00
00
000
001
1
00
DR-SR
ADC
1000
10
00
01
000
000
1
00
DR<-DR+SR+C
JR
1001
00
11
10
011
000
1
00
PC<-OFFSET+PC
JRC
1010
00
11
C0
011
000
1
00
PC<-OFFSET+PC
JRNC
1011
00
11
/C0
011
000
1
00
PC<-OFFSET+PC
101
JMPA
1100
01
11
10
100
000
1
01
AR<-PC,PC<-PC+1
MVRD
1101
01
11
10
100
000
1
01
AR<-PC,PC<-PC+1
LDRR
1110
00
11
00
001
000
1
11
AR<-SR
STRR
1111
00
11
00
010
000
1
11
AR<-DR
111
JMPA
1100
00
11
10
101
000
1
00
PC<-MEM
MVRD
1101
00
11
01
101
000
1
00
DR<-MEM
LDRR
1110
00
11
01
101
000
1
00
DR<-MEM
STRR
1111
00
11
00
001
000
0
00
MEM<-SR
(十一)各部分设计(组内同学各写各自部分)
注意把所有能体现修改的都做注释,记住一开始我和大家说的,修改越多在某种程度上代表着对该模块更深刻的理解,因此得分也会越高。
0.整体描述(组长填写)
(8-10句话描述你们小组的工作,包括5个部分的改动(少于4个同学的组注明哪一部分不作改动)在最后的系统中,多少个整合后能通过编译,多少个整合后可以运行)。
●组长负责通用寄存器的改动,实质上是通过实验4,将原来的独立开来的16个寄存器整合到一个regfile中,最后需要总体将16位改成8位,并进行总体调试。
●郑兆龙负责存储器部分,基于实验3的asynram.vhd进行改造,并把N条指令写死到内存模块并能随着脉冲的控制送到IR中,并在这个基础上把内存的输入输出信号,在reg_out中分别增加了两种观测。
●严英鹏负责ALU部分,改变alu的加减法的实现方式,去掉加减号,改为portmap语句调用自己设计的八位加法器实现加减法,以及改相应的通路及调试相应部分
●杨宇负责控制逻辑部分,修改controller和timer的代码,对16条指令进行编号。
●最终所有部分整合后都能通过编译,都可以运行且测试正确。
1.取指及调试
(0)是否加到最后整组的系统中
如果回答为否,可跳过第
(1)和
(2)问。
是
(1)修改后是否编译通过(指加到整个小组的系统里)
是
(2)修改后是否可运行(指加到整个小组的系统里)
是
(3)概要描述
(2-3句话描述你的工作)
熟悉指令取指过程。
使用DebugController和系统中的调试模块(reg_testa.vhd,reg_test.vhd)。
(4)相关的源代码、电原理图和其它说明表格。
1.指令取址过程
CPU把指令指针的内容直接反映到地址总线上-->内存控制器从内存中读取指令-->内存控制器把读取到的指令送上数据总线-->CPU从数据总线上读到指令的二进制码-->CPU执行指令
2.使用DebugController调试
1)将实验台背后的9针插座和PC机的一个串行口用RS232通讯电缆连接,将实验小板上的下载插座和PC机的并行口用下载电缆连接。
打开实验台电源。
2)启动DebugController程序。
启动程序后,程序自动扫描可用串口。
程序会向COM1~COM4顺序发送一个测试命令,等待测试命令的会送命令,如果X号串口不可用,则会在提示信息窗口显示“COMxnotfoundorcannotopen.Checkcableorhardware!
”;如果x号串口可用但是测试命令没有送回,则会显示“COMxtimedout,currentoperationaborted…YoumustrecondigCOM!
”;如果x号串口可用而且测试命令得到了会送,会显示“AutoscanlinkedTEC-CAonCOMxSuccessfully”。
3)打开位汇编代码文件ex1.txt和打开编译规则文件cpu.txt。
4)点击Build菜单中的CompileCode或者点击工具栏中的
,将伪汇编文件编译为16进制文件。
5)将实验平台的调试模式设置为FPGA-CPU附加外部RAM运行模式(REGSEL=0,CLKSEL=1,FDSEL=1)过着单片机控制FPGA-CPU调试运行模式(REGSEL=1,CLKSEL=0,FDSEL=1)。
6)点击Build菜单中的UploadBIN或者点击工具栏中的
,将16进制代码文件上传到存储器(RAM)中。
传完之后在LogWindow中会有提示信息。
7)在使用Quartus软件将CPU设计经编译、连接和适配后,将它下载到FPGA中,在FPGA中生成一个物理CPU。
将实验平台上的调试模式设置为单片机控制FPGA-CPU调试运行模式(REGSEL=1,CLKSEL=0,FDSEL=1),就可以通过DebugController对FPGA-CPU进行调试了。
8)点击Debug菜单中的BeginDebug,或者点击工具栏中的
开始调试。
9)可以使用Debug(调试菜单)中的子菜单,也可以使用工具栏的
,一次代表HalfCycle,OneCycle,RunToBP,Reset和EndDebug。
10)特别之处,设置断点是在DebugWindow相应的行上鼠标双击,取消断点也是相应的鼠标双击。
由于单片机指令本身只支持单断点,所以程序中也只能设置单个断点。
11)结束调试。
结束调试前如果要查看实验台上存储器的内容,请使用DownloadRAM(从存储器读二进制文件)命令。
点击Debug菜单中的EndDebug或者工具栏上的
,结束Debug模式。
12)注意:
在结束Debug之后,如果想重新进入Debug模式,必须手动选择串口。
有改动过的或者新增的.bsf图、vhd文件内容,以及相关电原理图截图、用于说明的表格、用于说明的示意图等。
(加注释,特别是在参考材料的源代码基础上改动之处,用蓝色标出)。
可以部分参照参考材料的文档写法。
特别注意:
如果没被抽中去演示,则主要根据分工所对应的这部分设计的撰写的内容评分,因此要尽量详细地介绍你的工作。
2.控制逻辑
(0)是否加到最后整组的系统中
如果回答为否,可跳过第
(1)和
(2)问。
是
(1)修改后是否编译通过(指加到整个小组的系统里)
是
(2)修改后是否可运行(指加到整个小组的系统里)
是
(3)概要描述
(2-3句话描述你的工作)
主要是选择了16条指令并对其进行修改,并且对controller和timer的代码进行修改。
(4)相关的源代码、电原理图和其它说明表格。
有改动过的或者新增的.bsf图、vhd文件内容,以及相关电原理图截图、用于说明的表格、用于说明的示意图等。
(加注释,特别是在参考材料的源代码基础上改动之处,用蓝色标出)。
可以部分参照参考材料的文档写法。
特别注意:
如果没被抽中去演示,则主要根据分工所对应的这部分设计的撰写的内容评分,因此要尽量详细地介绍你的工作。
Controller代码
libraryieee;
useieee.std_logic_1164.all;
entitycontrolleris--实体描述
port(timer:
instd_logic_vector(2downto0);--节拍
instruction:
instd_logic_vector(7downto0);--指令内容
c,z,v,s:
instd_logic;--标志位
dest_reg,sour_reg:
outstd_logic_vector(1downto0);--目的和源寄存器的选择信号
offset:
outstd_logic_vector(3downto0);--偏移地址
sst,sci,rec:
outstd_logic_vector(1downto0);--输出各个控制信号
alu_func,alu_in_sel:
outstd_logic_vector(2downto0);
en_reg,en_pc,wr:
outstd_logic);
endcontroller;
architecturebehaveofcontrolleris
begin
process(timer,instruction,c,z,v,s)
variabletemp1,temp2:
std_logic_vector(3downto0);
variabletemp3,temp4:
std_logic_vector(1downto0);
variablealu_out_sel:
std_logic_vector(1downto0);
begin
forIin3downto0loop
temp1(I):
=instruction(I+4);--暂存指令高4位
temp2(I):
=instruction(I);--暂存指令低4位
endloop;
forIin1downto0loop
temp3(I):
=instruction(I+2);--暂存低4位中的高2位
temp4(I):
=instruction(I);--暂存低4位中的低2位
endloop;
casetimeris
when"100"=>--初始状态
dest_reg<="00";
sour_reg<="00";
offset<="0000";
sci<="00";
sst<="11";
alu_out_sel:
="00";
alu_in_sel<="000";
alu_func<="000";
wr<='1';
rec<="00";
when"000"=>--读取指令第一拍
dest_reg<="00";
sour_reg<="00";
offset<="0000";
sci<="01";
sst<="11";
alu_out_sel:
="10";
alu_in_sel<="100";
alu_func<="000";
wr<='1';
rec<="01";
when"001"=>--读内存,放到指令寄存器
dest_reg<="00";
sour_reg<="00";
offset<="0000";
sci<="00";
sst<="11";
alu_out_sel:
="00";
alu_in_sel<="000";
alu_func<="000";
wr<='1';
rec<="10";
when"011"=>--A组指令
wr<='1';
rec<="00";
casetemp1is
when"0000"=>--ADD
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="00";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="000";
alu_func<="000";
when"0001"=>--SUB
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="00";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="000";
alu_func<="001";
when"0010"=>--AND
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="00";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="000";
alu_func<="010";
when"0011"=>--XOR
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="00";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="000";
alu_func<="100";
when"0100"=>--OR
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="00";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="000";
alu_func<="011";
when"0101"=>--INC
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="01";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="010";
alu_func<="000";
when"0110"=>--DEC
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="01";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="010";
alu_func<="001";
when"0111"=>--CMP
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="00";
sst<="00";
alu_out_sel:
="00";
alu_in_sel<="000";
alu_func<="001";
when"1000"=>--ADC
dest_reg<=temp3;
sour_reg<=temp4;
offset<="0000";
sci<="10";
sst<="00";
alu_out_sel:
="01";
alu_in_sel<="000";
alu_func<="000";
when"1001"=>--JR
dest_reg<="00";
sour_reg<="00";
offset<=temp2;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CPU 设计 VHDL 语言 综合性 实验 报告