P3-单周期CPU(Logisim实现)

差点以为自己会鸽掉P3的博客,不过经过努力目前还是造出来了课下测试要求的CPU。作为一个刚接触培养工程能力课程的萌新,不能缺少重来一次的勇气(第一版十个小时造完了,一堆bug加没法很好地拓展),只有搭完了第一遍,才能真正体会到会遇到哪些问题,才会体会到高老板课件中的精髓,才能在第二版中更好地布线,命名以及合理使用tunnel。为了更好地写实验报告,先把博客补上,然后基于博客修改出实验报告。

下文内容:第一次搭建的过程,坑点易错点以及trick总结,

搭建过程:(本段类似叙事,相当于日记)

先看完那几页要求!

当时还没学懂理论,先搭建了一下各个部件。GRF不用说了,肯定是用P0搭好的,CPU可以重新来过,但是GRF必须复用。注意GRF要有Reset,总Reset按下的时候PC、DM、GRF都要回到原始状态(助教在讨论区说了)。IFU(取指令单元)我拆成了PC与IM两个子电路。注意PC有Reset,IM用的是ROM,这些只要仔细读过要求应该不会出问题。32bitALU也没什么特别的,只是考虑到为了方便以后扩展(比如加运算指令),我的ALUOp用了3位,也就是说ALU支持8种运算,目前只有无符号加减以及或运算。对于DM(我也不知道叫啥,反正是内存),注意其输入地址为5位(32bit*32要求),注意有reset,注意MemWrite的作用是为1的时候写入数据,是数据从外面进入内存,而不是从内存写出去!至此,我们上课讲的基础元件已经搭好了。但是我推荐大家搭建一个万能分线器,它的顶层长这样:

功能大家可以望文生义一下,有了他之后的顶层布线大家亦可以想象,会十分简洁,需要的信号只需要一条线就能引出来。

下面从数据通路开始连接,这里强推高老板的工程化方法!只靠课本或者自己老师(我的理论课老师不是老板)的课件对于7条指令的CPU也不会麻烦,但指令多了之后工程化方法会很好地让我们加指令与加元件。我是先从addu开始连的通路,具体连法课本或课件已经讲得很清楚了,不再详述。然后连lw和sw,随后又补上lui指令。此处lui指令我没有放入ALU,而是单独在顶层里面加了一个16位逻辑左移移位器,然后把这个结果和ALU的结果做一个多路选择,选择信号叫做AorS_sel,当然,这个选择出来的结果最后还是免不了与从内存中读出来的数据做另一个多路选择,信号叫做MemtoReg.在加这些I型指令的时候,务必仔细阅读MIPS手册,看看到底是0扩展还是符号扩展,需不需要左移两位之类的。最后我加上了beq,为了使得线不乱,我在IFU那里的算PC+4+offset处用了tunnel进行简化布线。

数据通路不难画,控制器需要想想,并且好好查表,造表。我把控制器分成了两部分,一个只看OpCode的部分,另一个是需要综合第一部分给出的ALUOp信号以及Func信号去生成ALUcontrol信号(位数自己看着来)。两部分的结构都是与或门阵列,第一部分是OpCode六位以及其取反的战场,第二部分是ALUOp及其取反以及Func及其取反的战场。为了连线,我们需要先查mips手册,连接与门阵列,然后再造表连接或门阵列。关于造表的顺序,下面简单说一下。先搬过来教程中的

我开始是个铁憨憨,横着填的表,这是一种麻烦的填表顺序,因为每填一行,需要把所有指令的数据通路都想一遍,想得脑壳疼。第二次搭建的时候我考虑竖着填表,每填一列只需要把该指令的通路走一遍,思考量从O(n^2)降低到O(n),还不容易错。表中数据的确定是由自己的设计决定的,不能与教程中给出的数据苟同。另外,对于R型指令,所有的R型指令在与门阵列中合成一个与门就行,叫if R,因为R型指令最终干什么,还是取决于Func,所以在第一部分控制器中所有R型指令统统归为一类即可。对于if R的结果,考虑到R型指令必然写入Regfile,所以是要和RegWrite连接的。至于第一部分中的ALUOp,值的情况取决于ALU的设计以及自己的规定,一种规则是000为加法,001为减法,010为或,011为比较,100为取决于Func字段。第一部分控制器的大体思路已经讲完了,下面考虑第二部分控制器的搭建思路。我第一次搭建第二部分的时候,由于考虑不周+没看高老板课件,出了严重的漏洞,至于哪里错了待会儿再讨论。一种正确(应该正确吧,等课上就知道了)的方案是仍然用与或门阵列。与或门阵列没看懂?对于R型指令,考虑一个例子:比如addu,它的Func是100001,需要在ALUOp为100时才会生效,所以,我们要把这对应的9条线(1取原信号,0取取反之后的信号)都连到addu的与门上才行。如图:

这样的话,如果ALUOp信号不是100的话,就说明不是R型指令,addu自然不能生效。相信有了这个例子,能更好地理解与或门中的与部分。由于学艺不精,我最开始不会搭这里,在室友提醒下才发现和第一部分控制器如出一辙(脑子笨不会融会贯通啊)有了这个例子,相信其他情况也容易类比实现。但是讲真的,第二部分控制器我设计的不好,用到一个常量0来辅助,要是加指令的话,我需要去掉0,并且思考如何扩展使得信号不会乱。这里是个雷,不知道周四能不能炸死自己。两部分都结束之后,控制器也就搭完了。控制信号我统统用tunnel连到各处的,这样感觉更加可读。

就这样,CPU就搭完了,它出生时是长这样的:

太难看,但是如果按照我写的思路搭的话,第二遍就是这样:

增加了信号的名字,并刻意加大骨干元件大小之后,看起来终于像一个CPU了(没强测过,不知道有没有问题)

