制作一台计算机要多少知识点,组建一台计算机7_硬件6 制作简易单周期CPU(1)...

允许转载,转载请遵循GNU开源宣言,标明出处。Copyleft ! <2013>,

阅读此文,你需要拥有以下基础:

1.能理解本系列第1至5节;2.已经阅读了第6节。

或者:了解MIPS汇编和电路的初等知识。

=========================================================================

之前我们已经完成了多位加法器,减法器,存储器和汇编初步的学习,接下来我们要开始着手完成一个支持Lite-MIPS指令集的CPU。

看到这儿,你也许会有一些问题,下面这些Q&A或许能解答你心中的疑惑。(或许有些小儿科了,但毕竟是科普文,所以解释的尽量清楚简单而不是专业)

1 问:什么是指令集啊?以前没听说过。2 答:指令集就是指令的集合。指令就是我们上一节讲的汇编语言里面的一条一条的语句。这些语句所对应的二进制码是CPU完全能够读懂的。3

4 问:二进制码又是什么啊...指令,二进制码,C语言之间有什么关系?5 答:C语言被直接编译成二进制指令码,这些指令码可以被CPU读懂并执行,但是二进制指令码人们很难读懂,于是把指令码分别翻译成汇编指令以供我们阅读。汇编指令和二进制指令码之间是一一对应(双射的关系,而他们和C语言。6

7 问:咦,那什么是Lite-MIPS指令集?

8 答:是一个精简到不到十个的MIPS核心指令集,但是它们的任意组合可以发挥出MIPS大多数指令的功能。9

10 问:那他们都有谁呢?11 答:Addu,Subu,Or,Ori,Lw,Sw,Beq,Lui,BGEZ。12

13 问:之前都是制作一个模块儿,比如加法器,锁存器,这次一下要做一个CPU,会不会很困难?14 答:困难是必须的,本次除了一些电路原理需要搞明白,更需要培养和锻炼一种系统化设计的思想,这也是本次的重中之重。这种思想相信你在准备设计任何一个稍复杂的系统的时候都会有所思考和体会,现在就是考验你思考深度的时候啦。15

16 问:一般的CPU都支持好几十个指令,intel的CISC-CPU甚至支持成百上千的指令,这回我们做出了能支持9条指令的CPU,如果以后我想扩充它的指令兼容性,会不会很复杂?是否需要重新做?17 答:当然不需要。本次制作的精髓便是“单周期数据通路的一般性设计方法”,这个方法是以前北京航空航天大学的高小鹏教授研究发明并传授给我的,应用了这个方法,我们可以在线性时间复杂度下设计和扩展自己的指令集。每当想要新增指令时,只需要修改非常少的部分。18

19 问:能告诉我CISC和RISC的区别吗?wikipedia和百度百科上的解释太过复杂,能三言两语就让我明白吗?20 答:三言两语可以让你明白,但是一定不会深入和细致。CISC和RISC的区别就是一个是C(复杂),一个是R(精简)。CISC指令集的指令数比RISC高一个数量级,这使得很多操作可以用更少的指令来完成,使得效率更高,可以认为是一种类硬件优化的设计思想;而RISC指令集中的指令小而精,尽管有些高等指令不能用一条指令来完成,但是通过基本指令的组合和编译优化可以使效率最优,可以认为是一种类软件的优化设计思想。21

22 问:那能随便说说你对CISC和RISC的选择吗?23 答:就我个人来看,正如数学与哲学一样,越简单越本质越底层的概念与理论模式越接近真理,RISC这种设计已经在更高的一个层面上胜出了CISC设计理念。且不谈CISC的复杂性和指令臃肿性,把接近揭示计算本质的图灵机指令集设计成像X86那种长短不一,规则复杂的复杂指令实在令人难以接受。24

25 问:那你能预告和解释一下本次的重点吗?26 答:刚刚已经说了:1.体会系统化设计思想;27 2.掌握单周期数据通路的一般性设计方法;28 3.实现支持L-M指令的单周期CPU。

首先,我们先要对这个CPU有一个初步的设计方向——系统化,模块儿化。

如何系统化和模块儿化?

CPU就像一个黑箱,你知道扔进去的输入和拿出来的输出,现在需要设计箱子里面是什么,那么就要做到以下几点:

1.很精确地知道输入输出是什么;

2.知道CPU会对这些输入进行哪些处理;

3.把这些处理分别化成更小的黑箱来进行设计。

4.建立一个黑箱套黑箱的模型,这种设计模式需要自顶而下,明确各黑箱间的接口关系。

接下来,我们给出一些能想得到的需要的小黑箱——子模块儿:

1.IFU——存储指令的黑箱——CPU需要执行的指令都存在着啦~

2.GPR——存放寄存器的黑箱——寄存器是CPU执行指令时临时存放数据的房间~

3.ALU——计算单元黑箱——加减法,位运算就得靠他来完成

4.DM——数据存储黑箱——说白了就是数据内存,它和一般我们电脑里的内存不同点在于它只存数据不存指令

5.CONTROLLER——控制单元黑箱——以上这些模块儿需要什么时间启动,输入信号如何选择和处理都得靠他来控制

6.其他的一些小元件——移位拓展黑箱等。

这些黑箱被列举出来之后,就需要详细定义,思考一下他们的接口和作用了,经过一番思考,我们可以列出下表:

A052618867-67636.png_small.png

A052621117-67637.png_small.png

A052623367-67638.png_small.png

A052625633-67639.png_small.png

A052627899-67640.png_small.png

A052630133-67641.png_small.png

现在我们列出了所有黑箱详细的描述,接下来就是看这些模块儿如何在指令的引导下操作了!

我们需要把指令和这些模块儿的控制信号相对接,仍然是清晰地列表:

A052632274-67642.png_small.png

然后,根据第六节学习的MIPS汇编知识和上面的表格,为了更清晰地表达指令和二进制码之间的关系,我们不难列出下表:

Instruction

Boolean expressions

Rtype

op[5]’*op[4]’*op[3]’*op[2]’*op[1]’*op[0]’

Addu

Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2]’ *funct[1]’ *funct[0]

