1、信息科学与工程学院课程设计报告课程名称: 计算机组成原理与结构 题目: 单周期 CPU 逻辑设计 年级/专业: XXXXXXXXXXXXXXX X 学生姓名: 王侠侠、李怀民 学号: XXXXXXXXXXXXXXXXXXX 指导老师: XXXX 开始时间:2016 年 9 月 15 日结束时间:2016 年 11 月 15 日目 录摘 要一、 设计目的与目标1.1 设计目的1.2 设计目标二、 课程设计器材2.1 硬件平台2.2 软件平台三、CPU 逻辑设计总体方案3.1 指令模块3.2 部件模块四、模块详细设计4.1 指令设计模块4.2 部件设计模块五、实验数据5.1 初始数据5.2 指令数
2、据六、结论和体会七、参考文献摘 要本 CPU 设计实验以 Quartus II 9.0 为软件设计平台,以Cyclone 采 III 型号 EP3C16F484C6 为 FPGA 实测板。此 CPU 设计采用模块化设计方案,首先设计指令格式模块,此模块决定 CPU 各个部件的接口数据容量及数量,再对 CPU 各个部件独立设计实现,主要涉及的部件有:寄存器组、控制器、存储器、PC 计数器、数据选择器、ALU 单元以及扩展单元。分部件的设计通过软件平台模拟仿真各部件的功能,在确保各部件功能正确的情况下,将所有部件模块整合在一起实现 16 位指令的 CPU 功能。再按照指令格式设计的要求,设计出一套
3、能完整运行的指令,加载到指令存储器中,最终通过在 FPGA 实测板上实现了加 2 减 1 的循环运算效果,若要实现其他效果,也可更改指令存储器或数据存储器的数据而不需要对内部部件进行更改元件。关键词:CPU 设计、16 位指令格式、模块化设计、Quartus 软件、CPU 各部件1一、 设计目的与目标1.1 设计目的1) 了解 Quartus II 软件的使用,学习软件环境下设计 CPU 的基本过程;2) 在 Quartus II 平台上完成各个单元的设计,加深对每个单元(控制器、寄存器、存储器等)工作原理的理解;3) 对各个单元组合而成的 CPU 进行指令测试,配合使用模拟仿真,了解指令和数
4、据在各个单元中的传输过程及方向。1.2 设计目标1) 设计一个单周期 CPU,能实现基本的指令功能,如 ADD,SUB 指令实现对操作数加减功能,LW,SW 指令实现从存储器取数和存数,J 指令实现指令间的跳转。2) 采用模块化设计 CPU,通过模拟仿真保证各模块的正确性,以保证最终 CPU功能的正确性,能正确地在 FPGA 板上完成指令设计的效果。3) 通过设计合理的 16 位指令,实现从存储器取初始数和存数,对初始数进行加减操作,通过修改存储器初始数据,实现 FPGA 上 LED 显示无限加 n 减 m的效果。二、 课程设计器材2.1 硬件平台本实验所需的硬件主要有:PC 微型计算机和 F
5、PGA 板-Cyclone III 系列,型号 EP3C16U484C6 实验开发板以及 USB 连接线。2.2 软件平台1) 操作系统:Win 7;2) 开发平台:Quartus II 9.0 集成开发软件;3) 编程语言:VerilogHDL 硬件描述语言。三、 CPU 逻辑设计总体方案单周期 CPU 设计方案从宏观上把握主要分为器件模块和指令/数据模块这两大模块,器件模块是指令模块的载体,指令数据在器件上流动,指令数据的格式是器件模块的主宰。所以当设计 CPU 时,我们采用模块化设计,单独对着两模块进行设计,考虑到指令数据模块的格式决定指令器件模块接口的数据容量大小,所以应先完成指令数据
6、模块的格式设计。图 1 CPU 宏观设计方案23.1 指令模块3.1.1 指令格式简要设计本 CPU 实验是针对 16 位指令数据设计的,所以应当合理划分指令数据区间段的指令相应的功能。从下图 2 可以看出,16 位指令数据划分为 5 个区间段,指令的15-12位作为控制位传入控制器产生控制信号,指令11-9位作为地址1 从寄存器取数输出数据到寄存器 1 号输出口,指令8-6位作为地址 2 从寄存器取数输出数据到寄存器 2 号输出口,指令5-3位与指令8-6位作为数据选择器选择地址输入寄存器写地址口,指令5-0位作为扩展单元输入,扩展数据成 16 位。另外指令11-0位作为扩展输入,扩展成 1
7、6 位数据作为 PC 计数器的选择器一端。图 2 指令格式简要设计图3.2 器件单元模块此模块的设计是 CPU 设计的核心部分,它主要涉及到 CPU 中多个器件的设计。我们依然采用模块设计方案,把总体设计拆分成多个相互独立的器件,再对每部分器件单独设计。在此模块中包括:寄存器组、控制器、存储器、PC 计数器、数据选择器、ALU 单元这六大主要单元。如下图 2 所示,展示出六大单元的设计方案以及六大单元之间的联系。3图 3 器件模块设计方案图从上图我们可以看出各单元之间的联系:初始数据从数据存储器 RAM 中取出,通过两种数据传入方式:一种是不经过数据选择器,另一种是经过数据选择器,数据传入到寄
8、存器组中作为寄存器数据。而后当传入的是地址 数据时,就从寄存器取出,经过 ALU 运算单元,将数据传入寄存器组中保存或传入数据存储器中保存。在整个过程中,PC 计数器自动加 1 作为地址去指令存储器 ROM中取指令作为此轮执行的指令数据,而控制器在整个过程中依据指令数据的指令码产生相应的控制信号(操作码)控制器件的运作,从而完成整个 CPU 的执行功能。下面我们将对主要的单元进行简要概述。3.1.1 寄存器组寄存器组是作为保存数据的器件,故应使用时钟触发的 D 触发器(DFFE) ,等待一个时钟到来将数据传出去。本实验设计为 16 位 CPU,故每个寄存器应为16 位,即每个寄存器是由 16
9、个 D 触发器扩展而成。考虑到指令从寄存器取数位数为 3 位,所以可以设置 8 个寄存器用于保存数据,如果是写地址的 3 位指令通过 74138(3-8 译码器)译码作为寄存器的有效 EN 使能端输出数据;如果是读地址的 3 位指令数据通过 8 位扩展数据选择器(LPM-MUX)选择数据输出。3.1.2 控制器控制器是作为 CPU 控制信号产生的器件,通过产生控制信号,使其他器件有效或无效,因此控制器的设计显得尤为重要。控制器的设计主要如下:先必须自己设计好各功能指令的 4 位 01 码(指令的15-12) ,然后针对某个控制信号,找出使其为 1 的功能指令,对每个功能指令的 0 位上取非,然
10、后 4 位相与,之后将所有为 1 的功能指令相或,结果作为此控制信号。对每个控制信号执行4重复操作,控制器也就是这些信号的组合。3.1.3 存储器存储器分为两种类型:一种是数据存储器 RAM,另一种是地址存储器 ROM。考虑到设计的方便,否则使用寄存器设计存储器也是可行的。3.1.3.1 数据储存器数据存储器为 RAM 型,表示可读可写,所以数据储存器有 4 个端口,当写信号有效时,应给出写的地址及数据,再加上时钟信号,这里的数据存储器采用软件封装好的 RAM-1-PORT 存储器。3.1.3.2 指令存储器指令存储器为 ROM 型,表示只读,所以地址存储器有 2 个端口,应给出读的地址信号以
11、及时钟信号这里的数据存储器采用软件封装好的 ROM-1-PORT 存储器。3.1.4 PC 计数器PC 计数器主要作为执行一条指令后,地址自动加 1 到指令存储器中取 16 位指令作为此轮操作。故 PC 计数器应能等待一个时钟后将加 1 后的数据送至指令存取器中,所以它应包括 ALU 累加器(一端为 1)和寄存器(当一个时钟信号到来,将数据输出) ,书中还包括一个数据选择器,用于设置 PC 的值,以至于不会无限增长,实现 J 指令。3.1.5 数据选择器数据选择器主要是解决数据来源问题,通过控制信号使数据选择器选择的数据端口不同,此数据选择器可选用软件封装的 2 选 1 选择器。3.1.6 A
12、LU 单元ALU 单元主要用于将输入端的两个数做加减操作,通过控制信号 01 的变化产生运算,该 ALU 可以使用软件封装的加减 ALU(LPM-ADD-SUB) ,当控制信号为 1 时作加法,为 0 时作减法。3.1.7 符号扩展单元符号扩展单元主要用于将不够 16 位的指令数据扩展成 16 位,作为输入数据的一端参与数据选择器运算,这里我们仅考虑最简单的扩展方式:将不足 16位的指令数据由高位向低位依次补 0 直至数据长度为 16 位。四、 模块详细设计4.1 指令设计模块4.1.1 指令处理流程一般来说,CPU 在处理指令时需要经过以下几个过程:(1)取指令(IF):根据程序计数器 PC
13、 中的指令地址,从指令存储器中取出一条指令,同时 PC 根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入 PC,当然得到的“地址”需要做些变换才送入 PC。 (2)指令译码(ID):对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,由指令的15-12位产生相应的操作控制信号,用于驱动执行状态中的各种操作。 (3)指令执行(EXE):根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。 5(4)存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写
14、入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。(5)结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。图 4 单周期 CPU 指令处理过程4.1.2 指令格式详细设计本次 CPU 设计主要有 5 条功能指令,分别为 ADD、SUB、LW、SW、J 指令,对这 5 个功能指令的控制码分别设定为 0101/0110/1001/0001/1010,现对 5 条指令各自的指令格式进行设计:(1) ADD 指令0101(4 位) rs(3 位) rt(3 位) rd(3 位) reserved此 ADD 加法指令完成的功能是:将 rs3 位对
15、应的寄存器的数和 rt3 位对应的寄存器的数相加,结果数据存放至 rd3 位对应的寄存器的位置,reserved 作为保留位。(2) SUB 指令0110(4 位) rs(3 位) rt(3 位) rd(3 位) reserved此 SUB 减法指令完成的功能是:将 rs3 位对应的寄存器的数和 rt3 位对应的寄存器的数相减,结果数据存放至 rd3 位对应的寄存器的位置,reserved 作为保留位。(3) LW 指令1001(4 位) base(3 位) rt(3 位) offset(6 位)此 LW 指令完成的功能是:将 base3 位对应的寄存器的数和 offset6 位扩展成 16
16、位数据相加,结果作为数据存储器地址,取出地址对应的数据存放到 rt3位对应的寄存器中。(4) SW 指令0001(4 位) base(3 位) rt(3 位) offset(6 位)此 SW 指令完成的功能是:将 base3 位对应的寄存器的数和 offset6 位扩展成 16 位数据相加,结果作为数据存储器地址 A,将 rt3 位对应的寄存器的数据取出来,存放到 A 地址对应的存储器单元中。(5)J 指令1010(4 位) target(12 位)此 J 指令完成的功能是:将 12 位地址零扩展成 16 位,作目标跳转地址。4.2 器件单元模块此模块的设计是 CPU 设计的核心部分,它是将众
17、多模块整合在一起,在此模块中主要包括:寄存器组、控制器、存储器、PC 计数器、数据选择器、ALU单元这六大单元。如下图 5 所示,展示出模块间整合的总体效果,可以看出,每个模块的功能还是显而易见的,各模块间通过命名一致达到数据双向传输效6果。图 5 CPU 综合模块示意图4.2.1 寄存器组由上面总体设计方案中指出,每个寄存器应该由 16 个 D 触发器构成,为了避免设计复杂,我们采用迭代的设计方法,即先由单个 D 触发器设计成包含 2个 D 触发器模块,图 6 示出了由单个 D 触发器构成 2 个 D 触发器模块。为了避免篇幅颇多,这仅展示由 8 个 D 触发器构成最终 16 个 D 触发器
18、的示意图,如图7,以及最终 16 位 D 触发器综合模块效果,如图 8。图 6 单个 D 触发器构成 2 个触发器7图 7 8 个 D 触发器构成 16 个 D 触发器 图 8 16 位 D 触发器综合模块寄存器组作为数据保存的器件,当读取寄存器中的数据时,涉及读地址端口以及对应的输出数据端口,故应该有两个读地址端口,两个写地址端口;当写入寄存器数据时,涉及写的信号、写的地址以及写的数据也应该准备好,故应有一个写地址端口,一个数据准备端口以及一个写信号,同时数据的传送需要在一个时钟信号到来的上升沿操作,故应有一个时钟信号 CLK,所以总共端口共有 8 个。在图 9 中展示出寄存器组的综合模块。
19、图 9 寄存器组综合模块下面我们来看寄存器组综合模块的详细设计,如图 10 所示。主要有 3 处值得注意: 因为我们设计的从寄存器取数的指令位数为 3 位,所以最多可寻 8 个寄存器,所以可看到图中示出了 8 个 16 位 D 触发器的综合模块。 图中还有一个 74138 译码器,G1 端为 WE 写信号,当要向寄存器存数时,应使写信号有效,同时给出 3 位需要写的地址,将要写入的数据存至译码生成对应的寄存器中。 同时图中还有 2 个 8 位数据选择器,主要是用于当读取寄存器数据时,给出读取寄存器的地址,对应 8 位数据选择器输出对应寄存器中的数据。图 10 寄存器组详细设计4.2.2 控制器
20、控制器的设计是整个 CPU 的命脉,因为控制器产生的控制信号用于整个 CPU8运作,针对某条功能指令,控制信号要能准确控制器件的运作。因此必须明确各个控制信号的作用,如下表 1 所示以及控制信号和功能指令之间的关系,如下表 2 所示:表 1 控制信号的作用信号名 无效时作用(0) 有效时作用(1)RegDst 写寄存器在寄存器堆的地址来自于 rt 字段写寄存器在寄存器堆的地址来自于 rd 字段ALUSrcB 寄存器堆 Data2 输出 符号扩展的立即数ALUOp 减法 加法RegWrite 无 在时钟上升沿,写寄存器MemtoReg 送往寄存器组写数据输入的值来自 ALU送往寄存器组写数据输入
21、的值来自存储器MemWr 无 在时钟上升沿,写存储器PCSource PC+1 扩展的立即数表 2 控制信号和功能指令对应表控制信号 ADD SUB LW SW J功能操作码 0101 0110 1001 0001 1010RegDst 1 1 0 0 0ALUSrcB 0 0 1 1 0ALUOp 1 0 1 1 0RegWrite 1 1 1 0 0MemtoReg 0 0 1 0 0MemWr 0 0 0 1 0PCSource 0 0 0 0 1由上表所示,我们可以容易得到每个控制信号的逻辑表达式,方法如下:找出某个信号在所有功能指令中为 1 的量,对相应功能操作码为 0 的位置改为非
22、,再将 4 位相与,对不同的功能指令之间相或。假设功能操作码的 4 位从左向右依次对应 S3、S2、S1、S0,则可以得出所以控制信号表达式:RegDst=S3S2S1S0+S3S2S1S0;ALUSrcB=S3S2S1S0+S3S2S1S0;ALUOp=S3S2S1S0+ S3S2S1S0+S3S2S1S0;RegWrite=S3S2S1S0+S3S2S1S0+ S3S2S1S0;MemtoReg= S3S2S1S0;MemWr=S3S2S1S0;PCSource=S3S2S1S0;对应的逻辑电路图即是与非门的组合,如图 11,示出了 ALUOp 的电路图实现,输入指令15-12的 4 位,
23、通过功能指令内的相与和功能指令间的相或得出最后控制信号 ALUOp 的值,对于其他信号的电路实现这里就不举例了。9图 11 ALUOp 控制信号的电路实现按照上述示例对所有控制信号的电路都能实现,则需要将所有控制信号模块整合在一起,因此可以得出如图 12 的控制器详细设计:输入的是指令15-12的控制码,输出 7 个控制信号,从图 13 可以看到控制器的综合模块接口。图 12 控制器的信号组合10图 13 控制器综合模块4.2.3 存储器为了省去不必要的设计,存储器模块我们采用的是软件封装好的 Memory。本次设计将存储器分为数据存储器和指令存储器:数据存储器使用 RAM-1-PORT,可读
24、可写,主要用于存放数据,用于寄存器取数和存数;指令存储器使用 ROM-1-PORT,只读,用于存放 16 位指令数据。4.2.3.1 数据存储器从图 14 可以看出,数据存储器 RAM 有 4 个输入端和 1 个输出端,能够实现将数据写入存储器操作,应该要有准备写入的数据,要写入的地址以及内存写操作控制信号,同时应有时钟信号控制,对应的输出端即从内存取出的数据。图 14 数据存储器 RAM4.2.3.2 指令存储器从图 15 可以看出,指令存储器 ROM 有 2 个输入端和 1 个输出端,能够实现将指令数据从指令存储器中取出,输入端应有准备要取出指令的地址以及时钟信号,输出端即从指令存储器中取
25、出的 16 位指令。11图 15 指令存储器 ROM4.2.4 PC 计数器程序计数器是用于当每个时钟的上升沿到来后,PC 计数器就自增 1 从指令存储器中取出对应增 1 的地址的指令数据,作为本轮运算的指令。所以 PC 计数器模块应该由图 16 所示的三部分组成:自增 1 的 ALU 单元、PC 跳转数据选择器(主要用于实现 J 指令)以及暂存增 1 的指令数据的 16 位寄存器。从图中可以看出,PC 计数器只要在时钟信号上升沿到来时就将增 1 的地址送入指令存储器中,因为在暂存增 1 地址的寄存器输出端的 16 位地址,不经任何信号控制就送入 ALU 的一端,与 1 相加,在本次时钟上升沿
26、就能将结果送入暂存寄存器中,等待下次时钟信号的到来,输出去的是已经增 1 的地址了,或是由 J 指令直接指定的目标地址。图 16 PC 计数器综合模块4.2.5 数据选择器数据选择器主要用于根据控制信号,来选择对应的数据端输入,在本次设计中用到 4 处数据选择器,其内部实现都是采用软件封装的 2 选 1 数据选择器,在图 19 中展示出 PC 数据选择器具体实现方法,其他数据选择武器实现类似。下面介绍 4 处数据选择器,分别是: 根据 MemtoReg 信号判断写入寄存器的数据是来自于 ALU 或是存储器,如图17 所示;12图 17 写入寄存器数据选择器 根据 PCSource 控制信号,判
27、断 PC 计数器的下一条地址是来自于 PC+1 还是来自于 J 指令指出的目标地址,主要用于 J 指令的跳转,如图 18 是 PC 数据选择器的综合模块,图 19 是其具体实现方案,主要采用 2 选 1 数据选择器。图 18 PC 数据选择器图 19 PC 数据选择器内部实现 根据 RegDst 信号确定写入寄存器的地址是来自于指令数据的5-3位还是8-6位,如图 20 所示。图 20 写入寄存器地址数据选择器 根据 ALUSrcB 控制信号确定 ALU 单元的输入 B 端的数据来源,主要用于 LW指令中,判断存储器地址是由寄存器的 1 端和 2 端相加得到还是由寄存器13的 1 端和指令后
28、6 位扩展成 16 位相加得到,如图 21 所示。图 21 ALU 的 B 端数据选择器4.2.6 ALU 单元ALU 单元主要用于将两端输入数据进行加或减操作,从图 22 可以看到,ALU综合模块,有 3 个输入端,分别是输入数据 A、B 端和控制信号,对应输出端是AB 端加或减的结果。从图 23 我们了解 ALU 模块的内部实现,ALU 的实现主要是应用软件的 ALU_ADD_SUB,器件做加或减的操作来自于 ALUOp 的控制,当 ALUOp位 1 时,做加法;当为 0 时,做减法。图 22 ALU 综合模块图 23 ALU 模块内部实现4.2.7 扩展单元扩展单元主要用于填补数据的不足
29、,此次设计的扩展单元为最简单的扩展,即对于输入不足的数据,在其高位上依次补 0 直至凑够 16 位数。设计中主要用到两处扩展: 当执行 LW 指令时,基址中的数据和指令后 6 位数据扩展成 16 位数据相加,结果作为存储器的地址,从存储器取数,如图 24 所示。14图 24 指令后 6 位扩展 16 位 当执行 J 指令时,由 J 指令的后 12 位扩展成 16 位作为目标跳转地址,如图 25 所示。图 25 指令后 12 位扩展 16 位作为跳转目标地址4.2.8 FPGA 实验板数码管显示此模块主要解决结果输出显示在 FPGA 实验板上的问题。设计的 CPU 位 16位,但是 FPGA 实
30、验板的数码管每个数字有 8 位,有 4 个数码管,所以应该让结果的 4 位对应数码管的 8 位显示,故需要使用 Verilog 语言按照引脚对应编写,如下是 4 位结果对应数码管 8 位显示。图 26 是对应策略的模块,可以看到,使用了 4 个此模块,分别将结果数据的3-0、7-4、11-8、15-12对应显示管的7-0、15-8、23-16、31-24。module changer(IN,OUT);input 3:0IN;output 7:0OUT;reg7:0 OUT;alwaysbegincase(IN)b0000 : OUT = b11000000;b0001 : OUT = b111
31、11001;b0010 : OUT = b10100100;b0011 : OUT = b10110000;b0100 : OUT = b10011001;b0101 : OUT = b10010010;b0110 : OUT = b10000010;b0111 : OUT = b11111000;b1000 : OUT = b10000000;b1001 : OUT = b10010000;15b1010 : OUT = b10001000;b1011 : OUT = b10000011;b1100 : OUT = b11000110;b1101 : OUT = b10100001;b111
32、0 : OUT = b10000110;b1111 : OUT = b10001110;endcaseendendmodule图 26 显示对应模块显示还有一步骤是将上述总模块编译成功后,会有 32 个输出端口,按照引脚对应接在如图 27 的引脚图上。图 27 实验板引脚图16另外还有一个显示问题是:时钟信号太快,人肉眼来不及观察,所以应将时钟延长,所以采用如图 28 所示的时钟计数器,输入的时钟信号经过时钟计数器产生 24 个时钟信号,器件使用最高位时钟信号,即 C23,这样相当于延长了时钟信号,便于人眼观察数码管的显示。图 28 时钟计数器五、 实验数据实验数据包括两大部分:数据存储器中存
33、储初始数据、指令存储器中存储指令数据,现分别对两部分数据展示。5.1 数据存储器初始数据数据存储器中存放初始数据如表 3,在数据存储器中以二进制存在,这里表述使用 16 进制,表示的意思是:在数据存储器中,地址 0H,1H,2H,3H 存放的初始数据是 0002H,0001H,0003H,0004H。表 3 数据存储器数据表Address +00 +01 +10 +1100 0000000000000010 0000000000000001 0000000000000011 00000000000001005.2 指令存储器指令数据指令存储器中存放指令数据如表 4,在指令存储器中以二进制存在。
34、它表达的意思需要结合功能指令的格式进行分析。具体分析如下:表 4 指令存储器数据表Address +000 +001 +010 +011 +100 +10100 100100000100000010010000100000010101000001000000101000000000010001100000100000001010000000000010前两条指令的前 4 位功能操作码为 1001,是 LW 指令。根据 LW 指令的格式,第一条指令将寄存器 000 中的数据和 000000 扩展成 16 位 0000H 相加结果为0000H(初始寄存器 000 数据为 0000H)作为数据存储器
35、的地址(实验中取结果的4-0位作为地址)0H 号地址取出原始数据 0002H,存放至寄存器 001 号中;第二条指令将寄存器 000 中的数据和 000001 扩展成 16 位 0001H 相加结果为0001H(初始寄存器 000 数据为 0000H)作为数据存储器的地址 1H 号地址取出原始数据 0001H,存放至寄存器 010 号中;第三条指令的前 4 位功能操作码为 0101,是 ADD 指令。根据 ADD 指令的格式,将寄存器 000 号中的数据(初始还是 0000H)和寄存器 001 号中的数据0002H(存储器取出放至寄存器 001 中的)相加结果送入寄存器 000 号中。第四条指
36、令的前 4 位功能操作码为 1010,是 J 指令。根据 J 指令的格式,将指令后 12 位11-0数据 004H 零扩展成 16 位 0004H,即跳转至地址为0004H(此处即为下一条指令,这里设置 J 指令主要是为了解决加减显示的时间17不一致性) 。第五条指令的前 4 位功能操作码为 0110,是 SUB 指令。根据 SUB 指令的格式,将寄存器 000 号中的数据(此时是 0002H)和寄存器 010 号中的数据0001H(存储器取出放至寄存器 010 中的)相减结果送入寄存器 000 号中。第六条指令的前 4 位功能操作码为 1010,是 J 指令。根据 J 指令的格式,将指令后
37、12 位11-0数据 002H 零扩展成 16 位 0002H,即跳转至地址为0002H(此处即为 ADD 指令) 。而数码管显示的结果是寄存器 000 号中的数据,所以在实验板上能够实现加 2 减 1 的循环运算,若想更改数据,可以修改数据存储器中的初始数据。实现加 n 减 m 的运算,同样修改指令存储器中的指令数据位置,也可以实现减 n加 m 运算。六、 结论和体会通过此次 10 周的 CPU 设计实验,让我们对 CPU 内部组成以及指令在 CPU 部件上如何运作有了一个更深的理解。在实验过程中,我们遇到了各种问题,一开始老师布置下来的 CPU 任务的时候,完全是懵的,因为 CPU 器件和
38、指令运算只在课本上学习,从来没有真正实践过,现在需要自己设计 CPU 的各个部件,而且要将指令在器件上运行,那时简直崩溃。但在接下来的日子,我们没有因为不会而放弃,而是努力专心去设计好每个部件,对每个部件的功能进行模拟仿真,确保这一部件模块不出错,在设计过程中,感觉我们头脑慢慢开窍,也明白了下一步需要设计的东西,或许这是潜移默化的效果吧。确保每个 CPU 部件功能都是正确的后,然后需要将所有部件模块整合在一起,很不幸,编译没有通过,于是我们在努力盘查细节问题,最终编译成功。但还有另外一大问题,就是将软件设计的模型放在 FPGA 实验板上运行,而问题需要将结果数据显示在数码管上,需要编写显示对应
39、的 Verilog 语言,以及需要将结果和 pin 脚相连等操作。皇天不负有心人,终于完成了 CPU 的设计,这过程虽然很苦,但结果却是令人兴奋的,经过这番“彻骨寒” ,让我们迎来了“梅花香” ,让我们对CPU 有了更深的理解,而不只是纸上谈兵。最后,在这里感谢老师这十来周的辛勤付出,感谢学院开设这门有意义、有难度的课程,以及感谢所有帮过我们解决问题的同学!七、 参考文献1 钱江波. 短学期指导. 宁波大学实验手册,2016/09/102 白中英,戴志涛. 计算机组成原理. 科学出版社,2013/033 kingduan. 简单 CPU 设计实践. 博客园. http:/ 姜咏江. CPU 设计我要让更多人掌握它. 博客. http:/