Day-6 Build a CPU

Build a CPU

tags: IT铁人

抽象化设计

建构一台电脑时,他要能执行所有指定ISA的指令,以MIPS来说,就要执行MIPS里面的所有指令,我们用底下的指令来建构电脑:

Memory存取 算术逻辑运算 流程控制(不照顺序执行指令)
lw, sw add, sub, and, or, slt(向左shift,等同乘以2) beq(相等时跳到其他指令), j(直接跳到其他指令)

在建构之前,我们要先介绍一些基本零件

基本零件 说明
Register file(暂存器的集合):透过Register编号,我们可以读取或写入任何一个Register,MIPS 2000有32个32位元一般目的Register,因此需要5bits来指定Register,Register file可以同时读取2个即写入1个Register内容,另外还需要1bit的写入控制讯号来指定是否要写入Register。
ALU:执行运算的零件,一次只允许2个32bits的运算元参与运算,并由4bits的ALU控制讯号决定运算的类别(add, sub, or...),另外,ALU有一个1bit的zero indicator表示运算结果是否为0。
Data Memory:提供资料储存的零件,提供位址输入口、资料输入口、资料输出口,另外还需要指定要写入还是读取的各1bit输入口。
Instruction Memory:储存程序的零件,有一个32bits的指令输出口跟一个32bits的指令输入口,
Adder:固定执行32bits加法并产上32bits结果的零件,虽然功能ALU也能做到,只是因为另外用一个零件执行比较省时间。它的用处在於(1)增加PC(program counter)的值到下一个指令,(2)计算branch指令的目的指令(target address)。
Sign Extension Unit:用来将16bits有号数扩充成32bits有号数的零件,转成32bits是为了能够丢进ALU进行加法。
Program Counter(PC):32bits特殊目的Register,永远存放下一个要被执行的指令所在的记忆体位址。

单一时脉电脑资料路径的结构

现在我们知道了基本零件有哪些,接下来要做的事情,就是把一个一个执行程序的步骤组起来,最後再把每个步骤串在一起,会稍微有点难,不过一起努力ㄅ~

Instruction fetch

第一步我们要将执行程序的位址拿出来,所以需要PC纪录执行到哪里、Adder将指令位置往後推、Instruction Memory取得指令的内容。

组合的结果如下图:

每次将PC加4(因为一个指令32bits = 4bytes,所以指令位置4个4个一组)。
PC接入Instruction Memory。
Adder的结果送回PC。

R-type指令资料路径

R-type读取两个Register的值,进行运算後存回去一个Register,所以我们需要Register file存取数值、ALU计算数值。

组合结果如下图:

取得Instrucion後,将三个Register号码输入。
可以得到两个数值,丢进去ALU计算。
将结果丢回Register file中。

载入指令资料路径(load word)

载入指令是将指定的Memory Address资料复制到指定的Register中,而且Address是将Register的资料加上某个常数,另外要把16bits的常数extend成32bits才能进去ALU进行运算。

所以我们需要Register file得到资料、ALU计算记忆体位址、Data Memory获取记忆体资料,另外需要Sign extend扩充成32bits。

组合结果如下图:

得到指令後,将Register资料读出来(target Register、base memory address),常数丢入Sign extension Unit。
运算结果丢入Data Memory得到数值。
将数值丢回Register。

储存指令资料路径(store word)

跟载入指令相似,只不过是将Register的内容丢进Data Memory中,所以我们需要的东西跟载入指令相同。

组合结果跟载入指令一样:

不同的点在於Memory的资料不用回到Register file中。
并且Read data 2的资料要送进Memory

相等分支指令资料途径(branch on equal)

如果两个Register的资料相同,就要跳到指定的位置执行指令,所以要将常数extend之後丢到Adder中,改变PC的数值,需要的零件会有Register file、ALU比较是否相等、Sign Extension Unit扩充位元、Adder计算PC位址。

组合结果如下图:

比较结果後传送到branch control logic,由他决定是否要选择常数加入PC

Combine

比较麻烦的是加入Control之後需要的说明很多,不过基本上就是那些决定Read, Write, ALUop或是决定要用哪个来当作输入时,都需要经过一个选择器或是由Control Unit决定,经过层层组合後,整个CPU的样子就会像这样:

蓝色的线代表Control的部分,其他黑色的深浅不重要,只是图片在叙述不同的重点而已。

稍微有点难理解,我们可以将每个步骤要做的事情放进去图上看,就会发现它满足了每一个需求了,能够自己画出这张图的话,相信对这个章节已经理解不少了。

下回预告

在这边我们把CPU的datapath画出来了,只是为了增加它的效能,我们会需要在中间设立像是储存点的东西,才能让一个一个指令接连进入,也就是Pipeline。

如果觉得这回已经够地狱的话,下回会再恐怖一些,嘎油馁~

上一篇 下一篇
谁是最棒的狗勾 Pipeline

<<:  学习Python纪录Day3 - Aconada安装

>>:  入门魔法 - 变数与值

D-28-dotnet cli ? build ? run

产生了专案之後 昨天经由大头的代领小光终於完成建置环境,并且也产生了他人生中第一个专案,虽然最後在H...

30天学会Python: Day 23-交换数值

要交换两个变数的值,在 Python 有几种写法 可以先另外建立一个变数,再互相指派,假设输入的数值...

曝露系数(Exposure factor)

-简单的定量风险分析 曝露系数 (EF) 曝露系数 (EF) 是在实现特定威胁时对特定资产的主观、...

Day3:Security Group 简介与布建

在AWS SA间流传着一句俗谚:「SG/NACL锁的好,资安没烦恼」。很多在用AWS的用户常常分不清...