Subu

Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2]’ *funct[1] *funct[0]

Ori

op[5]’*op[4]’*op[3]*op[2]*op[1]’*op[0]

Or

Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2] *funct[1]’ *funct[0]

Lw

op[5] *op[4] ’*op[3] ’*op[2] ’*op[1] *op[0]

Sw

op[5] *op[4] ’*op[3] *op[2] ’ *op[1] *op[0]

Beq

op[5] ’*op[4] ’*op[3] ’*op[2]*op[1] ’*op[0] ’

Lui

op[5] ’*op[4] ’*op[3]*op[2]*op[1]*op[0]

BEQZ

op[5] ’*op[4] ’*op[3]’*op[2]’*op[1]’*op[0]*rt[4]’*rt[3]’*rt[2]’*rt[1]’*rt[0]

紧接着,由于不同指令在数据通路中需要的模块儿,控制盒子模块儿信号来源都不一样,所以我们需要分析以下各个指令的详细执行过程,再结合之前的表格,根据指令来解决控制信号的问题,列出下表:

Control signals

Expressions

RegDst

Addu + Subu + Or

= Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2]’ *funct[1]’ *funct[0]

+ Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2]’ *funct[1] *funct[0]

ALUSrc

Ori + lw + sw

= op[5]’*op[4]’*op[3]*op[2]*op[1]’*op[0]

+ op[5] *op[4] ’*op[3] ’*op[2] ’*op[1] *op[0]

+ op[5] *op[4] ’*op[3] *op[2] ’ *op[1] *op[0]

MemToReg

Lw

= op[5] *op[4] ’*op[3] ’*op[2] ’*op[1] *op[0]

RegWrite

Addu + subu + ori + lw + lui + or

= Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2]’ *funct[1]’ *funct[0]

+ Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2]’ *funct[1] *funct[0]

+ op[5]’*op[4]’*op[3]*op[2]*op[1]’*op[0]

+ op[5] *op[4] ’*op[3] ’*op[2] ’*op[1] *op[0]

+ op[5] ’*op[4] ’*op[3]*op[2]*op[1]*op[0]

MemWrite

Sw

= op[5] *op[4] ’*op[3] *op[2] ’ *op[1] *op[0]

Npc_Sel

Beq

= op[5] ’*op[4] ’*op[3] ’*op[2]*op[1] ’*op[0] ’

ExtOp[0]

Lw + sw

= op[5] *op[4] ’*op[3] ’*op[2] ’*op[1] *op[0]

+ op[5] *op[4] ’*op[3] *op[2] ’ *op[1] *op[0]

ExtOp[1]

Lui

= op[5] ’*op[4] ’*op[3]*op[2]*op[1]*op[0]

ALUCtr[1]

Ori + or

= op[5]’*op[4]’*op[3]*op[2]*op[1]’*op[0]

ALUCtr[0]

Subu + beq

= Rtype*funct[5] *funct[4]’ *funct[3]’ *funct[2]’ *funct[1] *funct[0]

+ op[5] ’*op[4] ’*op[3] ’*op[2]*op[1] ’*op[0] ’

至此,任务算是进行了一半了——至少理论的部分完成啦~

可是你一定会问:这次怎么全是一些乱七八糟的表格和分析啊?真没趣!难道就不能做出来让我们瞧瞧嘛?

别担心。

下一次,我们将把这一套理论用电路实现。

敬请期待~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值