神秘是一种我们能够体验到的最美丽的东西。 它是所有真正艺术和科学的源泉。
——阿尔伯特.爱因斯坦
简单 CPU 设计实践
King-Duan
本文通过一个简单的 CPU 模型设计,阐述 CPU 设计
过程中的一些原理和经验。
左家垅职业技术学院
岳麓山
158157488@qq.com
2014/10/25
简单 CPU 设计实践
目录
开始前的话 ............................................... 3
总体组成 ................................................. 3
运算器 ................................................... 3
补码........................................................................................................................................... 3
算术单元 ................................................................................................................................... 4
逻辑单元 ................................................................................................................................... 5
算术逻辑单元 ........................................................................................................................... 6
移位器....................................................................................................................................... 7
运算器综合 ............................................................................................................................... 8
溢出判断 ................................................................................................................................... 9
运算器设计的总结和补充 ..................................................................................................... 11
寄存器组 ................................................ 11
注意事项 ................................................................................................................................. 11
使能端..................................................................................................................................... 12
构建寄存器组 ......................................................................................................................... 12
控制器 .................................................. 13
程序计数器 ............................................................................................................................. 14
指令寄存器 ............................................................................................................................. 14
数据通路设计 ......................................................................................................................... 14
控制字..................................................................................................................................... 15
指令译码器 ............................................................................................................................. 16
状态寄存器 ............................................................................................................................. 18
控制器综合 ............................................................................................................................. 18
CPU 综合 ................................................ 19
封装......................................................................................................................................... 19
指令周期和机器周期 ............................................................................................................. 21
编译器开发 .............................................. 23
结束语 .................................................. 24
参考资料 ................................................ 24
2
简单 CPU 设计实践
开始前的话
本人大学党一个,计算机科学与技术专业,平时对电子技术、计算机科学和软件技术有
所研究,在此只是分享一些自己平时学习、游戏中的电子和计算机科学方面的经验,希望能
够给同样学习中的人带来启发,另外如果有任何意见、建议、批评,欢迎提出来。
由于对于大部分学电子和信息的同学来说,数电已能熟练掌握,所以在此略过数电的知
识,如果对数电有些不明白的,可以参考其他数电教程。
本教程开始之前要求至少要掌握:基本逻辑门、组合逻辑电路分析设计方法、译码器、
编码器、数据选择器、比较器、加法器、三态门、基本触发器、锁存器、寄存器、移位寄存
器、计数器。
在这里采用的工具是 Logisim,这是一个较为简易的仿真工具,不会涉及具体的芯片,
而是纯粹从原理的角度来分析仿真,对于简单的 CPU 仿真最合适不过了。
此外,本人水平有限,文中难免出现纰漏和错误,欢迎指出!
这里会从零开始,一步一步搭建电路,阐述原理,最终实现一个类似 MIPS 架构的 CPU。
另外我会采用尽可能简洁的语言。
总体组成
CPU 一般包括寄存器组、运算器和控制器。
另外对于现代的 CPU,大都配置了 Cache。
首先,让我们来构造运算器
运算器
一般简单 CPU 实现的运算操作有算术运算、逻辑运算和移位。算术运算主要包括加法、
减法、曾 1、减 1 等,逻辑运算主要包括与、或、非、异或,移位实现左移右移或者不变。
算术运算器实际上就是一个加法器和其他几个运算的结合体,那么减法怎么办呢?
补码
众所周知,A-B=A+(-B),就这样,减法就转换成了加法,那么负数怎么表示?答案是
用补码!
实际上为了方便,我们把参与运算的数都用补码表示,定义正数和零的补码为本身,负
数的补码为其反码加一(反码就是按位取反)。
3
简单 CPU 设计实践
补码表示的时候,正数、零和负数可以很方便区分出来,最高位为 0,则为正数或零,
最高位为 1,则为负数。
不过在这里,我们还需要对运算结果按 2^n 取模(n 为位数),写成通式就是这样:
[A-B]补=([A]补+[-B]补)mod 2^n,(A、B>=0)
其实 mod 2^(n+1)的意思就是舍弃最高位的进位。
举个例子,如果要计算八位二进制运算 5-3,可以这样做:
[5]补=5=00000101B,
[-3]补=[3]反+1=[0000011]反+1=11111100B+1=11111101B
然后做加法运算
如果第一个是负数呢?情况也一样的,因为加法满足交换律,加法器的两个输入端也是
对称的。
如果小数减大数呢?例如 15-35(八位字长):
[15-35]补=([15]补+[-35]补)mod 2^8=(00001111B+11011101B)mod 2^8=11101100B=[-20]
补
由此可以看出,当用补码表示整数的时候,加减法可以统一为加法运算。
算术单元
有了以上的理论就可以构造算术单元啦~
实际上,两数相减时,还需要对第二个数求补码,求补的话,至少需要求反,另外我们
不仅仅需要加法、减法,还需要增 1、减 1。增 1 可以通过低位进位端实现,减一可以通过
加负一的补码实现,也就是加全一,
所以综合以上,还需要在输入端加一个实现取反、全 0、全 1 或保持原样的模块。
取反可以用非门实现,然后用数据选择器选择不同的通路,即可实现上述功能。
4
简单 CPU 设计实践
一个简单的 4 选一数据选择器和一个加法器就构建出了一个算术单元,神奇吧!
其中的 A 和 B 是 8 路数据输入,S1、S0 和 Cin 进行功能选择,右侧输出结果。
实现的功能表很容易写出来:
逻辑单元
那么接下来就是逻辑单元了
逻辑单元最简单了,与或非和异或就够用了吧!
原理还是一样的,由两路信号输入,通过选择功能,输出结果!
原理图 So easy!
功能表 So easy!
5
算术逻辑单元
简单 CPU 设计实践
接下来就是最最最重要的 ALU 即算术逻辑单元了
说白了就是把算术单元和逻辑单元组合起来~
分析:算术逻辑单元要实现的功能是对 A 和 B 进行特定操作,而进行哪种操作是需要
选择的,所以输入端 A、B 和功能选择端是应该共用的,对于输出端,应该对算术和逻辑两
者进行选择。
ALU 电路~
功能表~
6
移位器
简单 CPU 设计实践
除了算术和逻辑运算,我们通常还需要一种移位运算,在这里,因为速度要求很高,且
不需要暂存,所以不采用移位寄存器,而是用组合逻辑电路的移位器。
移位的原理是使用不同的接线,错位 N 位就实现了移动 N 位,所以需要用到数据选择
器。
对于一次一位的移位,只需要用二选一数据选择器。
如果需要双向移动,则需要四选一。
如果要一次移多位的话,需要用到桶形移位器,其复杂度会大大增加。
八位桶形向左移位器
可以一次移动 0~7 位
7
需要注意的是连线
简单 CPU 设计实践
运算器综合
在以上各个部件的基础上,就能组成一个运算器了,当然这样的运算器还很简单,不过
基本的运算能够满足了。
8