资源描述
计算机组成原理课程设计任务书
39
2020年4月19日
文档仅供参考,不当之处,请联系改正。
课 程 设 计
课程名称: 计算机组成原理
设计题目: 一个非常简单的CPU的设计
学 院: 信息工程与自动化
专 业: 计算机科学与技术
年 级: 08级 1班
学生姓名: 张桥
指导教师: 李凌宇
日 期: -9-9
教 务 处 制
课 程 设 计 任 务 书
信息工程与自动化 学院 计算机 专业 08 1 年级
学生姓名: 张桥
课程设计题目: 一个简单的CPU的设计
课程设计主要内容:
设计一台完整的计算机。首先要确定该计算机的功能和用途。在设计中根据功能和用途确定指令系统,定义数据通路,设计每条指令的执行流程,要求利用微程序进行设计,每人至少要求4条CPU指令,能够自己选择;在设计中要求画出指令系统的格式并说明各位的意义;要求画出数据通路并定义微操作信号;要求画出微程序流程图。
设 计 指 导 教 师 (签字):
教学基层组织负责人(签字):
年 月 日
一台模型计算机的设计
一、教学目的、任务与实验设备
融会贯通本课程各章节的内容,经过知识的综合运用,加深对计算机系统各模块的工作原理及相互联系的认识,加深计算机工作中“时间—空间”概念的理解,从而清晰地建立计算机的整机概念。
二、数据格式和指令系统
本模型机是一个8位定点二进制计算机,具有四个通用寄存器:R0~R3,能执行11条指令,主存容量为256KB。
1. 数据格式
数据按规定采用定点补码表示法,字长为8位,其中最高位(第7位)为符号位,小数点位置定在符号位后面,其格式如下:
数值相对于十进制数的表示范围为:
-1≤X≤1―2―7
2. 指令格式及功能
由于本模型机机器字只有8位二进制长度,故使用单字长指令和双字长指令。
⑴ LDR Ri,D
格式 7 4 3 2 1 0
0 0 0 0
Ri
不 用
D
功能:
Ri←M(D)
(2) STR Ri,D
格式 7 4 3 2 1 0
0 0 0 1
Ri
不 用
D
功能:
M(D)←(Ri)
(3) ADD Ri,Rj
格式 7 4 3 2 1 0
0 0 1 0
Ri
Rj
功能:
Ri ←(Ri)+ (Rj)
(4) SUB Ri,Rj
格式 7 4 3 2 1 0
0 0 1 1
Ri
Rj
功能:
Ri ←(Ri)- (Rj)
(5) AND Ri,Rj
格式 7 4 3 2 1 0
0 1 0 0
Ri
Rj
功能:
Ri ←(Ri)∧ (Rj)
(6) OR Ri,Rj
格式 7 4 3 2 1 0
0 1 0 1
Ri
Rj
功能:
Ri ←(Ri)∨ (Rj)
(7) MUL Ri,Rj
格式 7 4 3 2 1 0
0 1 1 0
Ri
Rj
功能:
Ri ←(Ri)× (Rj)
(8) 转移指令
格式 7 4 3 2 1 0
0 1 1 1
条件
不 用
D
功能:
条件码 00 无条件转移 PC ← D
01 有进位转移 PC ← D
10 结果为0转移 PC ← D
11 结果为负转移 PC ← D
⑼ IN Ri,M j
格式 7 4 3 2 1 0
1 0 0 1
Ri
Mj
其中M j为设备地址,能够指定四种外围设备,当M j=01时,选中实验箱的二进制代码开关。功能:
Ri ← (M j)
⑽ OUT Ri,M j
格式 7 4 3 2 1 0
1 0 1 0
Ri
Mj
当M j=10时,选中实验箱的显示灯。功能:
(M j)← Ri
⑾ HALT(停机指令)
格式 7 4 3 2 1 0
1 0 1 1
不用
不用
功能:
用于实现停机。
三、总体设计
总体设计的主要任务是
(1) 选定CPU中所使用的产要器件;
(2) 根据指令系统、选用的器件和设计指标,设计指令流的数据通路;
(3) 根据指令系统、选用的器件和设计指标,设计数据流的数据通路。
计算机的工作过程,实质上是不同的数据流在控制信号作用下在限定的数据通路中进行传送。数据通路不同,指令所经过的操作过程也不同,机器的结构也就不—样,因此数据通路的设计是至关重要的。所谓数据通路的设计,也就是确定机器各逻辑部件相对位置的总框图。
数据远路的设计,当前还没有非常标准的方法。主要是依据设计者的经验,并参考现有机器的三种典型形式(单总线、双总线或三总线结构),根据指令系统的要求,可采用试探方法来完成。其主要步骤如下:
(1) 对指令系统中的各条指令进行分析,得出所需要的指令周期与操作序列,以便决定各器件的类型和数量。
(2) 构成一个总框图草图,进行各逻辑部件之间的互相连接,即初步确定数据通路,使得由指令系统所包涵的数据通路都能实现,并满足技术指标的要求。
(3) 检验全部指令周期的操作序列,确定所需要的控制点和控制信号。
(4) 检查所设计的数据通路,尽可能降低成本,简化线路。
以上过程能够重复进行,以便得到一个较好的方案。
图1给出了一个没有考虑乘法除法指令操作的总框图参考方案,注意,在此方案确定之后,应该检查所选用的各个器件是否满足数据通路的要求。实际上,数据通路的设计与器件的选择应同时进行而不能分离地工作。其次,接入总线的器件都要有三态输出,以便与总线连接。另外,在信息传送过程中应当注意器件原码和反码输出的配合关系。
图1所示的方案采用单总线结构,使用的许多器件都是三态输出,这种方案便于总线的连接和扩展,但缺点是指令和数据的传送都要经过总线,因此对总线的使用权就要分配得当。另外,执行算术逻辑指令时,先将第一个操作数由通用寄存器Ri送至缓冲寄存器DR1,然后再由通用寄存器Rj取第二个操作数送至缓冲寄存器DR2,之后送往ALU进行运算。显然,执行—条算术逻辑指令的时间相应要长一些。
图1 模型机数据通路框图
四、微程序控制器
数据通路框图—旦确定,指令流与数据流的通路也就随之最后确定,因而运算器和控制器的大部分结构也就确定下来了。
图1中各功能器件上还标注了控制点及其控制信号.这些控制信号就是微程序控制器进行设计的依据。
1.微指令格式
微指令格式建议采用水平型微指令,微命令编码采用直接表示法和分段直接译码法相结合的混合表示法,以缩短微指令长度。后继地址采用断定方式。微指令格式如下:
控制字段
判别字段
下址字段
同学们应根据本模型的具体情况来确定各字段的长度。
2. 微程序控制器
根据微指令和微程序的长度,确定控制存储器需选用几片EPROM(2716)用位扩展方式组成。
3.微程序设计
将机器的全部指令系统采用微指令序列实现的过程,叫做微程序设计。一条机器指令对应一个微程序,11条机器指令应当对应11个微程序。
微指令格式确定后,微程序的横向设计在于正确地选择数据通路,纵向设计在于确定后继微指令地址.事实上,微程序设计的关键在于纵向设计,即如何确定下一条微指令的地址。一般的做法是先确定微程序分支处的微地址,因为微程序分支处需要进行判别测试。这些微地址确定以后,就能够在一个“微地址表”中把相应的微地址单元填进去,以免后面的设计中重复使用而未发现,以致造成设计错误。
五、输入输出
输入输出是人机联系的重要手段,输入可采用开关、键盘等方式,输出可采用字符显示或打印输出等方式。考虑到成本与设备因素,本模型机采用最简单的二进制开关输入和发光二极管显示的方法,换句话说,本模型机中只使用两种“外部设备”:一种是二进制代码开关,它作为输入设备;另一种是发光二极管,它作为输出设备。
本设计为了节省器件,输入输出时能够不设置专门的数据缓冲寄存器。例如输入时,二进制开关数据直接经过三态门送到总线上,只要开关状态不变,输入的信息也就不变。输出时,将输出数据送到数据总线BUS上,驱动发光二极管进行显示。
如果采用正规的输入输出方法,可采用相应的器件构成接口电路。
实习经验
首先因设计出ALU计算器模块、R4~R0零时寄存器选择模块、数据通路模块、存储器模块、计数器模块,最后在根据之前设计所需的信号与结果设计安排cpu控制模块,这样的设计思路清晰,省时省力。而我在实验室采取了完全相反的步骤,先设计了cpu控制模块,最后根据控制模块设计其它模块,使得其它模块无法正常匹配cpu模块,不断地修正cpu模块,前后重写代码4次之多严重影响了试验进程。此经验教训应当谨记。
试验步骤:
实验步骤会按照正确的顺序进行,即将cpu控制模块的设计放在最后,先说明其它模块的设计。
ALU计算模块:
设计思想:
预算模块要求5种运算,而且运算数据要求补码表示范围在-1≤X≤1―2―7
先将AND运算和OR运算的电路图做出来,这个比较简单:
AND运算:
OR运算:
接着是加减
法器的设计。
加减法器:
设计思想:
符号浮点数的加减法与符号幅值的加减法相似,但两个有重要区别,首先由于有几个需要特别表示,因此浮点数加法算必须明确地检测出操作数的是否为0,正负无穷,或NaN(not a number),移位,对齐,相加减的方法能处理大部分浮点数的加减法。但它只能对规格化的浮点数进行处理,当操作数为0,正负无穷,或NaN时,浮点数算法必须作特殊处理。
因此,我们能够从符号加减法器开始,然后对结果进行修改,使之成为符号浮点加减法器。
可是后来发现maxplusII中有加减器的运算模块,设置好初值后能够直接拿来使用,原件及具体设置如下:
原件:
Cout有效
8位操作数
有符号
初值设置:
只有三处需要设置:
打开cout输出。
LPM_RERERSENTATION=”SIGNED”
表示操作数为符号数。
LPM_WIDTH=8
表示操作数为8位。
乘法器设计:
同样在maxplusII中找到了乘法器原件,设置初值后便可直接使用。
具体设置及如下:
有符号运算
16位输出结果
必须与操作数相匹配
8位操作数
有符号运算
需要改动的地方有三处:
LPM_REPRESENTATION=”SIGNED”
设置运算为符号赋值运算。
LPM_WIDTHA=8
输入操作数A为8位。
LPM_WIDTHB=8
输入操作数B为8位。
LPM_WIDTHS=16
输出结果为16位,此处的值必须与输入值相匹配。
由于该cpu只显示8位值,因此我只取成法器输出结果的高8位结果。
最终ALU :
由于设计的需要,必须在每次预算执行前对运算方式进行存储,这样能够节省8个重复的cpu状态,同时,为了选择正确的结果输出,需要一个选择器进行筛选。
在maxplusII中发现多路选择器件LPM_MUX,设置初值后能够直接取用;
电路及初值设置如下:
运算器
结果选择器
运算方式存储器
4路输入选择
8位结果输出
LPM,_MUX初值设置:
LPM_SIZE=4
4路输入选择
LPM_WIDTH=8
8位结果输出
数据通路模块:
数据通路模块的作用是控制数据在总线上的传输,包括个寄存器的载入、释放,ALU运算器操作数输入、结果的输出等部分
R4~R1选择模块:
选择模块的功能在这个实验中很重要,其能够大量减少cpu控制模块的状态设置,选择器最基础的功能有根据指令的要求确定特定的临时寄存器的释放和载入。同时根据设计的需要,还要有存储备选数据的能力,避免被总线的上的数据影响最终的选择结果。
设计思路:
有四个临时寄存器,能够由两位决定二进制值决定各个寄存起的编号,可由2—4译码器实现此功能。选择器要能起到选择正确顺序是临时寄存器工作的作用,因此要有控制端控制第一顺序操作的临时寄存器和第二时间操作的临时寄存器(该cpu对寄存器的操作最多只有两个操作步)。最后要决定对所选的临时寄存器是载入还是释放,或者既不载入也不释放。根据这一思路设计的选择模块如下:
载入选择:
选择寄存器
存储预选值
置1有效
是否进行操作选择
操作顺序选择
释放选择:
置0有效
设计思路:
根据试验的要求,数据通路需要一个ALU运算模块,两个数据寄存器,其功能是保存操作数并将得到的操作数直接送入ALU预算模块进行预算。4个零时寄存器R4~R1,一个数据选择模块,控制外部数据输入的计数器。
设计图下:
释放选择
载入选择
数据总线
ALU模块
外部数据输入
临时寄存器
临时寄存器
临时寄存器
数据寄存器
ALU模块
数据总线
存储器模块:
存储器模块的作用即存储程序指令和程序需要的各项数据,以及在恰当的时机读出个指令和数据。包括一个PC计数器(program counter)一个AR寄存器(adress register),一个内存芯片(LPM_RAM_IO)。
设计思路:
CPU要依照指令顺序执行相应程序,在内存中,指令按照顺序配列存储在相应内存单元中,每执行完一条指令,PC自动加一,将地址数据送给AR,RAM取得AR中的地址数据,放出相应地址的指令或操作数。读取指令按此步骤循环。
PC能够用74161计数器完成其功用,由74244控制器数据在争取的时间传给AR,AR可用74273制作,只用于存储RAM中的下一指令或操作数的内存地址。内存由LPM_RAM_IO设置初值后制作完成。
LPM_RAM_IO设置:
内存数据
写实能
读实能
内存大小
地址数据输入
地址数位宽
数据位宽
时钟信号
LPM_FILE=””
内存数据,能够将程序写进.mif文件,然后在此设置相应.mif文件的地址则能够在内存中读取该文件
LP,M_NUMWORDS=256
内存容量大小,实验要求256K
LPM_WIDTH=8
数据显示位宽
LPM_WIDTHAD=8
地址显示位宽
电路设计图:
各输出管脚
各输入管脚
PC计数器
AR
RAM
控制器模块
控制器模块是CPU设计的精髓所在,其功用是控制所有模块能够正确的执行内存中的程序代码。控制器模块要求能够翻译指令码为与之相应的机器码语言。能够在正确的时间放出有效信号,关闭无效信号,协调各模块之间按的工作配合。
设计思路:
ROM模块:
首先根据实验要求,与之前设计的各模块对信号控制的要求,画出CPU状态图:
P
FTHCHT1
FTEHCH2
THETCH3
FETHC2
FETHC2
FETHC2
FETHC2
FETHC2
FETHC2
FETHC2
FETHC2
FETHC2
FETHC2
FETHC2
PC<-M
P
PC+1
PC->AR
PC+1
PC->AR
PC+1
PC->AR
PC+1
RAM->Ri
Ri<-ALU
Ri<-ALU
Ri<-ALU
Ri<-ALU
Ri<-ALU
Ri->M
DR2<-Rj
DR2<-Rj
DR2<-Rj
DR2<-Rj
DR2<-Rj
AR<-M
AR<-M
STOP
M<-Ri
Ri<-M
DR1<-Ri
DR1<-Ri
DR1<-Ri
DR1<-Ri
DR1<-Ri
从这状态图中能够看出,有很多重复的状态,特别是5个运算指令的各个状态完全相同,唯一不同的是每个状态的第一个步骤需要对运算器输入不同的运算选择以确定不同的运算方式,因此能够考虑将5个运算指令的后几个状态整合,以减少cpu的状态。
更改后的状态图:
P
ALU<-IR
ALU<-IR
ALU<-IR
ALU<-IR
ALU<-IR
FETHCH1
FETCH2
FETHC2
P
PC<-M
PC+1
PC->AR
PC+1
CL<-IR
CB<-IR
AR<-M
RAM->Ri
PC->AR
PC+1
FETHC2
AR<-M
RAM->Ri
PC->AR
PC+1
FETHC2
AR<-M
AR<-M
RAM->Ri
FETHC2
FETCH3
CL<-IR
CB<-IR
STOP
FETHC2
Ri<-M
M<-Ri
TETCH2
FETHC2
简化后的设计图共有25个状态,大大缩减了原有的CPU状态,为以后的编码带来很大的方便。需要说明的是由于零食寄存器的特殊设计,需要在每个用到临时寄存器的指令里加入对临时寄存器选择的值,避免错误的出现。
由此状态图得出的指令码不论是水平编码还是垂直编码都需要至少5位代码,因此采用水平编码省去垂直编码所需的译码器的设计。
代码设计:
第一次代码初写:
利用windows的excel软件表明有效信号,有效操作
这是初步的翻译,并没有安排下址,各运算指令没有被化简,只是表明个状态下的有效操作。
第二次代码编译表格:
这次标明了个控制信号的微操作列表,灰色表示微指令,其它颜色表明相应的有效操作信号。依然没有还没有简化各运算的操作,但已分配下址。由于硬件需要,加入了P判断信号,判断微指令来自下址还是来自总线。
第三次更改代码表:
第三次更改代码表,简化了运算步骤,对下址表明不同颜色亦是区分,加入了临时寄存器选择器信号CL CB RL RB。取消了两个冗余信号。
第四次更改代码表:
第四次更改代码标,矫正了pc计数器和AR地址寄存器的载入错误。完善了跳转指令的功能。分别在LOD、STA、IN,OUT上增加了4个状态用来记录要操作的临时寄存器。
最终的控制ROM:
subdesign CTRL
(
S,IR4,IR5,IR6,IR7:INPUT;
SW_BUS,PC_BUS,R_LOAD,R_BUS:OUTPUT;
ALU_BUS,A_S,S1,S0,S_EN,CB,CL,LDDR1,LDDR2:OUTPUT;
RD,WE,ARLD,PCLOAD,PCINC,STOP,IRLD,P,P1:OUTPUT;
AD4,AD3,AD2,AD1,AD0:OUTPUT;
)
VARIABLE OUT[26..0]:NODE;
IN[4..0]:NODE;
BEGIN
IN[]=(S,IR7,IR6,IR5,IR4);
TABLE
IN[]=>OUT[];
B"00000" =>B"001";--SW->PC 1%
B"00001" =>B"010";--PC->AR PC+1 2%
B"00010" =>B"000";--RAM->IR% %CHUSHI 3%
B"10000" =>B"110";%CLCT<-RiRj 4%
B"00110" =>B"011";%AR<-PC PC+1%
B"10011" =>B"110";%AR<-M 5%
B"10110" =>B"001";%M<-Ri% %LDA 6%
B"11000" =>B"110";%CLCT<-RiRj 7%
B"01000" =>B"111";%AR<-PC PC+1%
B"11111" =>B"011";%AR<-M 8%
B"11011" =>B"001";%Ri<-M% %STA 9%
B"10100" =>B"111";%ALU_S<-SiSj 10%
B"00111" =>B"011";%DR1<-Ri%
B"00011" =>B"111";%DR2<-Rj 11%
B"10111" =>B"001";%Ri<-ALU% %ADD 12%
B"11100" =>B"011";%DR1<-Ri% %SUB 13%
B"10010" =>B"011";%DR1<-Ri% %AND 14%
B"11010" =>B"011";%DR1<-Ri% %OR 15%
B"11110" =>B"011";%DR1<-Ri% %MUL 16%
B"10001" =>B"101";%AR<-PC PC+1 17%
B"00100" =>B"001";%PC<-M 18%
B"00101" =>B"001";%PC+1% %JUMP 19%
B"11001" =>B"010";%CLCT<-RiRj 20%
B"01010" =>B"001";%Ri<-Mi% %IN 20%
B"10101" =>B"001";%CLCT<-RiRj 21%
B"01001" =>B"001";%Mi<-Ri% %OUT 21%
B"11101" =>B"001";%STOP&% %HALT 22%
END TABLE;
(SW_BUS,PC_BUS,R_LOAD,R_BUS,ALU_BUS,A_S,S1,S0)=OUT[26..19];
(S_EN,CB,CL,LDDR1,LDDR2,RD,WE,ARLD,PCLOAD,PCINC,STOP,IRLD,P,P1,AD4,AD3,AD2,AD1,AD0)=OUT[18..0];
END;
跳转条件电路:
跳转条件电路要求在符合跳转条件时,更改下址,改变为操作,完成跳转。
设计思路:
跳转与不调转的下址只有一位不同,只要条件满足,只需更改那一位下址代码即可。首先跳转条件有四种,跟据条件转为信号能够用2—4译码器实现。然后经过逻辑电路实现选择确定跳转。
设计电路:
控制模块总图:
IR寄存器
跳转判断
时序电路
ROM
最终cpu总图:
控制器模块
数据通路模块
显示模块
实验总结
这次CPU设计实验是一台模型机的设计. 此模型机是个八位定点二进制计算机,具有四个通用寄存器:R0~R3,能执行11条指令,主存容量为256B。数据格式是定点补码表示法,字长为八位,其中最高位为符号位,小数点位置定在符号位后面。
目的是综合运用前面所学内容,加深对计算机系统各模块的工作原理及相互联系的认识,取得工和设计与组装调试的实践和经验.
模型机可划分为如下四个相对独立的功能模块:运算器、存储器和系统总线;时序产生器;微程序控制器;显示模块,然后一一设计完成。
这次实验微程序控制部分和数据通路部分有很大改进,设计通路时要用四个寄存器,微程序模块也做了相应的改变.
指令码用了25位,要实现11条指令.这是比较关键的,也比较复杂,需要耐心细致地写好VHDL语言.调试的过程再慢慢修改出错的地方.
实习教训:
试验中出现的错误很多,最严重的错误是先设计了总控制器,然后再设计其它电路,这样的做法让我走了很多弯路,不停的在控制器与数据通路模块之间修改徘徊,控制其模块修改了不止4次,数据通路模块不止一次的重写,重新编译。
从本次试验中我明白的不但仅是专业知识,更深刻的体会到,正确的设计步骤与设计理念对一个设计进程的严重影响。不但仅在设计上,再很多其它的方面也是如此。任何事情都要有一个争取的规划,争取的方向,不能够走任何的捷径,没有不回跑就会飞的奇迹出现。
结束语
试验已经完成,但在试验中的很多问题依然在脑中徘徊。试验中得到很多同学的帮助,大家在一起认真讨论,仔细判断各个信号的作用,分析各个模块的逻辑电路组成。这次对比各自模块的优劣,充分体现了共同学习,共同进步的精神。
从本次实践我还领悟到只有将所学知识真正应用到实际操作中,才能更好地掌握,才能不断发现自已存在的问题,从而不断进步.
展开阅读全文