CPU设计实验报告
CPU设计实验报告
实验中央处理器的设计与实现一、实验目的1、理解中央处理器的原理图设计方法。
2、能够设计实现典型MIPS的11条指令。
二、实验要求1、使用Logisim完成数据通路、控制器的设计与实现。
2、完成整个处理器的集成与验证。
3、撰写实验报告,并提交电路源文件。
三、实验环境VMware Workstations Pro + Windows XP + Logisim-win-2.7.1四、操作方法与实验步骤1、数据通路的设计与实现数据通路主要由NPC、指令存储器、32位寄存器文件、立即数扩展部件、ALU、数据存储器构成。
其中指令存储器和数据存储器可直接调用软件库中的ROM和RAM元件直接完成,其余部件的设计如图所示:图1.1 NPC图1.2 32位寄存器图1.3 立即数扩展部件图1.4 ALU2、控制器的设计与实现控制器的主要设计思想如图所示图2.1 控制器设计思想输入000000 001101 100011 101011 000100 000010输出R-type ORI LW SW BEQ JUMP RegDst 1 0 0 x x x ALUSrc 0 1 1 1 0 x MemtoReg0 0 1 x x x RegWrite 1 1 1 0 0 0 MemWrite0 0 0 1 0 0 Branch 0 0 0 0 1 0 Jump 0 0 0 0 0 1 Extop x 0 1 1 1 x ALUop2 1 0 0 0 0 x ALUop1 x 1 0 0 x x ALUop0 x 0 0 0 1 x ALUop[2:0] Funct[3:0] 指令ALUctr[2:0] 111 0000 add 010111 0010 sub 110111 0100 and 000111 0101 or 001111 1010 slt 111010 xxxx ori 001000 xxxx Lw/sw 010011 xxxx beq 110表2.1 控制器设计真值表图2.2 控制器3、处理器的集成与验证集成:将各个部件按要求链接,具体方式如图所示:图3.1 CPU验证:将指令的16进制表示输入指令存储器,运行后记录寄存器中的数据与标准值进行对照:图3.2 寄存器对照值图3.3 寄存器实际运行值由上两图对照可得CPU的功能实现成功。
CPU程序设计实验报告
【指令系统汇总】
指令名称助记符功能指令格式
【检测程序】
【实验心得】
我从这次的试验中收获良多,动手能力得到了大大的提升,以前总是光说不练,而这次从设计到烧芯片,再到调试,纠错都要由自己来完成,其中遇到许多了问题,解决它们使我受益颇多。
首先写再填代码表的时候,由于表格过密,一不小心就有填串的危险,即使我很注意这点,但还是犯了这个错误,填完后我又查了2遍才将错误全部改正,只是对耐心巨大的考验,我从中学到了踏实做事不要心急。
在调试的时候,我遇到了几个比较棘手的问题,当时死活解决不了,静下心后,我发现我填的表本身就是错的,然后我从新翻书改正了它,所当一条路走不通的时候,静下心来从另外一个角度尝试是一个很好的选择。
单周期CPU设计实验报告
单周期CPU设计实验报告一、引言计算机是现代信息社会必不可少的工具,而CPU作为计算机的核心部件,承担着执行指令、进行运算和控制系统资源的任务。
随着科技的进步和计算能力的需求,CPU的设计也趋于复杂和高效。
本次实验旨在设计一种单周期CPU,探究其设计原理和实现过程,并通过实验验证其正确性和性能。
二、理论基础1.单周期CPU概述单周期CPU即每个时钟周期内只完成一条指令的处理,它包括指令取址阶段(IF)、指令译码阶段(ID)、执行阶段(EX)、访存阶段(MEM)和写回阶段(WB)等多个阶段。
每条指令都顺序地在这些阶段中执行,而不同的指令所需的时钟周期可能不同。
2.控制信号单周期CPU需要根据不同的指令类型产生不同的控制信号来控制各个阶段的工作。
常见的控制信号包括时钟信号(clk)、使能信号(En)、写使能信号(WE)和数据选择信号(MUX)等。
这些信号的产生需要通过译码器、控制逻辑电路和时序逻辑电路等来实现。
三、实验设计本次实验采用的单周期CPU包括以下五个阶段:指令取址阶段、指令译码阶段、执行阶段、访存阶段和写回阶段。
每个阶段的具体操作如下:1.指令取址阶段(IF)在IF阶段,通过计数器实现程序计数器(PC)的自增功能,并从存储器中读取指令存储地址所对应的指令码。
同时,设置PC使能信号,使其可以更新到下一个地址。
2.指令译码阶段(ID)在ID阶段,对从存储器中读取的指令码进行解码,确定指令的操作类型和操作数。
同时,根据操作类型产生相应的控制信号,如使能信号、写使能信号和数据选择信号等。
3.执行阶段(EX)在EX阶段,根据ID阶段产生的控制信号和操作数,进行相应的算术逻辑运算。
这里可以包括加法器、乘法器、逻辑运算器等。
4.访存阶段(MEM)在MEM阶段,根据EX阶段的结果,进行数据存储器的读写操作。
同时,将读取的数据传递给下一个阶段。
5.写回阶段(WB)在WB阶段,根据MEM阶段的结果,将数据传递给寄存器文件,并将其写入指定的寄存器。
cpu的实验报告
cpu的实验报告CPU的实验报告引言:计算机是现代社会不可或缺的工具,而CPU(Central Processing Unit)则是计算机的核心部件之一。
CPU负责执行计算机指令,处理数据和控制计算机的各种操作。
本文将对CPU进行实验,并对实验结果进行分析和总结,以便更好地理解和掌握CPU的工作原理。
一、实验目的本次实验的目的是通过对CPU的实验,深入了解CPU的结构和工作原理,掌握CPU的运行过程和性能评估方法。
二、实验过程1. CPU的结构CPU主要由控制单元和算术逻辑单元组成。
控制单元负责解析和执行指令,算术逻辑单元负责进行算术和逻辑运算。
实验中,我们对CPU的各个部件进行了详细的分析和研究。
2. CPU的指令执行过程CPU的指令执行过程包括取指、译码、执行和写回四个阶段。
在实验中,我们通过模拟CPU的指令执行过程,对每个阶段进行了详细的观察和记录,并分析了每个阶段的作用和影响因素。
3. CPU的性能评估为了评估CPU的性能,我们进行了一系列的实验。
通过改变CPU的主频、缓存大小和指令集等因素,观察CPU的运行速度和效率,并进行性能比较和分析。
实验结果表明,这些因素对CPU的性能有着重要的影响。
三、实验结果与分析1. CPU的结构分析通过对CPU的结构进行分析,我们发现控制单元和算术逻辑单元之间的协作非常重要。
控制单元负责解析和执行指令,而算术逻辑单元负责进行计算和逻辑运算。
两者之间的紧密配合使得CPU能够高效地运行。
2. 指令执行过程分析通过对CPU的指令执行过程进行分析,我们发现每个阶段都有其特定的作用。
取指阶段负责从内存中读取指令,译码阶段负责解析指令,执行阶段负责执行指令,写回阶段负责将结果写回内存。
每个阶段的效率和性能都对CPU的整体运行速度有着重要的影响。
3. 性能评估结果通过对CPU的性能评估实验,我们发现主频、缓存大小和指令集等因素对CPU 的性能有着重要的影响。
提高主频可以加快CPU的运行速度,增加缓存大小可以提高数据读取和存储的效率,而优化指令集可以提高CPU的指令执行效率。
十六位CPU实验设计报告
简单16位CPU设计一、实验内容完成从指令系统到CPU的设计,编写测试程序,通过运行测试程序对CPU 设计进行正确性评定。
具体内容包括:典型指令系统(包括运算类、转移类、访存类)设计;CPU结构设计;CPU的VHDL程序代码编写;规则文件与调试程序设计;CPU调试及测试程序运行。
二、实验目的及要求1.加深对计算机的基本概念、基本原理和基本结构的理解;2.掌握计算机组成与系统结构方面的基本设计、分析与实现方法;3.掌握典型16CPU设计方法;4.熟练掌握VHDL语言及应用,完成对CPU各功能模块的代码描述,实现各个功能模块部分的连接,从而形成一个完整的CPU体系结构;5.学会利用先进的硬件设计工具软件Quartus II对程序进行仿真和调试;6.掌握基于“TEC-CA试验教学系统”进行CPU调试的方法。
三、实验仪器设备(1)TEC-CA试验教学系统;(2)虚拟仪器平台;(3)计算机。
(4)实验环境四、实验方案设计(一)指令系统设计1、指令系统的作用和地位指令系统是从程序设计者看到的机器的主要属性,是软、硬件的主要界面。
指令系统是计算机系统结构的主要组成部分。
指令系统是软件与硬件分界面的一个主要标志。
指令系统是软件与硬件之间互相沟通的桥梁。
2、指令系统的设计规范设计的原则:支持编译系统能高效、简易地将源程序翻译成目标代码。
正交性:指令字段编码相互独立。
规整性:相似操作有相同的规定。
可扩充性:操作码冗余。
对称性:A-B=》A ;A-B=》B ,便于编译。
3、CPU 中操作数的存储方法CPU 中操作数的存储方法是各种指令集结构之间最主要的区别所在,其影响运算器的组织。
CPU 中用来存储操作数的存储单元主要有: (1)堆栈; (2)累加器; (3)一组寄存器;通用寄存器型指令集结构的主要优点: (1)使编译器有效地使用寄存器;(2)在表达式求值方面,比其它类型指令集结构,具有更大的灵活性; (3)寄存器可以用来存放变量;a.减少存储器的访问量,加快程序的执行速度。
MIPS单周期CPU实验报告
MIPS单周期CPU实验报告一、实验目的本实验旨在设计一个基于MIPS指令集架构的单周期CPU,具体包括CPU的指令集设计、流水线的划分与控制信号设计等。
通过本实验,可以深入理解计算机组成原理中的CPU设计原理,加深对计算机体系结构的理解。
二、实验原理MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集(RISC)架构的处理器设计,大大简化了指令系统的复杂性,有利于提高执行效率。
MIPS指令集由R、I、J三种格式的指令组成,主要包括算术逻辑运算指令、存储器访问指令、分支跳转指令等。
在单周期CPU设计中,每个指令的执行时间相同,每个时钟周期只执行一个指令。
单周期CPU的主要部件包括指令内存(IM)、数据存储器(DM)、寄存器文件(RF)、运算单元(ALU)、控制器等。
指令执行过程主要分为取指、译码、执行、访存、写回等阶段。
三、实验步骤1.设计CPU指令集:根据MIPS指令集的格式和功能,设计符合需求的指令集,包括算术逻辑运算指令、存储器访问指令、分支跳转指令等。
2.划分CPU流水线:将CPU的执行过程划分为取指、译码、执行、访存、写回等阶段,确定每个阶段的功能和控制信号。
3.设计控制器:根据CPU的流水线划分和指令集设计,设计控制器实现各个阶段的控制信号生成和时序控制。
4.集成测试:进行集成测试,验证CPU的指令执行功能和正确性,调试并优化设计。
5.性能评估:通过性能评估指标,如CPI(平均时钟周期数)、吞吐量等,评估CPU的性能优劣,进一步优化设计。
四、实验结果在实验中,成功设计了一个基于MIPS指令集架构的单周期CPU。
通过集成测试,验证了CPU的指令执行功能和正确性,实现了取指、译码、执行、访存、写回等阶段的正常工作。
同时,通过性能评估指标的测量,得到了CPU的性能参数,如CPI、吞吐量等。
通过性能评估,发现了CPU的性能瓶颈,并进行了相应的优化,提高了CPU的性能表现。
cpu设计实验报告
cpu设计实验报告CPU设计实验报告1. 引言计算机是现代社会不可或缺的工具,而中央处理器(CPU)则是计算机的核心组件之一。
本实验旨在设计和实现一个简单的CPU,以加深对计算机组成原理的理解,并通过实践掌握CPU的基本工作原理。
2. CPU设计概述我们的CPU设计基于冯·诺依曼结构,包括指令寄存器(IR)、程序计数器(PC)、算术逻辑单元(ALU)和寄存器文件等关键组件。
CPU的指令集采用RISC(精简指令集计算机)风格,指令长度为32位。
3. 指令集设计我们设计了一套简单的指令集,包括算术运算指令(加法、减法、乘法、除法)、逻辑运算指令(与、或、非)以及数据传输指令(加载、存储)。
指令的格式包括操作码、源操作数和目标操作数。
4. 寄存器文件设计寄存器文件是CPU中用于存储数据的重要组件。
我们设计了一个包含8个通用寄存器的寄存器文件,每个寄存器的宽度为32位。
通过寄存器文件,CPU能够高效地进行数据的读取和存储。
5. 控制单元设计控制单元是CPU中的重要模块,负责解析指令并控制各个组件的操作。
我们设计了一个简单的控制单元,使用有限状态机(FSM)来实现指令的解析和控制信号的生成。
控制单元根据指令的操作码,决定对应的操作,并将操作所需的控制信号发送给其他组件。
6. 数据通路设计数据通路是CPU中各个组件之间的数据传输路径。
我们设计了一个简单的数据通路,包括指令寄存器、程序计数器、寄存器文件、算术逻辑单元等。
数据通路能够将指令中的操作数从寄存器文件中读取出来,并将运算结果写回到寄存器文件。
7. CPU实现与验证我们使用硬件描述语言(HDL)对CPU进行实现,并通过仿真和测试验证其正确性。
通过编写测试程序,我们能够对CPU的各个指令进行测试,并检查其运行结果是否符合预期。
8. 结果与分析经过测试,我们的CPU能够正确执行设计的指令集,并产生正确的运算结果。
通过性能测试,我们还评估了CPU的运行速度和效率,并与其他现有的CPU进行了比较。
CPU实验报告范文
CPU实验报告范文一、实验目的本次实验的目的是设计和实现一个简单的中央处理器(CPU),通过实践掌握CPU的基本工作原理和实现方法。
二、实验原理1.CPU的基本概念中央处理器(CPU)是计算机的核心部件,负责执行计算机指令和控制计算机的操作。
它由运算器、控制器和寄存器组成。
运算器负责执行算术和逻辑运算,包括加法、减法、乘法、除法等。
控制器负责指挥CPU的工作,通过控制总线实现对内存和其他外部设备的访问。
寄存器是CPU内部的存储器,用于暂时存放指令、数据和中间结果。
2.CPU的实现方法CPU的实现采用组合逻辑电路和时序逻辑电路相结合的方法。
组合逻辑电路是由逻辑门构成的电路,它的输入只依赖于当前时刻的输入信号,输出也只与当前时刻的输入信号有关。
而时序逻辑电路则包含存储元件,其输出不仅与当前时刻的输入信号有关,还与之前的输入信号有关。
CPU的实现过程主要包括以下步骤:(1)设计指令集:确定CPU支持的指令集,包括指令的格式和操作码。
(2)设计控制器:根据指令集设计控制器,确定各个指令的执行过程和控制信号。
(3)设计运算器:根据指令集设计运算器,确定支持的算术和逻辑运算。
(4)设计寄存器:确定需要的寄存器数量和位数,设计寄存器的输入输出和工作方式。
3.实验环境和工具本次实验使用的环境和工具如下:(1)硬件环境:计算机、开发板、示波器等。
(2)软件环境:Win10操作系统、Vivado开发工具等。
三、实验步骤1.设计指令集根据实验要求,我们设计了一个简单的指令集,包括加法、减法、逻辑与、逻辑或和移位指令。
每个指令有特定的操作码和操作数。
2.设计控制器根据指令集设计了一个控制器。
控制器根据指令的操作码产生相应的控制信号,控制CPU内部寄存器、运算器和总线的操作。
3.设计运算器根据指令集设计了一个运算器。
运算器包括加法器、减法器、与门和或门等。
它通过输入的操作数和控制信号完成相应的运算操作。
4.设计寄存器根据实验需求确定了所需的寄存器数量和位数。
计算机组成原理CPU设计实验报告
计算机组成原理CPU设计实验报告课程设计题目:16位CPU设计学院: 信息学院班级:电子A班学号:1115102015姓名:方茹1目录1 实验方法 ..................................................................... . (4)2 总体说明 ..................................................................... ................................................. 5 2.1指令系统: .................................................................... .......................... 5 2.1.1指令格式分类(按指令字长和操作数不同): ...................................................... 5 2.1.2具体指令汇总表: .................................................................... .......................... 6 2.1.3相关指令流程图: .................................................................... .......................... 6 2.1.4指令数据通路的构建: .................................................................... ................... 8 2.1.5指令的分组及节拍: .................................................................... ..................... 12 2.1.6指令执行状态图:(见下页)..................................................................... ........... 13 2.1.7具体微指令: .................................................................... ............................... 13 2.2 系统整体介绍 ..................................................................... .................. 16 2.2.1系统基本模块划分 ..................................................................... ....................... 16 2.2.2总体结构图:(见下页)..................................................................... (17)3 CPU的控制逻辑与具体数据通道设计 ..................................................................... ......18 3.1取指令逻辑的设计 ..................................................................... .. (19)3.1.1指令地址的保存 ..................................................................... (19)3.1.2指令存储器 ..................................................................... .................................. 20 3.1.3下一条指令地址的计算 ..................................................................... ................ 20 3.2指令译码逻辑的设计...................................................................... ...................... 21 3.3指令执行逻辑的设计...................................................................... ...................... 22 3.4存储器访问逻辑的设计 ..................................................................... ................... 23 3.5结果写回逻辑的设计...................................................................... ...................... 24 3.6单周期CPU的总成...................................................................... (25)4各部分说明 ..................................................................... .............................................26 4.1ALU .................................................................................................................... 26 4.2数据选择器BUS_MUX ................................................................ ........................ 28 4.3器件T1 ..................................................................... .......................................... 30 4.4标志寄存器FLAG_REG ............................................................... ........................ 31 4.5T2: .................................................................... ................................................ 33 4.6程序计数器PC ..................................................................... ............................... 33 4.7地址寄存器AR和指令寄存器IR: .................................................................... .. 34 4.8寄存器、寄存器组和寄存器的选择.......................................................................36 4.9一位控制信号/WR .................................................................... ........................... 37 4.10 节拍发生器 ..................................................................... .................................. 37 4.11控制逻辑 ..................................................................... ...................................... 39 4.12T3...................................................................... ................................................ 42 4.13REG_OUT ......................................................................................................... 43 4.14存储器 ..................................................................... .......................................... 44 4.15总线选择器 ..................................................................... .. (45)24.16REG_TEST ............................................................... .. (46)5附录: .................................................................... .. (47)附录A:组员分工: .................................................................... .. (47)附录B:组员设计总结: .................................................................... . (47)31 实验方法实验要完成的工作主要包括:指令系统的设计,FPGA-CPU的整体结构设计及其细化,逻辑设计的具体实现(VHDL语言程序的编写),软件模拟,以及硬件调试。
cpu设计报告
Z0
以下是带符号数乘法器的代码,其中前半部分用与非门实现,后半部分经过逻辑综合后得到结果。
modulemul_signed(a,b,z);
input[15:0]a,b;
output[31:0] z;
reg[15:0]a_bi[15:0];
integeri,j;
always@ * begin
for(i=0;i<15;i=i+1)
+p[i]p[i-1]g[i-2]
+……
+p[i]p[i-1]……p[1]c[0]
+ p[i]p[i-1]……p[1]p[0]c[0]
从理论上来讲,由c[i+1]的表达式可以并行产生所有位的进位输入,但是这样的电路太复杂,难以实现。所以采用了树形结构来分层次产生进位。
首先是一位加法器的代码,除了产生一位加法结果s外,还生成进位产生的函数g和进位传递函数p。一位加法器和GP生成器代码如下:
modulecla_2 (a,b,c_in,g_out,p_out,s);
input[1:0]a,b;
inputc_in;
outputg_out,p_out;
output[1:0] s;
wire[1:0]g,p;
wirec_out;
add add0 (a[0],b[0],c_in, g[0],p[0],s[0]);
endmodule
六、指令系统
本CPU部分指令如下(有一些是我自己用来调试的指令,在此就不列举了):
000000
Rs
rt
rd
00000
100000
寄存器加
000000
Rs
Rt
Rd
cpu设计实验报告
cpu设计实验报告CPU设计实验报告摘要:本实验旨在设计一个基本的中央处理器(CPU),并通过实验验证其性能和功能。
在设计过程中,我们使用了Verilog硬件描述语言和ModelSim仿真工具。
通过对CPU的设计和仿真实验,我们验证了CPU的正确性和性能,并对其进行了性能分析和优化。
1. 引言CPU是计算机系统中最核心的部件之一,它负责执行计算机指令和控制数据流动。
因此,设计一个高效、稳定的CPU对于计算机系统的性能至关重要。
本实验旨在通过Verilog硬件描述语言和ModelSim仿真工具,设计一个基本的CPU,并验证其性能和功能。
2. 设计过程我们首先对CPU的功能和性能进行了分析和规划,确定了CPU的基本架构和指令集。
然后,我们使用Verilog语言编写了CPU的硬件描述,并通过ModelSim进行了仿真验证。
在设计过程中,我们重点关注了CPU的时序逻辑、数据通路和控制逻辑,确保CPU能够正确地执行指令并保持稳定的性能。
3. 实验结果通过对CPU的设计和仿真实验,我们验证了CPU的正确性和性能。
我们使用了一系列的测试用例对CPU进行了功能和性能测试,并对其进行了性能分析和优化。
实验结果表明,我们设计的CPU能够正确地执行各种指令,并在性能上达到了预期的目标。
4. 总结和展望本实验通过Verilog硬件描述语言和ModelSim仿真工具,设计并验证了一个基本的CPU。
通过实验,我们对CPU的设计和性能有了更深入的了解,并对其进行了性能分析和优化。
未来,我们将进一步完善CPU的设计,提高其性能和功能,以满足计算机系统的需求。
综上所述,本实验为我们提供了一个宝贵的机会,通过实际设计和验证,深入了解了CPU的工作原理和性能特点,为我们今后的学习和研究打下了坚实的基础。
希望通过不懈的努力,我们能够设计出更加高效、稳定的CPU,为计算机系统的发展做出更大的贡献。
CPU设计实验报告
数字逻辑与处理器基础实验32位mips cpu设计综述:我们的最后验收结果时钟频率是84.9mhz。
本实验报告主要分为实验设计说明与实验收获总结两个部分。
附件中有cpu工程文档与模块代码。
第一部分实验设计一、 alu设计1、设计思路实现基本的算术、逻辑、关系、位与移位运算,尽量优化以达到最小的面积延时积。
结构图如下:主要设计思想:a. 加法运算实现可以采用逐次进位、超前进位等结构,减法可以通过加法实现(参见见面理论课讲义或者前面实验);同时输出z(结果为零)、v(结果溢出)、n (结果为负)等标志位,注意有符号数和无符号数标志产生的不同。
b. 比较运算根据减法运算的结果(z/v/n)产生,自行分析比较操作与算术运算之间的关系。
c. 移位运算可以考虑将移位操作拆分为16 位移位、8 位移位、4 位移位、2 位移位、1位移位等几个子运算的组合,然后级联形成最后的运算结果。
d. 逻辑运算可以根据要求直接产生。
功能表接口说明2、主要模块a) 32bit加法器采用8个4bit超前进位加法器极连的方式,构成32bit加法器。
对于逸出位v的处理如下:由有符号数的性质可知,对最高位32和次高位31位取抑或,输出信号则为是否逸出。
对32位运算结果取反后,再对相邻两位反复取与,最终得到结果是否为零的输出z.如果是有符号数,则符号位=n。
由于这一方法部分程度上减弱了高位计算对低位计算的依赖程度,因此可以实现延时的降低。
同时,由于其超前进位网络的大量逻辑运算,较大程度上提升了电路的面积,造成最终的面积延时积特性恶化。
关键代码见附录1 b) 32bit减法器对加法器按位取反,再加一。
关键代码见附录1 c) 32bit 右移 32bit 左移 32bit 算术右移将移位操作拆分为16 位移位、8 位移位、4 位移位、2 位移位、1位移位等几个子运算的组合,然后级联得到最后的运算结果。
关键代码见附录1 d) 32bit 逻辑比较单元采用行为级语句直实现逻辑比较功能。
计算机组成原理CPU设计实验报告
T0: PCBUSMAR, PCBUSA, 1READ
T1: M(MAR)MDRBUSIR, ALU(A+2)Y
T2: YBUSPC, IRID
数据通路如下:(再配合流程图来说明工作流程,说明每一个部件的功能;以下同)
2.算逻指令执行周期数据通路构建
算逻指令执行周期微操作安排如下:
T0: $RBUSMDR
T1: Ad(IR)扩位BUSMAR, 1WRITE
T2:
4.访寄存器组指令执行周期数据通路构建
访寄存器指令执行周期微操作安排如下:
T0: $R2BUS$R1
T1:
跳转指令执行周期的微操作安排如下:
T0: Im(IR)扩位和移位BUSA
T0: $R2BUSA
T1: $R3BUSB
T2: ALU(A,B)YBUS$R1
数据通路如下:
3访存指令执行周期数据通路构建
LDRR指令执行周期的微操作安排如下:
T0: Ad(IR)扩位BUSMAR, 1READ
T1: M(MAR)MDR
T2: MDRBUS$R
STRR指令执行周期的微操作安排如下:
T1: PCBUSB
T2: ALU(A+B)YBUSPC
2.1.5
由于没有中断操作,本机指令的执行步骤可概括如下:(画图描述)
读取指令:地址寄存器<-指令地址,修改PC内容使其指向下一条将要执行的指令;
读内存,指令寄存器<-读出的内容。
分析指令:指令译码。
执行指令:通用寄存器之间的运算或传送,可1步完成;
T2:GENERATE CFLAG RESULT←ADDR+PC
T3:if(CFLAG==0) PC←RESULT else PC←PC_NEXT
计算机设计与实践 CPU 实验报告(内含详细代码)
CPU实验报告一.设计概况本次试验要完成的工作主要包括:指令系统的设计,CPU的整体结构设计及其细化,逻辑设计的具体实现,软件模拟,硬件调试。
试验的主要流程如下图所示:二.指令设计1.指令格式设计①单操作数指令OPCODE 000 X包括:JMP,JZ,JC②寄存器-寄存器指令OPCODE REG1 00000 REG2 包括:MOV,ADC,SBB,OR,AND③寄存器-立即数(地址)指令OPCODE REG DA TA包括:LDA,STA,MOV, ADC,SBB,OR,AND④其他类型指令OPCODE 00000000000包括:CLC,STC2.指令编码三.CPU逻辑设计1.CPU整体框图2.节拍设计一个周期采用四个节拍。
一个节拍完成取指。
第二个节拍完成运算。
第三个节拍访存。
第四个节拍回写。
3.数据流说明第一个节拍内,取指模块向访存控制发出访存信号,得到指令后,将指令保存在指令寄存器IR中,并将指令送往后面的运算模块,存储管理模块,回写模块。
同时将PC送入运算模块和回写模块。
第二个节拍内,运算管理模块将指令译码。
如果是存数指令,则将地址存入ADDR寄存器,数据存入DATA存储器,等待下一个节拍访存。
如果是取数指令,则将地址存入ADDR寄存器,等待下一个节拍访存。
如果是其他非访存指令,则将计算结果存入ALUOUT寄存器,送往存储管理模块的Rtemp寄存器。
第三个节拍内,存储管理模块将指令译码。
如果是存数指令,则向访存控制模块发出访存信号,则将第二个节拍内存好的ADDR寄存器的内容作为地址,把DATA寄存器里面的数据存入存储器对应的位置。
如果是取数指令,则将第二个节拍内存好的ADDR寄存器的内容作为地址,从存储器对应的位置取出数据,存入Rtemp存储器,并送往回写模块。
如果是其他非访存指令,则将Rtemp寄存器里的内容直接送往回写模块。
第四个节拍内,回写模块先将指令译码。
根据指令将需要回写的数据回写近响应的寄存器,并将PC+1后回写至取指模块的PC寄存器。
CPU处理器实验设计实验报告
“计算机设计与实践”处理器实验设计报告目录一:实验目的 (2)二:实验环境 (2)三:设计思想 (2)1、CPU接口信号定义 (2)2、CPU设计方案 (3)四:实验设计及测试 (15)1、各模块设计及测试 (15)波形仿真 (15)2、整体的设计及测试 (19)波形仿真 (19)五:下载 (21)六:遇到的问题及解决方法 (25)七:实验体会 (25)一:实验目的1.掌握Xilinx ISE集成开发环境使用方法2.掌握VHDL语言3.掌握FPGA编程方法及硬件调试手段4.深刻理解处理器结构和计算机系统的整体工作原理二:实验环境Xilinx ISE集成开发环境,ModelSim或ISim仿真工具、COP2000实验平台或SD2100数字逻辑设计实验平台或Diligent Nexys3开发板。
三:设计思想1、C PU接口信号定义2、 C PU 设计方案① 指令格式设计1.2. 其他指令15 11 10 28 7 031511 10 8 7 0②微操作定义③节拍划分④各模块设计a)时钟模块模块示意图:模块功能:产生4个节拍,其中,当rst=1时,节拍跳转到T3,并将pc置0.接口说明:信号名位数方向来源/去向备注Clk1I处理器板系统时钟Rst1I处理器板高电平复位T4O取址,运算,4个节拍存储,回写模块b)取指模块模块示意图:模块功能:从内存取出指令。
Rst=1时,pc置0.取出的IR传送给运算,存储,回写模块提供数据,当IRreq=1时,开始从内存取出指令。
当pcupdate=1时,pc接收pcnew的数据,更新pc。
信号名位数方向来源/去向备注T01I时钟模块第一节拍T11I时钟模块第二节拍Rst1I处理器板高有效复位信号PCupdate1I回写模块PC更新信号PCnew16I回写模块PC更新值IRnew16I存储控制模块IR更新值IRreq1O取址模块IR允许信号IR16O存储控制模块导出IR到其他模块PC16O取址模块PC到运算模块c)运算模块模块示意图:模块功能:进行各种运算,并产生进位信号cy和零信号z。
cpu实验报告
cpu实验报告CPU实验报告引言计算机是现代社会不可或缺的工具,而中央处理器(CPU)则是计算机的核心。
CPU的性能直接影响着计算机的运行速度和效率。
为了深入了解CPU的工作原理和性能评估方法,我们进行了一系列的CPU实验。
本报告将详细介绍我们的实验过程、结果和分析。
实验一:CPU的组成与工作原理在第一个实验中,我们学习了CPU的基本组成和工作原理。
CPU由控制单元(CU)和算术逻辑单元(ALU)组成。
CU负责指令的解码和执行,而ALU则处理算术和逻辑运算。
我们通过拆解一台计算机,观察和研究了CPU的内部结构和连接方式。
我们还学习了指令集架构(ISA)和微指令的概念。
这个实验使我们对CPU的组成和工作原理有了更深入的理解。
实验二:CPU性能评估在第二个实验中,我们重点关注CPU的性能评估。
我们使用了一款性能评估工具,通过运行一系列的测试程序来测量CPU的性能。
我们评估了CPU的时钟频率、缓存大小和指令级并行性对性能的影响。
实验结果表明,时钟频率越高,CPU的运行速度越快。
增加缓存大小可以提高CPU的数据访问效率。
指令级并行性的优化也可以显著提升CPU的性能。
这个实验让我们了解了如何评估和优化CPU的性能。
实验三:CPU的架构设计在第三个实验中,我们设计了一款简单的CPU架构。
我们选择了精简指令集计算机(RISC)架构,因为RISC架构具有指令集简单、执行效率高的特点。
我们设计了CPU的指令集、寄存器组和数据通路,并使用硬件描述语言进行了模拟和验证。
通过这个实验,我们深入了解了CPU的架构设计原理和方法。
实验四:CPU的能耗优化在第四个实验中,我们研究了CPU的能耗优化方法。
我们使用了一款能耗监测工具,测量了CPU在不同负载下的能耗情况。
我们还尝试了一些能耗优化技术,如动态电压频率调整(DVFS)和低功耗模式。
实验结果显示,通过调整电压和频率,可以显著降低CPU的能耗。
低功耗模式也能有效减少CPU的能耗。
CPU设计实验
广东技术师范学院实验报告学院:专业:班级:成绩:姓名:学号:组别:组员:实验地点:实验日期:指导教师签名:预习情况操作情况考勤情况数据处理情况实验(6.5.1)项目名称:CPU设计实验1.实验目的(1)在掌握各部件单元电路的基础上,设计构造一个完整的CPU。
(2)为其定义五条机器指令,编写相应的微程序,并上机调试,由此掌握整机概念。
2.实验设备(1)TDN-CM+或TDN-CM++教学实验系统一台。
(2)PC微机一台。
3.实验原理在部件实验过程中,各部件单元的控制信号是人为模拟产生的,而本次实验将在微程序控制下自动产生各部件单元控制信号,实现特定指令的功能。
这里,计算机数据通路的控制将由微程序控制器来完成,CPU从内存中取出一条机器指令到指令执行结束的一个指令周期全部由微指令组成的序列来完成,即一条机器指令对应一段微程序。
本实验采用五条机器指令:IN(输入)、ADD(二进制加法)、STA(存数)、OUT(输出)、JMP(无条件转移),其指令格式如下(前4位为操作码):助记符机器指令码说明IN 0000 0000 “INPUT DEVICE”中的开关状态R0ADD addr 0001 0000 ×××××××× R0+[addr] R0STA addr 0010 0000 ×××××××× R0 [addr]OUT addr 0011 0000 ××××××××[ addr] LEDJMP addr 0100 0000 ×××××××× addr PC其中,IN为单字长(8位),其余为双字长指令,××××××××为addr对应的二进制地址码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉大学计算机学院计算机科学与技术专业CPU设计实验报告实验名称:开放式实验CPU设计课题名称: 计算机组成原理班级: 计科2班指导教师:***组长:组员:二零一五年三月目录目录 (2)1 实验环境(张航宇) (4)1.1 Quartus Ⅱ介绍 (4)1.2 硬件描述语言(VHDL) (4)1.3实验的主要成果 (4)2 实验要求(彭阳坤) (5)2. 1 指令格式要求 (5)2. 2 指令流程及微信号序列分析 (5)2.2.1 ADD指令分析 (5)2.2.2 ADC指令分析 (5)2.2.3 SUB指令分析 (6)2.2.4 SBC指令分析 (6)2.2.5 INC指令分析 (6)2.2.6 DEC指令分析 (6)2.2.7 SHL指令分析 (7)2.2.8 SHR指令分析 (7)2.2.9 MOVR指令分析 (7)2.2.11 MOVD指令分析 (7)2.2.12 LDRR指令分析 (8)2.2.13 STRR指令分析 (8)2.2.14 JMP指令分析 (8)2.2.15 JRZ指令分析 (8)2.2.16 JRC指令分析 (9)3.部件仿真实验(彭阳坤) (10)3.1 八个通用寄存器设计与仿真 (10)3.1.1 设计代码 (10)3.1.2 RTL连接图 (16)3.1.3 仿真过程 (16)3.2算术逻辑单元设计与仿真 (17)3.2.1 设计代码 (17)3.2.2 RTL连接图 (22)3.2.3 仿真过程 (23)4. CPU设计(彭阳坤) (24)4.1取指设计 (24)4.2 时序节拍设计 (25)4.3指令译码的设计 (26)4.4执行部分设计 (29)4.5存储器部分设计 (31)4.6通用寄存器组设计 (32)4.7寄存器输出设计 (38)4.8顶层实体设计 (38)5. 测试报告(张航宇) (42)5.1规则文件 (42)5.2测试文件 (42)5.3指令测试 (44)6 实验总结 (46)6.1 彭阳坤的小结 (46)6.1.1 实验收获 (46)6.1.2 建议与意见 (46)6.2张航宇的小结 (46)6.2.1 实验收获 (46)6.2.2 建议与意见 (47)参考资料 (47)1 实验环境(张航宇)1.1 Quartus Ⅱ介绍QuartusⅡ提供了方便的设计输入方式、快速的编译和直接易懂的器件编程。
能够支持逻辑门数在百万门以上的逻辑器件的开发,并且为第三方工具提供了无缝接口。
QuartusⅡ支持的器件有:Stratix Ⅱ、Stratix GX、Stratix、Mercury、MAX3000A、MAX 7000B、MAX 7000S、MAX 7000AE、MAX Ⅱ、FLEX6000、FLEX10K、FLEX10KA、FLEX10KE、Cyclone、Cyclone Ⅱ、APEX Ⅱ、APEX20KC、APEX20KE和ACEX1K系列。
QuartusⅡ软件包的编程器是系统的核心,提供功能强大的设计处理,设计者可以添加特定的约束条件来提高芯片的利用率。
1.2 硬件描述语言(VHDL)VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。
它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。
当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
1.3实验的主要成果熟悉对Quartus和VHDL的使用,完成一个16位8个寄存器的简单CPU,实现18条指令。
2 实验要求(彭阳坤)2. 1 指令格式要求2. 2 指令流程及微信号序列分析2.2.1 ADD指令分析2.2.2 ADC指令分析2.2.3 SUB指令分析2.2.4 SBC指令分析2.2.5 INC指令分析2.2.6 DEC指令分析2.2.7 SHL指令分析2.2.8 SHR指令分析2.2.9 MOVR指令分析2.2.11MOVD指令分析2.2.12 LDRR指令分析STRR指令分析2.2.13指令分析2.2.16 JRC指令分析3.部件仿真实验(彭阳坤)3.1 八个通用寄存器设计与仿真3.1.1 设计代码①寄存器reglibrary ieee;use ieee.std_logic_1164.all;entity reg is port(reset: in std_logic;d_input: in std_logic_vector(15 downto 0);clk: in std_logic;write: in std_logic;sel: in std_logic;q_output: out std_logic_vector(15 downto 0));end reg;architecture a OF reg isbeginprocess(reset,clk)beginIF reset = '0' thenq_output <= x"0000";elsif clk'event and clk = '0' then --时钟下降沿触发if sel ='1' and write = '1' thenq_output <= d_input;end if;end if;end process;end a;②3-8译码器Decoder_3_to_8.vhdlibrary ieee;use ieee.std_logic_1164.all;entity decoder_3_to_8 isport (sel: in std_logic_vector(2 downto 0);sel00: out std_logic;sel01: out std_logic;sel02: out std_logic;sel03: out std_logic;sel04: out std_logic;sel05: out std_logic;sel06: out std_logic;sel07: out std_logic);end decoder_3_to_8;architecture behavioral of decoder_3_to_8 isbeginsel00 <= (not sel(2)) and (not sel(1)) and (not sel(0));sel01 <= (not sel(2)) and (not sel(1)) and sel(0) ;sel02 <= (not sel(2)) and sel(1) and (not sel(0)) ;sel03 <= (not sel(2)) and sel(1) and sel(0) ;sel04 <= sel(2) and (not sel(1)) and (not sel(0));sel05 <= sel(2) and (not sel(1)) and sel(0);sel06 <= sel(2) and sel(1) and (not sel(0));sel07 <= sel(2) and sel(1) and sel(0);end behavioral;③8选1选择器mux_8_to_1.vhdlibrary ieee;use ieee.std_logic_1164.all;entity mux_8_to_1 isport (input0,input1,input2,input3,input4,input5,input6,input7: in std_logic_vector(15 downto 0);sel: in std_logic_vector(2 downto 0);out_put: out std_logic_vector(15 downto 0));end mux_8_to_1;architecture behavioral of mux_8_to_1 isbeginmux: process(sel, input0, input1, input2, input3,input4,input5,input6,input7) begincase sel iswhen "000" =>out_put <= input0;when "001" =>out_put <= input1;when "010" =>out_put <= input2;when "011" =>out_put <= input3;when "100" =>out_put <= input4;when "101" =>out_put <= input5;when "110" =>out_put <= input6;when "111" =>out_put <= input7;end case;end process;end behavioral;④通用寄存器组regfilelibrary ieee;use ieee.std_logic_1164.all;use work.exp_cpu_components.all;entity regfile isPort ( DR: in std_logic_vector(2 downto 0); --目的寄存器号SR: in std_logic_vector(2 downto 0); --源寄存器号reset: in std_logic;write: in std_logic; --写寄存器信号clk: in std_logic;d_input: in std_logic_vector(15 downto 0); --写寄存器的数据change_z: in std_logic; --如果为1,则重新设置z标志change_c: in std_logic;c_in: in std_logic;z_in: in std_logic;output_DR: out std_logic_vector(15 downto 0);output_SR: out std_logic_vector(15 downto 0);c_out: out std_logic;z_out: out std_logic);end regfile;architecture struct of regfile issignal reg00, reg01, reg02,reg03,reg04,reg05,reg06,reg07: std_logic_vector(15 downto 0); signal sel00, sel01, sel02,sel03,sel04,sel05,sel06,sel07: std_logic;beginz_c_proc: process(reset,clk) --对指令执行结束后的z、c标志进行处理beginif reset = '0' thenz_out <= '0';c_out <= '0';elsif clk'event and clk = '0' thenif change_z = '1' thenz_out <= z_in;end if;if change_c = '1' thenc_out <= c_in;end if;end if;end process;Areg00: reg port map( --寄存器R0reset => reset,d_input => d_input,clk => clk,write => write,sel => sel00,q_output => reg00);Areg01: reg port map( --寄存器R1reset => reset,d_input => d_input,clk => clk,write => write,sel => sel01,q_output => reg01);Areg02: reg port map( --寄存器R2reset => reset,d_input => d_input,clk => clk,write => write,sel => sel02,q_output => reg02);Areg03: reg port map( --寄存器R3 reset => reset,d_input => d_input,clk => clk,write => write,sel => sel03,q_output => reg03);Areg04: reg port map( --寄存器R4 reset => reset,d_input => d_input,clk => clk,write => write,sel => sel04,q_output => reg04);Areg05: reg port map( --寄存器R5 reset => reset,d_input => d_input,clk => clk,write => write,sel => sel05,q_output => reg05);Areg06: reg port map( --寄存器R6 reset => reset,d_input => d_input,clk => clk,write => write,sel => sel06,q_output => reg06);Areg07: reg port map( --寄存器R7 reset => reset,d_input => d_input,clk => clk,write => write,sel => sel07,q_output => reg07);des_decoder: decoder_3_to_8 port map( --3 —4译码器sel => DR,sel00 => sel00,sel01 => sel01,sel02 => sel02,sel03 => sel03,sel04 => sel04,sel05 => sel05,sel06 => sel06,sel07 => sel07);muxA: mux_8_to_1 port map( --目的寄存器读出8选1选择器input0 => reg00,input1 => reg01,input2 => reg02,input3 => reg03,input4 => reg04,input5 => reg05,input6 => reg06,input7 => reg07,sel => DR,out_put => output_DR);muxB: mux_8_to_1 port map( --源寄存器读出8选1选择器input0 => reg00,input1 => reg01,input2 => reg02,input3 => reg03,input4 => reg04,input5 => reg05,input6 => reg06,input7 => reg07,sel => SR,out_put => output_SR);end struct;3.1.2 RTL连接图3.1.3 仿真过程仿真结果正确3.2算术逻辑单元设计与仿真3.2.1 设计代码Exe_unit.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity exe_unit isport(t1: in std_logic;op_code: in std_logic_vector(2 downto 0);zj_instruct: in std_logic;cj_instruct: in std_logic;pc: in std_logic_vector(15 downto 0);pc_inc: in std_logic_vector(15 downto 0);c_in: in std_logic; --以前指令产生的进位Cz_in: in std_logic; --以前指令产生的ZMem_Write: in std_logic; --为1时,写存储器c_tmp: out std_logic;z_tmp: out std_logic;c_z_j_flag: out std_logic; --为1时进行条件转移r_sjmp_addr: in std_logic_vector(15 downto 0); --相对转移地址DW_intruct: in std_logic;sjmp_addr: out std_logic_vector(15 downto 0); --条件转移指令的转移地址SR_data: in std_logic_vector(15 downto 0);DR_data: in std_logic_vector(15 downto 0);Mem_Addr: out std_logic_vector(15 downto 0);cl_stc: in std_logic_vector(1 downto 0); --Stc clc 标记result: out std_logic_vector(15 downto 0) --运算结果);end exe_unit;architecture behav of exe_unit issignal A,B :std_logic_vector(15 downto 0);signal result_t: std_logic_vector(16 downto 0);beginc_z_j_flag <= ((not c_in) and cj_instruct) or ((not z_in) and zj_instruct);A <= DR_data;B <= SR_data;sjmp_addr <= pc_inc + r_sjmp_addr;Mem_Addr_proc: process(t1,SR_data,pc,DW_intruct) --选择存储器地址Mem_Addr beginif t1 = '1' thenMem_Addr <= pc;elseif DW_intruct = '1' thenMem_Addr <= pc_inc;elsif Mem_Write = '1' thenMem_Addr <= DR_data;elseMem_Addr <= SR_data;end if;end if;end process;alu_proc:process(op_code,A,B)begincase op_code iswhen "000" =>result_t <= ('0' & A) + ('0' & B);when "001" =>result_t <= ('0' & A) + ('0' & B)+ c_in;when "010" =>result_t <= ('0' & A) - ('0' & B);when "011" =>result_t <= ('0' & A) - ('0' & B)- c_in;when "100" =>result_t <= ('0' & A) + '1';when "101" =>result_t <= ('0' & A) - '1';when "110" =>result_t <= A & '0';when "111" =>result_t <= "00" & A(15 downto 1);end case;end process;result <= result_t(15 downto 0);c_tmp <= (cl_stc(1) and result_t(16))xor (not cl_stc(1) and cl_stc(0));--if (cl_stc(1)='1') then-- c_tmp <= result_t(16);--else-- c_tmp <= cl_stc(0);--end if;z_tmp <= (not result_t(15)) and (not result_t(14)) and(not result_t(13)) and (not result_t(12)) and(not result_t(11)) and (not result_t(10)) and(not result_t(9)) and (not result_t(8)) and(not result_t(7)) and (not result_t(6)) and(not result_t(5)) and (not result_t(4)) and(not result_t(3)) and (not result_t(2)) and(not result_t(1)) and (not result_t(0));end behav;decoder_unit.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity decoder_unit isport (IR: in std_logic_vector(15 downto 0);SR: out std_logic_vector(2 downto 0);DR: out std_logic_vector(2 downto 0);op_code: out std_logic_vector(2 downto 0);zj_instruct: out std_logic;cj_instruct: out std_logic;lj_instruct: out std_logic;DRWr: buffer std_logic; --为1时写DR寄存器Mem_Write: out std_logic;DW_intruct: buffer std_logic;change_z: out std_logic;change_c: out std_logic;sel_memdata: out std_logic; --为1时存储器的读出数据作为写入DR的数据r_sjmp_addr: out std_logic_vector(15 downto 0); --相对转移地址cl_stc: out std_logic_vector(1 downto 0) --Stc clc 标记);end decoder_unit;architecture behav of decoder_unit isbeginSR <= IR(7 downto 5);DR <= IR(10 downto 8);sel_memdata <= not IR(15) and IR(14) and (IR(12) xor IR(11));change_z <= (not IR(15)) and (not IR(14)) and IR(1);change_c <= (not IR(15)) and (not IR(14)) and IR(2);DRWr_proc: process(IR) --修改DRWrbeginif IR(15)='0' and IR(14) = '0' then --算术逻辑指令if IR(15) ='1' thenDRWr <= '1';elseDRWr <= '0';end if;elsif IR(10) = '1' and IR(9) = '0' then --MVRD DR,DATA;LDR DR,SR DRWr <= '1';elseDRWr <= '0';end if;end process;sj_addr_proc: process(IR) --条件转移指令的相对转移地址从8位扩展到16位beginif IR(10) ='1' thenr_sjmp_addr <= "11111111" & IR(10 downto 3);elser_sjmp_addr <= "00000000" & IR(10 downto 3);end if;end process;M_instruct:process(IR)begincase IR(15 downto 11) iswhen "01001" | "01100" => --jmp addr;mvrd dr,dataMem_Write <= '0';DW_intruct <= '1';when "01011" => -- str sr,drMem_Write <= '1';DW_intruct <= '0';when others =>Mem_Write <= '0';DW_intruct <= '0';end case;end process;ALUOP_CODE_PROC: P ROCESS(IR) --计算指令beginif IR(15 downto 14) = "00" thenop_code <= IR(13 downto 11);elseop_code <= "111";end if;end process;Jinstruct_PROC: process(IR) --jmp jnc jnzbegincase IR(15 downto 11) iswhen "01100" => --jmp adrzj_instruct <= '0';cj_instruct <= '0';lj_instruct <= '1';when "01111" => --jnc addrzj_instruct <= '0';cj_instruct <= '1';lj_instruct <= '0';when "01101" => --jnz addrzj_instruct <= '1';cj_instruct <= '0';lj_instruct <= '0';when others =>zj_instruct <= '0';cj_instruct <= '0';lj_instruct <= '0';end case;end process;Clc_Stc:process(IR)beginif IR(15)='1' thenif IR(11)='0' thencl_stc <= "00";elsecl_stc <= "01";end if;elsecl_stc <="10";end if;end process;end behav;3.2.2 RTL连接图3.2.3 仿真过程仿真正确4. CPU设计(彭阳坤)4.1取指设计取指部分instru_fetch.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity instru_fetch isport(reset,clk: in std_logic;data_read: in std_logic_vector(15 downto 0); --存储器读出的数lj_instruct: in std_logic; --长转移指令DW_intruct: in std_logic;c_z_j_flag: in std_logic; --为1时进行条件转移sjmp_addr: in std_logic_vector(15 downto 0); --条件转移指令的转移地址t1,t3: buffer std_logic;pc: buffer std_logic_vector(15 downto 0);pc_inc: buffer std_logic_vector(15 downto 0);IR: out std_logic_vector(15 downto 0));end instru_fetch;architecture behav of instru_fetch issignal start,t2: std_logic;beginIR_poc: process(reset,t2)beginif reset = '0' thenIR <= x"7000"; --nop指令elsif t2'event and t2 = '1' thenIR <= data_read;end if;end process;process(reset,clk)beginif reset = '0' thenstart <= '1';elseif clk'event and clk ='0' thenstart <= '0';end if;end if;end process;process(reset,clk)beginif reset = '0' thent1 <= '0';t2 <= '0';t3 <= '0';elsif clk'event and clk = '1' thent1 <= start or t3;t2 <= t1;t3 <= t2;end if;end process;pc_inc <= pc + '1'; --为取双字指令的第2个字或者计算相对转移地址做准备PC_proc: process(reset,t3)beginif reset = '0' thenpc <= x"0000";elsif t3'event and t3 = '0' thenif lj_instruct = '1' thenpc <= data_read;elsif c_z_j_flag ='1' thenpc <= sjmp_addr;elsif DW_intruct = '1' thenpc <= pc + "10";elsepc <= pc_inc;end if;end if;end process;end behav;4.2 时序节拍设计4.3指令译码的设计指令译码部分decoder_unit.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity decoder_unit isport (IR: in std_logic_vector(15 downto 0);SR: out std_logic_vector(2 downto 0);DR: out std_logic_vector(2 downto 0);op_code: out std_logic_vector(2 downto 0);zj_instruct: out std_logic;cj_instruct: out std_logic;lj_instruct: out std_logic;DRWr: buffer std_logic; --为1时写DR寄存器Mem_Write: out std_logic;DW_intruct: buffer std_logic;change_z: out std_logic;change_c: out std_logic;sel_memdata: out std_logic; --为1时存储器的读出数据作为写入DR的数据r_sjmp_addr: out std_logic_vector(15 downto 0); --相对转移地址cl_stc: out std_logic_vector(1 downto 0) --Stc clc 标记);end decoder_unit;architecture behav of decoder_unit isbeginSR <= IR(7 downto 5);DR <= IR(10 downto 8);sel_memdata <= not IR(15) and IR(14) and (IR(12) xor IR(11));change_z <= (not IR(15)) and (not IR(14)) and IR(1);change_c <= (not IR(15)) and (not IR(14)) and IR(2);DRWr_proc: process(IR) --修改DRWrbeginif IR(15)='0' and IR(14) = '0' then --算术逻辑指令if IR(15) ='1' thenDRWr <= '1';elseDRWr <= '0';end if;elsif IR(10) = '1' and IR(9) = '0' then --MVRD DR,DATA;LDR DR,SR DRWr <= '1';elseDRWr <= '0';end if;end process;sj_addr_proc: process(IR) --条件转移指令的相对转移地址从8位扩展到16位beginif IR(10) ='1' thenr_sjmp_addr <= "11111111" & IR(10 downto 3);elser_sjmp_addr <= "00000000" & IR(10 downto 3);end if;end process;M_instruct:process(IR)begincase IR(15 downto 11) iswhen "01001" | "01100" => --jmp addr;mvrd dr,dataMem_Write <= '0';DW_intruct <= '1';when "01011" => -- str sr,drMem_Write <= '1';DW_intruct <= '0';when others =>Mem_Write <= '0';DW_intruct <= '0';end case;end process;ALUOP_CODE_PROC: PROCESS(IR) --计算指令beginif IR(15 downto 14) = "00" thenop_code <= IR(13 downto 11);elseop_code <= "111";end if;end process;Jinstruct_PROC: process(IR) --jmp jnc jnz begincase IR(15 downto 11) iswhen "01100" => --jmp adrzj_instruct <= '0';cj_instruct <= '0';lj_instruct <= '1';when "01111" => --jnc addrzj_instruct <= '0';cj_instruct <= '1';lj_instruct <= '0';when "01101" => --jnz addrzj_instruct <= '1';cj_instruct <= '0';lj_instruct <= '0';when others =>zj_instruct <= '0';cj_instruct <= '0';lj_instruct <= '0';end case;end process;Clc_Stc:process(IR)beginif IR(15)='1' thenif IR(11)='0' thencl_stc <= "00";elsecl_stc <= "01";end if;elsecl_stc <="10";end if;end process;end behav;4.4执行部分设计执行部分exe_unit.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity exe_unit isport(t1: in std_logic;op_code: in std_logic_vector(2 downto 0);zj_instruct: in std_logic;cj_instruct: in std_logic;pc: in std_logic_vector(15 downto 0);pc_inc: in std_logic_vector(15 downto 0);c_in: in std_logic; --以前指令产生的进位Cz_in: in std_logic; --以前指令产生的ZMem_Write: in std_logic; --为1时,写存储器c_tmp: out std_logic;z_tmp: out std_logic;c_z_j_flag: out std_logic; --为1时进行条件转移r_sjmp_addr: in std_logic_vector(15 downto 0); --相对转移地址DW_intruct: in std_logic;sjmp_addr: out std_logic_vector(15 downto 0); --条件转移指令的转移地址SR_data: in std_logic_vector(15 downto 0);DR_data: in std_logic_vector(15 downto 0);Mem_Addr: out std_logic_vector(15 downto 0);cl_stc: in std_logic_vector(1 downto 0); --Stc clc 标记result: out std_logic_vector(15 downto 0) --运算结果);end exe_unit;architecture behav of exe_unit issignal A,B :std_logic_vector(15 downto 0);signal result_t: std_logic_vector(16 downto 0);beginc_z_j_flag <= ((not c_in) and cj_instruct) or ((not z_in) and zj_instruct);A <= DR_data;B <= SR_data;sjmp_addr <= pc_inc + r_sjmp_addr;Mem_Addr_proc: process(t1,SR_data,pc,DW_intruct) --选择存储器地址Mem_Addr beginif t1 = '1' thenMem_Addr <= pc;elseif DW_intruct = '1' thenMem_Addr <= pc_inc;elsif Mem_Write = '1' thenMem_Addr <= DR_data;elseMem_Addr <= SR_data;end if;end if;end process;alu_proc:process(op_code,A,B)begincase op_code iswhen "000" =>result_t <= ('0' & A) + ('0' & B);when "001" =>result_t <= ('0' & A) + ('0' & B)+ c_in;when "010" =>result_t <= ('0' & A) - ('0' & B);when "011" =>result_t <= ('0' & A) - ('0' & B)- c_in;when "100" =>result_t <= ('0' & A) + '1';when "101" =>result_t <= ('0' & A) - '1';when "110" =>result_t <= A & '0';when "111" =>result_t <= "00" & A(15 downto 1);end case;end process;result <= result_t(15 downto 0);c_tmp <= (cl_stc(1) and result_t(16))xor (not cl_stc(1) and cl_stc(0));--if (cl_stc(1)='1') then-- c_tmp <= result_t(16);--else-- c_tmp <= cl_stc(0);--end if;z_tmp <= (not result_t(15)) and (not result_t(14)) and(not result_t(13)) and (not result_t(12)) and(not result_t(11)) and (not result_t(10)) and(not result_t(9)) and (not result_t(8)) and(not result_t(7)) and (not result_t(6)) and(not result_t(5)) and (not result_t(4)) and(not result_t(3)) and (not result_t(2)) and(not result_t(1)) and (not result_t(0));end behav;4.5存储器部分设计存储器部分memory_unit.vhdlibrary ieee;use ieee.std_logic_1164.all;use work.exp_cpu_components.all;entity memory_unit isport(reset: in std_logic;clk,t3: in std_logic;Mem_addr: in std_logic_vector(15 downto 0);Mem_Write: in std_logic;sel_memdata: in std_logic; --为1时存储器的读出数据作为写入DR的数据SR_data: in std_logic_vector(15 downto 0); --写存储器的数据result: in std_logic_vector(15 downto 0); --运算结果rw: out std_logic;ob: inout std_logic_vector(15 downto 0);ar: out std_logic_vector(15 downto 0);data_read: buffer std_logic_vector(15 downto 0); --从存储器读出的指令或者数据DR_data_out: out std_logic_vector(15 downto 0) --写入DR的数据);end memory_unit;architecture behav of memory_unit isbeginar <= Mem_addr;R_W_Memory_proc: process(reset,ob,SR_data,clk,t3,Mem_Write) --读写存储器处理beginif reset = '0' thenrw <= '1';ob <= "ZZZZZZZZZZZZZZZZ"; --将存储器数据总线置为高阻,读存储器 elseif Mem_Write = '1' and t3 = '1' thenob <= SR_DATA; --写存储器rw <= clk;elseob <= "ZZZZZZZZZZZZZZZZ"; --将存储器数据总线置为高阻,读存储器rw <= '1';data_read <= ob;end if;end if;end process;sele_DR_proc: process(sel_memdata,data_read,result)beginif sel_memdata = '1' thenDR_data_out <= data_read; --存储器数据作为写DR的数据elseDR_data_out <= result; --运算结果作为写DR的数据end if;end process;end behav;4.6通用寄存器组设计①寄存器reglibrary ieee;use ieee.std_logic_1164.all;entity reg is port(reset: in std_logic;d_input: in std_logic_vector(15 downto 0);clk: in std_logic;write: in std_logic;sel: in std_logic;q_output: out std_logic_vector(15 downto 0));end reg;architecture a OF reg isbeginprocess(reset,clk)beginIF reset = '0' thenq_output <= x"0000";elsif clk'event and clk = '0' then --时钟下降沿触发if sel ='1' and write = '1' thenq_output <= d_input;end if;end if;end process;end a;②3-8译码器Decoder_3_to_8.vhdlibrary ieee;use ieee.std_logic_1164.all;entity decoder_3_to_8 isport (sel: in std_logic_vector(2 downto 0);sel00: out std_logic;sel01: out std_logic;sel02: out std_logic;sel03: out std_logic;sel04: out std_logic;sel05: out std_logic;sel06: out std_logic;sel07: out std_logic);end decoder_3_to_8;architecture behavioral of decoder_3_to_8 isbeginsel00 <= (not sel(2)) and (not sel(1)) and (not sel(0));sel01 <= (not sel(2)) and (not sel(1)) and sel(0) ;sel02 <= (not sel(2)) and sel(1) and (not sel(0)) ;sel03 <= (not sel(2)) and sel(1) and sel(0) ;sel04 <= sel(2) and (not sel(1)) and (not sel(0));sel05 <= sel(2) and (not sel(1)) and sel(0);sel06 <= sel(2) and sel(1) and (not sel(0));sel07 <= sel(2) and sel(1) and sel(0);end behavioral;③8选1选择器mux_8_to_1.vhdlibrary ieee;use ieee.std_logic_1164.all;entity mux_8_to_1 isport (input0,input1,input2,input3,input4,input5,input6,input7: in std_logic_vector(15 downto 0);sel: in std_logic_vector(2 downto 0);out_put: out std_logic_vector(15 downto 0));end mux_8_to_1;architecture behavioral of mux_8_to_1 isbeginmux: process(sel, input0, input1, input2, input3,input4,input5,input6,input7) begincase sel iswhen "000" =>out_put <= input0;when "001" =>out_put <= input1;when "010" =>out_put <= input2;when "011" =>out_put <= input3;when "100" =>out_put <= input4;when "101" =>out_put <= input5;when "110" =>out_put <= input6;when "111" =>out_put <= input7;end case;end process;end behavioral;④通用寄存器组regfilelibrary ieee;use ieee.std_logic_1164.all;use work.exp_cpu_components.all;entity regfile isPort ( DR: in std_logic_vector(2 downto 0); --目的寄存器号SR: in std_logic_vector(2 downto 0); --源寄存器号reset: in std_logic;write: in std_logic; --写寄存器信号clk: in std_logic;d_input: in std_logic_vector(15 downto 0); --写寄存器的数据change_z: in std_logic; --如果为1,则重新设置z标志change_c: in std_logic;c_in: in std_logic;z_in: in std_logic;output_DR: out std_logic_vector(15 downto 0);output_SR: out std_logic_vector(15 downto 0);c_out: out std_logic;z_out: out std_logic);end regfile;architecture struct of regfile issignal reg00, reg01, reg02,reg03,reg04,reg05,reg06,reg07: std_logic_vector(15 downto 0); signal sel00, sel01, sel02,sel03,sel04,sel05,sel06,sel07: std_logic;beginz_c_proc: process(reset,clk) --对指令执行结束后的z、c标志进行处理beginif reset = '0' thenz_out <= '0';c_out <= '0';elsif clk'event and clk = '0' thenif change_z = '1' thenz_out <= z_in;end if;if change_c = '1' thenc_out <= c_in;end if;end if;end process;Areg00: reg port map( --寄存器R0reset => reset,d_input => d_input,clk => clk,。