现在是2:47,刚刚发现弱测结果终于出来了,WA了第三个点。看了讨论区,发现自己的MemAddr取错了(图中32 to 5封装起来的内部错了)。为了保证4的倍数,类似于PC部分的取址,应该取2-6位而不是0-4位!!!讨论区万能!!!这其实也是我的一个知识盲点:现代计算机按字节编址,如果写sw $s1,20($s2)的话,是存在第五个字里(32位机器)。而DM中一个地址是一个字,所以要除以4,即取2-6位!!

关于测试:http://shell-storm.org/online/Online-Assembler-and-Disassembler/     反汇编转化网站,选择mips,bigendian,然后disassemble就行了。

过了弱测的话,目测还需要重点检查一下分支跳转指令和与负数有关的指令,目前没想起来其他的(是太困了),想到再补吧!

原文地址:https://www.cnblogs.com/BUAA-Wander/p/11790154.html

时间: 2024-10-27 08:07:36

P3-单周期CPU(Logisim实现)的相关文章

单周期CPU设计

终于有点时间了,恰好多周期的设计也已经完成,其实只想写写多周期的,无奈单周期补上才好,哈哈哈~ -----+-----黄金分割线-----+----- 首先要理解什么叫单周期CPU(与后面多周期CPU对比)单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成. 单周期CPU的功能:能够实现一些指令功能操作.需设计的指令与格式如下: ==>算术运算指令 (1)add rd , rs, rt  (说明:以助记符表示,是汇编指令:以代码表示,是机

P4 - Verilog单周期CPU

1 module mips( 2 input clk, 3 input reset 4 ); 5 6 wire [31:0] PC,nPC,PC_4; 7 wire [31:0] Instr; 8 wire [31:0] RD1,RD2,WD; 9 wire [31:0] ALU_B,ALUResult; 10 wire Zero; 11 wire [31:0] EXTResult,DMResult; 12 wire [4:0] WriteReg; 13 14 wire RegWrite,ALU

多周期CPU设计

------更新一下bug(测试代码有毒)------- 和单周期CPU的设计相同,都是为了实现一系列的指令功能,但需要指出的是何为多周期(注意与前面写道的单周期的区别,这也是设计的关键之处) 多周期CPU指的是将整个CPU的执行过程分成几个阶段,每个阶段用一个时钟去完成,然后开始下一条指令的执行,而每种指令执行时所用的时钟数不尽相同,这就是所谓的多周期CPU. 理解完多周期与单周期的区别后,开始我们的多周期CPU设计之路(可以随时对应单周期的设计,注意联系与区别). 需要设计的指令及格式如下:

单路CPU性能排名 更新于2015.10.6

http://itianti.sinaapp.com/index.php/cpu 排名 处理器 图例 分数 1 Intel Xeon E5-2699 v3 @ 2.30GHz 22892 2 Intel Xeon E5-2698 v3 @ 2.30GHz 22309 3 Intel Xeon E5-2697 v3 @ 2.60GHz 22120 4 Intel Xeon E5-2695 v3 @ 2.30GHz 20923 5 Intel Xeon E5-2690 v3 @ 2.60GHz 19

计算机组成与设计(八)—— 单周期处理器

处理器的设计步骤 分析指令系统,得出对数据通路的需求 为数据通路选择合适的组件 连接组件,建立数据通路 分析每条指令的实现,以确定控制信号 集成控制信号,完成完整的数据通路 具体设计步骤 (一)分析指令系统 MIPS的所有指令是非常多的,我们只实现其简化版,包含如下6种: (二)需求分析 需求分析,需要存放指令地址的32位寄存器(PC),需要存放指令的存储器,可读,数据和指令均为32位(MEM[PC]).还需要一个寄存器堆,用来保存源操作数和目的操作数,一个ALU进行运算. (三)选择组件 所以

关于LEA指令(单周期就可以做简单的算术计算)

堆栈种分配的局部变量所谓的“标号”,你以为是什么?(都是那些该死的宏惹的祸,大家要都是老老实实写代码,就不会有这些疑问了).      比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子:      push    ebp      mov    esp,    ebp      sub    esp,    4      现在栈上就有了4各字节的空间,这就是你的局部变量.      接下来,你执行mov    LocalVar,   

要买的书和软件

Windows内核设计思想 采用完整的 ReactOS 代码(经过部分修改)Windows内核安全与驱动开发x86/64 体系探索及编程处理器虚拟化技术Windows Internals(中文版为<深入解析 Windows 操作系统)潘爱民老师所著<Windows内核原理与实现毛德操老师所著的<Windows 内核情景分析——采用开源代码 ReactOS>LINUX核心源代码情景分析Windows环境下32位汇编语言程序设计(典藏版) x86/x64体系探索及编程(对x86处理器介

时钟周期、振荡周期、机器周期、CPU周期、状态周期、指令周期、总线周期、任务周期

计算机系统有一系列的“周期”概念,区别.联系地理解这些概念至关重要.以下对时钟周期.振荡周期.机器周期.CPU周期.状态周期.指令周期.总线周期.任务周期进行简单介绍. 周期 在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号.脉冲信号之间的时间间隔称为周期:而将在单位时间(如1秒)内所产生的脉冲个数称为频率.频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称:频率的标准计量单位是Hz(赫).电脑中的系统时钟就是一个典型的频率相当精确和稳定

指令周期 机器周期 状态周期 振荡时钟周期(时钟周期)(转)

转自:http://blog.csdn.net/zhangxichao/archive/2009/05/14/4186972.aspx 时钟周期: 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的.最小的时间单位. 在一个时钟周期内,CPU仅完成一个最基本的动作.对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us:若采用4MHZ的时钟频率,则时钟 周期为250us.由