新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > 16位CPU怎么做,DIY大神给你支支招儿

16位CPU怎么做,DIY大神给你支支招儿

作者:时间:2019-03-19来源:电子工程世界收藏

  要理解这些概念需要一点时间。

本文引用地址:http://www.eepw.com.cn/article/201903/398604.htm

  一个的基本结构以及必要组件

16位CPU怎么做,DIY大神给你支支招儿

  这个例子引用自DE2开发板套件带的光盘上的Lab Exercise 9,我们从图中可以看到,一个包含了通用寄存器组R0~R7,一个ALU(算术逻辑单元),指令寄存器IR,控制器(一般这部分是一个有限状态机或 者是用微指令实现),还有就是数据通路(图中的连线)。当然真正的不可能只包含这么一点点组件,这是一个模型CPU,也就是说只是说明CPU的原 理,真正复杂的CPU要涉及到很多复杂的结构和时序,例如虚拟模式需要使用一些特殊的寄存器、为了支持分页需要使用页表寄存器等,为了加速内存的访问需要 使用TLB,加速数据和指令的访问而使用data cache和instruction cache等等。。。。。当然,那都是后面该考虑的,所以我们先从这个简单的部分开始讲起。

  例子中能实现如下指令:

16位CPU怎么做,DIY大神给你支支招儿

  mv指令将Ry的数据转移到Rx中,mvi将立即数D转移到Rx当中,add将Rx和Ry的和放到Rx中,sub同上,不过执行的是减法。

  首先来说明mv指令是如何执行的:mv指令将Ry的值移入Rx寄存器当中,这两个寄存器都是由一组D触发器构成,而D触发器的个数取决于寄存器的宽度,就像 32位机、64位机这样,那他们的寄存器使用的D触发器的个数就是不一样的。当执行mv rx,ry时,中间的多路器(图中最大的那个multiplexer)选通Ry,让Ry寄存器驱动总线,这个时候Bus上的信号就是Ry的值;然后再看到 R0~R7上分别有R0in~R7in信号,这个信号是使能信号,当这个信号有效时,在上升沿此触发器会将din的数据输入,所以说到这里大家一定想到 了,这个时候Rx触发器上的Din信号就会变为有效,这样过了一个时钟周期后Ry的值就被送到了Rx当中。

  与mv指令类似,mvi指令也将一个数据送入Rx当中,只不过这次的数据存在指令当中,是立即数,所以Rx的Din信号会变为有效,而多路器会选择IR中的数据,因为mvi指令的立即数存在指令当中。并且进行一定处理,例如扩展等。

  add 指令会让多路器先选择Rx,然后Ain信号有效,这样一个时钟周期后,Rx数据被送入Alu的A寄存器当中,这时多路器选择Ry,addsub信号为 add以指示ALU进行加法操作,Gin有效让G寄存器存放运算结果,然后再过一个时钟周期G当中的数据就是Rx与Ry的和,这时多路器再选择 Gin,Rx的Din有效,过了一个时钟周期后数据就被存放到Rx当中了。

  sub的过程与add差不多,不过addsub信号是sub指示ALU进行减法。

  我做的CPU模型

  下面我就将我做的CPU模型的RTL网表发出来,代码我会上传的,但是这个还只能进行仿真,因为设计 的时候理念有问题,出现了异步设计,而且出现了将状态机的输出作为另一个器件的时钟端的错误,所以这个模型只能用于仿真。我用的synplify pro综合出的RTL,而状态转移图是用的Quartus的FSM Viewer截下来的。

  首先是整个系统的概览:

16位CPU怎么做,DIY大神给你支支招儿

  这个比上面的那个简单模型复杂多了吧!但是别担心,其实这个只是上面的那个CPU变得稍微复杂了一点,这个和上面那个不同的地方还有:这个CPU是一个多周期CPU而上面的Lab Exercise是一个单周期的CPU

  下图是程序计数器(PC),也就是常见x86处理器里面的ip(instruction poiniter):

16位CPU怎么做,DIY大神给你支支招儿

  红色部分就是pc了,后面是一个三态桥,连接到了总线上面,这里的数据有时候是要送到地址总线,用于寻内存中的数据,以便完成Instruction Fetch过程。有时候又要送到通用寄存器的数据端,用于将pc的值送到其他寄存器。

  下面这个是IR(Instruction Register),这个是多周期处理器的典型特征,因为处理器在第一个周期里面将机器码从内存取出,然后存放到这个寄存器里面,后面的几个状态都是通过这个寄存器里面的数据作为指示执行操作的。

16位CPU怎么做,DIY大神给你支支招儿

  下面介绍一下ALU,ALU是Arithmetic Logic Unit,即算术逻辑单元,这个装置的作用是进行算术操作和逻辑操作。典型的算术操作例

  如:1+1=2,11x23=253,而典型的逻辑操作例如:1 and 1=1,0 or 0 = 0,1<<3=8这种属于逻辑操作。

16位CPU怎么做,DIY大神给你支支招儿

  而从图中大家也看得到,ALU的输出用一根很长的线连接到了后面,参考整个CPU的图的话,会发现这些线连到了通用寄存器上面,这是为了让运算的结果存放回 去,例如你用add eax,1的时候,eax的值被加上1然后放回eax,所以ALU的运算结果要用反馈送回到通用寄存器,而ALU的输入也应该有通用寄存器的输出。

  下面再介绍ADDRMUX:

16位CPU怎么做,DIY大神给你支支招儿

  这个部件是用来选择地址的,右边的输出是CPU的地址总线,而CPU的地址总线就已经送出CPU了(也就是你能够在芯片的外表上看到引脚了),CPU的地址总线是送到存储器的地址端的,而现代的计算机系统实际上是相当复杂的,所以其实你家的计算机上CPU是通过北桥芯片访问内存的(当然也有将内存控制器做到 CPU里面的)左边是地址的来源,地址的来源即有通用寄存器,也有程序计数器,还有一个是直接从IR里面送出,这是因为有的立即数里面也包含内存地址信息。

  最后介绍通用寄存器:

16位CPU怎么做,DIY大神给你支支招儿

  通用寄存器的作用就是用来保存中间值或者用于运算,例如

  add eax,2

  相当于eax+2然后送回eax。

  最后介绍一下状态机,这个部分就是CPU的“灵魂”,如果说有了上面那些部件CPU有了一副“躯体”的话,这一部分就是CPU的“灵魂”了:

16位CPU怎么做,DIY大神给你支支招儿


关键词: CPU RISC

评论


相关推荐

技术专区

关闭