基于proteus的小型CPU的设计
摘要
本文详细介绍了该小型CPU的设计模板及预估实现的功能,然后对模块的原理进行详实的概述。之后对项目设计进行了分析,从原理图和电路设计图方面进行了完整的呈现。在介绍完基本的设计框架后,本文对项目中的每个模块包括ALU、CM、MM等关键模块的设计与实现进行了细致的分析,还有对测试程序的编写以及运算器溢出(CF)等一系列标志字的设计。在功能分析部分,本文主要基于编写好的机器程序,给出ROM中烧写的机器程序以及运行时关键位置的截图以表明CPU实现的正确性。同时本文也分享了笔者的经验教训,包括实验中出现的一些问题及解决;还分享了在项目设计过程中得到的一些思考和对于过程的反思。在本文的结尾,笔者对该项目做了总结,留下了寄语。
关键词:proteus、CPU、机器指令、微指令、存储器、控制器
目录
第一章 前言
第二章 项目准备
2.1 目标
2.2 项目功能分析
2.3 项目元器件
2.4 部分模块原理
第三章 项目设计
3.1项目设计内容
3.1.1 机器指令设计
3.1.2指令寻址方式设计
3.1.3操作数寻址方式设计
3.1.4 微指令设计
3.2指令流程图
3.3 电路设计
3.3.1总体结构图
3.3.2 搭建的电路图
第四章:项目实现
4.1.微指令控制存储器CM的实现
4.2运算器模块的实现
4.3存储器部分(MM)的实现
4.4 测试程序的编写以及运算器溢出(CF)等一系列标志字的设计
第五章 功能测试分析
5.1测试test3程序
5.2 测试test2程序
5.3 测试溢出情况
5.4 测试NOT_NOTD程序
5.5 对Mulit_2程序进行测试
第六章 项目总结
6.1项目设计中遇到的问题及解决
6.2 项目设计的思考与过程总结
6.3 项目设计总结与心得
结语
参考文献
附录
附录一:常见指令格式表
附录二:控存中存储的微指令集
正文
第一章 前言
计算机组成原理是计算机专业的核心专业基础课,也是我们作为计算机专业的学生应该要好好掌握的重要学科。通过计算机组成原理理论课和实验课的学习,我们不仅了解到了计算机的组成以及和计算机体系结构有关的很多理论知识,还学会了运用Proteus来进行软硬件的模拟和设计。
综合系统设计属于设计型实验,不仅锻炼简单计算机系统的设计能力,也考验创新思维,而且通过进行设计及实现,进一步提高分析和解决问题的能力,对于计算机组成原理知识的学习应用意义重大。
因此在学期的末尾,按照老师的要求,基于软件proteus进行设计,以计算机组成原理理论课及实验课学习的一系列知识为基础,实现一个小型CPU作为课程设计来检验这半学期实验课的学习成果。该小型CPU麻雀虽小五脏俱全,具有基本的CPU的功能,包括指令控制,操作控制,时间控制,数据加工,也实现了LOAD,JUMP,ADD等一系列指令,运用微程序来对进行程序控制。
第二章 项目准备
2.1 目标
基于所学的的机器指令集和微程序流程图作为基础,proteus设计知识作为参考,实现一个小型CPU。具体设计功能如下:
(1)整机系统能支持自动和单步运行方式,能正确地执行存放在主存中的程序的功能,对主要的数据流和控制流通过LED适时显示信息。
(2)支持算术运算,逻辑运算,存储器读写,寄存器间接数据传送等几类指令;
(3)支持基本的寻址方式。
(4)支持10条以上的指令;
(5)可运行给定机器指令集的一段程序,程序执行功能正确。
2.2 项目功能分析
这是一个比较复杂的设计任务,需要考虑到多个方面,包括硬件和软件两个层面。下面对每个功能进行分析
(1)整机系统能支持自动和单步运行方式,能正确地执行存放在主存中的程序的功能,对主要的数据流和控制流通过LED适时显示信息。
这个功能可以通过设计包含CPU、主存、以及系统控制模块的电路来实现。其中主存用于存储机器指令和数据,CPU负责处理指令并与主存交互,系统控制模块则用于控制整个系统的运行状态(比如单步运行还是自动运行)。
对于LED的显示,可以将特定数据或控制信号与LED灯连接,当这些信号改变时,LED灯就会亮起来。例如,可以将CPU的寄存器值(如PC和IR)与LED灯连接,用于显示当前执行的指令和指令地址等信息。
(2)支持算术运算,逻辑运算,存储器读写,寄存器间接数据传送等几类指令;
这个功能需要实现多个指令,包括算术运算指令(如加、减、乘、除等)、逻辑运算指令(如与、或、非等)、存储器读写指令以及寄存器间接数据传送指令等。可以通过类似于微指令设计的方式来实现这些指令,即将每个指令分解为多个基本操作(如寄存器读取、加法运算、写回结果等),由CPU的控制逻辑依次执行这些基本操作。
(3)支持基本的寻址方式。
这个功能需要支持多种寻址方式,包括立即数寻址、直接寻址、间接寻址、相对寻址等。这些寻址方式可以在指令中用特定的编码来表示,CPU的控制逻辑根据指令中的编码来决定使用哪种寻址方式。
(4)支持10条以上的指令;
这个功能涉及到具体的指令设计,需要设计不少于10条的指令集,覆盖算术运算、逻辑运算、存储器读写和数据传送等多个方面。可以参考常见的RISC指令集设计思路,保证指令集简洁清晰,并且能够覆盖核心的功能需求。
(5)可运行给定机器指令集的一段程序,程序执行功能正确。
这个功能需要实现指令的解析和执行过程,确保能够正确地解析出每一条指令,并按照指令的要求执行相应的操作。要保证程序的正确性,需要设计充分的测试用例来测试不同指令和数据的组合情况,以确保程序能够正确地执行。
总的来说,此次综合系统设计需要综合考虑多个方面,包括指令设计、硬件电路设计、控制逻辑设计等。
2.3 项目元器件
由于本实验为仿真实验,元器件均为proteus中引用的仿真器件
7SEG-BCD、7SEG-BCD-GRN
74LS273、74LS112、74LS138、74LS139、74LS157、74LS160、74LS161、74LS163、74LS175、74LS181、74LS192、74LS194、74LS240、74LS244、74LS273、74LS373、74LS374
74LS00、74LS04、74LS08、74LS10、74LS11、74LS32、74LS73、74LS74
2764、4078、6116
BUTTON、DIPSWC_8、LAMP、LED-GREEN、LED-RED、LED-YELLOW
OR、RES、RESPACK-8、SW-SPDT、74ALS244
2.4 部分模块原理
(1)ALU模块
ALU是算术逻辑单元的缩写,是CPU中的一个重要组成部分。它主要负责实现各种算术运算和逻辑运算,并将运算的结果传递给寄存器或其他器件。
CPU中的ALU通常由一组处理器件组成,其中包括加法器、减法器、比较器、位移器等。通过这些处理器件,ALU能够实现各种算术和逻辑操作,比如加、减、乘、除、与、或、非、异或等。
ALU在CPU中起到了至关重要的作用。它是CPU能够完成各种数据处理和运算的核心部分,负责处理大量的数据和指令。当CPU需要执行某个指令时,它会将指令送到控制器中进行解码,然后根据指令的类型将操作数送到ALU中进行运算,最终将运算结果保存到寄存器或内存中。
除此之外,ALU还负责实现一些控制逻辑,比如条件分支、跳转等操作。这些操作也需要通过ALU来实现,从而实现程序流程的控制。
总之,ALU是CPU中非常重要的一个部分,它能够实现各种算术和逻辑运算,并且负责实现程序流程控制,是CPU能够完成各种处理和运算的基础。
(2)微指令控制存储器CM
微指令控制存储器(Control Memory,简称CM)是CPU中的一种存储器,它主要用于保存微指令。微指令是CPU执行指令时所需的一些基本操作,比如寄存器读取、算术运算、数据传送等操作。这些微指令被存储在CM中,并由CPU按照特定的顺序进行执行,完成指令的执行过程。
微指令控制存储器在CPU中起到了非常重要的作用。它为CPU提供了一种可编程的控制方式,使得CPU能够支持各种不同的指令和操作。通过编写不同的微指令序列,可以实现不同的操作和功能,从而使得CPU具有更高的灵活性和可扩展性。
此外,微指令控制存储器还能够实现流水线控制、异常处理等功能。通过合理地设计微指令序列,可以实现流水线控制,提高CPU的执行效率;同时,通过在微指令中加入异常处理代码,可以及时响应各种异常情况,保证CPU的正确性和稳定性。
(3)存储器部分(MM)
CPU中存储器部分(Memory Management,简称MM)是计算机系统中非常重要的一个组成部分,它主要负责管理计算机系统中的内存资源。在计算机系统中,内存是用于存储数据和程序的一种硬件设备,而CPU需要通过MM来管理这些内存资源,并且实现对内存的访问和控制。
MM在CPU中扮演着多个重要角色,包括:
内存分配:当CPU需要将数据或程序加载到内存中时,MM会负责管理内存的分配。在内存资源有限的情况下,MM需要能够高效地管理内存,以尽可能地使用可用的内存资源,从而提高计算机系统的性能和效率。
内存保护:在计算机系统中,不同的进程可能同时运行,这些进程需要访问内存中的数据和程序。为了保障每个进程的安全性和稳定性,MM需要能够实现对内存资源的保护,防止某个进程意外地破坏其他进程中的数据或程序。
虚拟内存:为了提高计算机系统的性能和效率,MM还可以实现虚拟内存的功能。虚拟内存是一种将计算机硬盘上的空间作为内存使用的技术,可以将部分不常用的内存数据或程序保存到硬盘上,并在需要时进行加载。通过虚拟内存技术,MM可以提高计算机系统的内存使用率,从而提高计算机的性能和效率。
综上所述,CPU中存储器部分(MM)是计算机系统中非常重要的组成部分,它主要负责管理计算机系统中的内存资源,包括内存分配、内存保护、虚拟内存和内存回收等功能。MM可以提高计算机系统的性能和效率,从而对于整个计算机系统的运行起到至关重要的作用。
第三章 项目设计
3.1项目设计内容
3.1.1 机器指令设计
本次指令设计格式遵循常见指令格式设计原则,机器指令共占8位,其中高四位为操作码OP,低四位为操作数地址ADDR,见以下描述:
7——4位 OP
3——0位 ADDR
3.1.2指令寻址方式设计
(1)顺序寻址:根据PC(74LS161)计数器自动增1,顺序读取下一条指令;
(2)跳跃寻址:根据PC(74LS161)的PC-SET功能,依照跳跃指令内容往计数器中预置打入数据,从而跳转到相应地址。
3.1.3操作数寻址方式设计
(1)寄存器寻址:利用AC(74LS373)寄存器进行寻址;
(2)直接寻址:根据指令中的ADDR所指向的地址得到主存相应数据;
(3)隐含寻址:利用AC(74LS373)寄存器,对于需要双操作数的机器指令只提供一个操作数,另一操作数隐含在AC中。
常见机器指令集见附录一
3.1.4 微指令设计
微指令设计思想:此次设计选取12条指令,分别是取址公操作、store存储指令、load导入指令、jump跳转指令、加、减、与、或、非、地址非、异或等运算指令,以及最后的停机指令。指令采用双周期、自动执行。
微指令设计方案:根据具体的电路原理决定采取16个微程序控制点,然后通过对各个控制点的值来实现对微指令的编码(即各个控制点的值取0或1),不同的指令所对应的各个控制点的编码会有不同。
控存中存储的微指令集见附录二
需要注意的是,这个微指令集特殊的的一点就在于本身微程序设计简单,没有设置下址字段,每条机器指令对应的微程序在执行周期的微程序里只有一条微指令来实现所有的操作。同时,微程序在控存中的地址直接由对应机器指令的OP码来标识。
我认为这样的设计有利有弊。优点很显然,就是简单,由于没有下址字段自然也就没有了微指令的地址转移逻辑等等负责的电路逻辑需要实现。但另一方面,缺点也是明显的,这种只有一条微指令的微程序,能实现的操作显然是十分有限的。但是,综合来说,这种设计虽然简单,但是同样能够体现微程序CPU的设计与实现原理。
3.2指令流程图
我们的实际实现中的指令流程:
当然,以上的流程图中出于简单的考虑,没有标注相关的控制信号,对于微周期的时钟控制也不在画图的考量中。
3.3 电路设计
3.3.1总体结构图
运算通路由181作运算,373锁存组合成的电路,其中包括了AC,DR1,DR2等设计。存储通路由6116作主存,2816作控存的主控存分开方式。同时为方便置数,直接让指令的数据部分与161的输入相连。
3.3.2 搭建的电路图
上图中各个区域的划分如标注所示。其中CM为微指令控制存储器,MM为主存,CLOCK UNIT为时钟控制信号单元,CONTROL LOGIC为控制逻辑电路实现的集中区。TEST LAB为与本CPU主逻辑无直接联系的测试电路,大部分已删除,只留下了一小块用于手动测试ALU芯片工作逻辑的电路。
其中控制逻辑的表达式主要如下:
(以下用 & 表示与运算,||表示或运算,上划线表示非运算,以电路实际为准)
限于篇幅,其他的具体实现不再赘述。
第四章:项目实现
4.1.微指令控制存储器CM的实现
此部分主要是论述微指令控制存储器CM设计的讨论和实现。微指令控制存储器用于存放实现全部指令系统的所有微程序,主要用到74LS273和2764两种芯片。
图4.1 控制存储器
74LS273是一种带清除功能的8D触发器,1D~8D为数据输入端,1Q~8Q为数据输出端,正向脉冲触发,低电平清除
图4.2 74LS273 引脚图
2764 是一种存储芯片,用于存储数据;A0到A12为13条地址信号输入线,容量为8K, D0到D7为数据线,表示芯片的每个存储单元存放一个字节;CE为输入信号,低电平有效;OE为输出允许信号,低电平有效;PGM为编程脉冲输入端,当对芯片编程时,由此端加入编程脉冲信号,读取数据时PMG的值为1;Vpp是电源,正常工作时是+5V。
图4.4 2764 真值表
4.2运算器模块的实现
此部分主要是论述运算器模块(ALU模块)设计的讨论和实现。
运算器模块(ALU模块)数据通路如下图所示:
在运算器通路中,来自主存MM的数据首先打入上行UP缓冲器74LS244中,然后再打入锁存器DR1(74LS373)中。AC累加器(74LS373)是运算器中非常重要的一个器件,从指令系统可以知道,AC不仅负责提供很多运算指令的一个操作数,还将储存运算的结果。2块74LS181级联而成的8位加法器负责运算,并将结果打入DR2(74LS373)中锁存起来,并最终打入AC。
在这个运算通路中,之所以设计出UP和DOWN两个部件,是为了区分从存储器MM中读数据或是存数据。但是由于某些原因,我们组的store指令最终并没有实现,所以DOWN部件并没有发挥其作用,但是为了使运算器通路更加完整,也还是将其保留了下来。
通过上面这个运算器通路,可以完成2个8位的操作数(一个存在指令制定的主存存储单元中,另一个存在AC中)的加、减、与、或、取反等功能。为了增强使用者的体验感,还特意设置了2个数码管显示AC累加器的数值。最终的电路图如下所示:
4.3存储器部分(MM)的实现
此部分主要是论述存储器部分(MM)的设计的讨论和功能实现。
这部分主要包括PC端和IR以及主存两部分。PC——程序计数器负责对程序警示计数,保证程序能够连续执行下去;IR——指令寄存器负责暂存当前正在执行的指令。主存由ROM组成。
由于设计的机器指令的格式为 7——4位 OP 3——0位 ADDR ,因此只需要四位ROM即可,为什么采用ROM而不用其他,原因有:我们用Proteus的话RAM不可烧录程序,故必须组装一个RAM+ROM作为内存。而这样的话,由于机器指令设计是4位的地址码,如果再加一个RAM,ROM可用的空间就很少,对测试程序的条数限制比较大。故我们的选择是使用一片ROM作为主存,依旧实现store指令相关的控制信号,但是没有RAM的情况下,写回信号是无效的,也就是说store指令的执行不会对内存中的数据有实际的影响。至此主存设计完毕。
而对于PC和IR的话就是:程序计数器PC中装入第一条指令地址,然后根据PC中的内容从指存中读取该条指令到IR之中,接着程序计数器加一,为下一条指令做准备。如果遇到JMP指令时,则在将PC加一操作改为将IR中指定的地址打入PC中,然后等待下一条指令执行。电路图如下:
接下来分析存储器的读写过程及部分实现
构思的存储通路是由6116作主存,2816作控存的主控存分开方式。此部分通路中,主要为一片6116做主存,其IO输出数据通过一片373缓冲然后经过一片157选择高四位送给作为寄存器的395芯片,然后送入作为控存的2816芯片中,低四位作为数据地址传回内存,读取操作数。
4.4 测试程序的编写以及运算器溢出(CF)等一系列标志字的设计
本实验设计的部分测试程序如下所示。
由于STORE指令不可用
1.JUMP to 0111:
之前:
取出JUMP指令后:
执行:
2.在跳转后执行LOAD 01H
5.3 测试溢出情况
cf_test程序:
1.ADD 01H:
进行加法前:
2.进行加1后:
5.4 测试NOT_NOTD程序
程序:
1.初始LOAD 0AH:
NOT 0AH:
(结果为F5H)
-
每一个测试程序都是单独的一个文件 //test1.asm这是测试(1-2+2)&3 ORG 0H DB 00010101 //LOAD 1(数存放在0101的地址中) DB 01000110 //ADD 2 DB 01010111 //SUB 2 DB 01101000 //AND 3 DB 11001111 //END DB 00000001 //操作数1 DB 00000010 //操作数2 DB 00000010 //操作数2 DB 00000011 //操作数3 //test2.asm这是测试跳转和load,store的程序 ORG 0H DB 00010011 //LOAD 0011 DB 00110111 //JUMP到0111 DB 10101010 //0011中原本存的数 DB 00000000 //0100中存的数 DB 00000000 //0101中存的数 ORG 7H DB 00010100 //LOAD 0100 DB 11001111 //END //test3.asm这是测试程序 [(8+7)加8] + 9异或6乘2与6减7 ORG 0H DB 00000000 //开始 DB 00011010 //LOAD 8 DB 01001011 //ADD 7 DB 01001010 //ADD 8 DB 01111100 //或 9 DB 10101101 //异或 6 DB 10111110 //乘 2 DB 01101101 //与 6 DB 01011011 //减 7 DB 11001110 //END DB 00001000 //操作数 8 DB 00000111 //操作数 7 DB 00001001 //操作数 9 DB 00000110 //操作数 6 DB 00000010 //操作数 2 下面是一个关于溢出测试的程序 cf_test.asm ORG 0000H DB 00010011B; LOAD FFH DB 01000100B; ADD 1 DB 11001111B; HLT DB 11111111B; NUM FFH DB 00000001B; NUM 1 END
具体的测试文件如下所示
-
测试程序主要测试的是CPU中的算术运算和逻辑运算,以及JUMP,LOAD还有溢出标志位测试。我首先根据我们的测试程序的需要,将程序编写出来,然后编译生成HEX文件,再在测试时将HEX文件烧制进所设计的MM里面去,这样就可以对着程序来进行测试了。
此部分设计的内容还有运算器(ALU)部分的溢位等标准字,这个部分主要组成部分是一个74LS73,74LS73是一个带清除功能的8D触发器,正脉冲触发,低电平清除,当所有位都为0时,由一个或非门得出判断ZF为1,等一个CLK信号来时,打入ZF,同理得SF和CF。
运算器溢位等标志字的相关电路设计如下图所示。
-
第五章 功能测试分析
功能测试分析部分将主要基于编写好的机器程序(存放在工程文件的PROGRAM文件夹下),将会给出ROM中烧写的机器程序以及运行时关键位置的截图以表明CPU实现的正确性。
5.1测试test3程序
主要涉及运算指令
程序:
ORG 0000H DB 00011010B ;LOAD 0FH DB 01001011B ;ADD 08H 17H DB 01001010B ;ADD 0FH 26H DB 01111100B ;or 09H 2FH DB 10101101B ;xor 06H 29H DB 01101101B ;and 06H 00H DB 01011011B ;sub 08H F8H DB 11001110B ;END ORG 1010B DB 00001111B ;num 15 DB 00001000B ;num 8 DB 00001001B ;num 9 DB 00000110B ;num 6 EN
1.指令:LOAD 0FH:
运行LOAD前
运行LOAD后
2.ADD 08H:
执行ADD 08H后ALU显示,结果寄存DR2
结果打回AC中
3.ADD 0FH:
执行ADD 0FH后ALU显示,结果寄存DR1
结果26H打回AC
- or 09H:
-
执行指令or 09H
结果打回AC
5.xor 06H:
-
test3-9 指令xor 06
结果打回AC
6.and 06H:
-
指令and 06H
结果打回AC
7.指令sub 08H
sub 08H:
结果打回AC
5.2 测试test2程序
STORE_JUMP:
ORG 0000H DB 00011100B; LOAD 3 DB 00101101B; STORE (useless) DB 00110111B; JUMP to 0111 ORG 0111B DB 00011101B; LOAD 1 DB 11001111B; HALT ORG 1100B DB 00000011B; num 3 DB 00000001B; num 1 END
-
ORG 0000H DB 00010011B; LOAD FFH DB 01000100B; ADD 1 DB 11001111B; HLT DB 11111111B; NUM FFH DB 00000001B; NUM 1 END
-
ORG 0000H DB 00011010B ;LOAD 0AH DB 10010000B ;NOT 0AH F5H DB 10001011B ;NOTD 08H F7H DB 11001110B ;END ORG 1010B DB 00001010B ;num 0AH DB 00001000B ;num 08H END
NOTD 08H:
(结果为F7H)
5.5 对Mulit_2程序进行测试
程序:
MULTI 2
乘2前为0AH:
乘2:
(结果为14H)
第六章 项目总结
6.1项目设计中遇到的问题及解决
(1)在做这个实验的过程中也出现过很多问题,印象较深的是对于jump指令的执行。由于我比较执着于指令执行的操作应该保证在执行期做,同时也认为这种取巧的做法存在导致其他指令出错的可能,因而产生很多疑问。而后,参考了查找的的指令集进行分析后,发觉我的做法应该会导致出错,同时不是很节省器件,最后还是对此进行了改进。
(2)在存储器和ALU的完整原型搭建了出来后,发现我们所使用的6116RAM在Proteus中是无法烧录程序的,但是如果使用ROM则无法实现store指令,使用ROM+RAM的组合又会增加过多的复杂度而且会使有限的地址空间变得更加紧迫。最终考虑很久后后决定放弃store指令的实现,直接以ROM作为主存使用。
(3)对于ALU运算的检查中,有一次在进行运算时明明所有状态位经过反复检查都是正确的,而且拿另外独立的181芯片手动测试结果也是正确的,但是,对于181这种内部没有时序的芯片,同样的输入竟然会导致不一样的输出。后来修改了程序中几条机器的次序,对于同样的数据运算竟然又正常了,感觉实在是难以理解,后来也不可复现。目前我也只能是怀疑Proteus本身存在的Bug或者是软件破解存在的问题,当然也不排除是自己操作出了失误。
6.2 项目设计的思考与过程总结
(1)微程序指令集上文已有展示,在前期书写时以为简单抄表即可,后来发现格式出错,在进行多次修改后正确完成。在总体线路完成后,进行测试程序的测试。进行测试的程序有test3.asm(测试LOAD、ADD、SUB、or、xor、and指令)、STORE_JUMP.asm(测试JUMP指令)、cf_test(测试溢出、符号变化、零三种运算结果)、NOT_NOTD.asm(测试NOT、NOTD指令)、Mulit2(测试乘2指令)。依次烧入每个测试程序,并对其测试前后变化截图(结果分析中的程序截图),改正程序的一些小错误及一些烧入程序生成二进制文件的对应错误。
(2)在最开始做此实验时,由于对于计组一些知识并不是很熟悉,所以存在很多误解,不过后来期末的复习阶段倒是给了我一个纠正这些错误认知的机会,对于课设中实际要完成的工作有了更加清晰的认知,也意识到计组的知识挺有必要通过这样的大作业来进行实践,才能掌握得比较牢固。在Proteus中进行实际的电路排布时,由于我对于Proteus的使用并不熟悉,所以我花了很多时间去熟悉计组知识与在软件proteus的实际操作之间的融合。
6.3 项目设计总结与心得
(1)首先就知识的学习上,感觉自己相当于重新学了一遍计组。
其实自己在做本次大作业前很长一段时间对计组课没怎么上心,而后为了要完成计组8086实验和本次综合设计实验,花了几天重新啃了课本中微程序的相关章节,感觉教材写的挺好的,在要点的讲解上十分清晰,对于我理解小型CPU的设计起到了很大的帮助。而通过综合系统的设计的实践,又进一步巩固了这些知识,让我对于微程序CPU的原理和设计有了一个清晰的认识。此外,我也借此机会学会了Proteus的“高阶”操作,对于电路图的搭建、仿真,测试程序的编写和烧录也比较熟练了。
(2)学会了程序调试的相关方法,因为此次综合设计实验是分成各个部分来进行设计的,所以在设计过程中,很多的东西是缺失的,比如最为典型的,在运算器的设计过程中,我们的数以及关于时钟的部分是缺失的,但我们设计出来以后也不能保证我们的设计是一定没有问题的,所以这需要一定的调试技巧,比如用拨码开关等形式来代替时钟信号和数据来源,这样我就可以很方便地来对设计的部分进行检查了。
(3)学习和了解了关于计算机硬件设计相关的知识,对计算机组成和体系结构有了更为深入的了解,即使以后可能不会从事相关的工作,我也算是对计算机有了一定的了解。
-
ORG 0000H DB 00011010B ;LOAD 0AH DB 10010000B ;NOT 0AH F5H DB 10001011B ;NOTD 08H F7H DB 11001110B ;END ORG 1010B DB 00001010B ;num 0AH DB 00001000B ;num 08H END
-
结语
在这一次的计算机组成原理课程综合系统设计中,我学到了很多东西,不仅仅是课本上的知识,还有动手能力。在做课程设计之前已经在proteus软件上做过相关的一些小实验,如算术逻辑运算器、加法器、8086最小系统的设计,但都是根据老师所给出的实验步骤和内容进行操作,验证程序,并没有自己去搭建一个cpu因为之前实验电路图的模型和设计步骤都有给出,对proteus的使用也仅限于找寻器件、基本模式连线、父子图综合设计、总线模式连线等基本操作,并不是很清楚proteus软件中一些功能的作用和芯片的位置,但在这一次课设中因为要自己找芯片,所以对proteus的使用也更熟练。还有对指令的了解也更深刻,对程序运行的过程也更清晰,这些都是课本之外的知识。
总之,在这一次的课程设计中巩固了课堂知识,也增强了动手能力,收获很大。因为时间的关系,并没有对这个小型CPU做更多定制的功能和扩展,如果以后有机会的话,一定会把它做得更好。
在报告的最后,还要感谢袁老师在计算机组成原理实验课上的指导,让我通过这些仿真实验对理论知识有了更深的理解 ,也让我实践能力得到了提升。虽然您也是第一次负责计算机组成原理实验课的教学,但您依旧从容地给我们安排
实验任务,让我们在一次又一次的实验课上学到知识,掌握能力,得到真正的提升!
参考文献
[1] 赖晓铮.基于Proteus的计算机系统实验教程:逻辑、组成原理、体系结构、微机接口. 机械工业出版社,2017.
[2] 秦磊华,王小兰. 计算机组成原理实验指导及课程设计指导书(基于EDA平台). 武汉:华中科技大学出版社,2010.
[3] 秦磊华,吴非,莫正坤.计算机组成原理. 北京:清华大学出版社,2011.
[4] DAVID A.PATTERSON(美).计算机组成与设计硬件/软件接口(原书第3版).北京:机械工业出版社. 2007.
[5] 袁春风编著. 计算机组成与系统结构. 北京:清华大学出版社,2011.
附录
附录一:常见指令格式表
指令全称 | 指令地址 | 指令功能 |
LOAD ADDR | 0001 | 取操作数指令,将ADDR所指向的内存单元中的操作数取出,然后打入AC中 |
STORE ADDR | 0010 | 回存指令,将计算结果回存打入地址ADDR所指向的内存单元MM中 |
JMP ADDR | 0011 | 跳转指令,使程序跳转到地址ADDR所指向的单元,然后读取下一条指令(依赖PC) |
ADD ADDR | 0100 | 加法指令,实现(AC)加(ADDR),且将结果打入AC |
SUB ADDR | 0101 | 减法指令,实现(AC)减(ADDR),且将结果打入AC |
AND ADDR | 0110 | 与指令,实现(AC)&(ADDR),且将结果打入AC |
OR ADDR | 0111 | 或指令,实现(AC)&(ADDR),且将结果打入AC |
NOT ADDR | 1000 | 取反指令,实现,且将结果打入AC |
NOT | 1001 | 取反指令,实现,且将结果打入AC |
A异或B | 1010 | 异或指令,实现(AC)异或(ADDR),且将结果打入AC |
A加A | 1011 | 乘2指令,实现(AC)加(AC),且将结果打入AC |
END | 1100 | 结束指令,程序终止运行 |
附录二:控存中存储的微指令集
指令 | 地址 | C15 STOP | C14 LOAD | C13 161_置数 | C12 DR2_CONT | C11 DR2_G | C10 AC_G | C9 DR1_G | C8 DOWN_244 | C7 UP_244 | C6 S3 | C5 S2 | C4 S1 | C3 S0 | C2 M | C1 Cn | C0 6116_WE |
取址 | 0000 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
LOAD | 0001 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
STORE | 0010 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
JMP | 0011 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
ADD | 0100 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
SUB | 0101 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
AND | 0110 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
或 | 0111 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
NOTD | 1000 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
NOT | 1001 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
异或 | 1010 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
乘2 | 1011 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
END | 1100 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
2023-06-18