大师教你如何制作一个简单的16位CPU.pdf
文本预览下载声明
大师教你如何制作一个简单的16位CPU
大师教你如何制作一个简单的16位CPU
上网时间:2016年03月10日
如何制作一个简单的16位CPU , 先我们要明确CPU是做什么的 ,想必各位都比我清楚 ,百度的资料也很全。。。。。
如果 想要制作一个CPU , 先得明白下计算机的组成结构 (或者计算机的替代品 ,因为并不是只有计算机有CPU ,现在的电子产品都很先
进 ,很多设备例如手机、洗 衣机甚至电视和你家的汽车上面都得装一个CPU ),数字电路基础 ,还最好有点编程的基础 (当然 ,没有也没
关系 ,这些知识都很容易获得 ,各种书上面都会提 到 ,并且在接下来的过程中我会提到这些知识 )
我们要实现的是一个RISC指令集的CPU ,并且我们最后要自己为这个CPU设计指令并且编码。
先我们来听个故事 ,关于CPU的诞生的故事 :
日 本客户希望英特尔帮助他们设计和生产八种专用集成电路芯片 ,用于实现桌面计算器。英特尔的工程师发现这样做有两个很大的问题。
第一 ,英特尔已经在全力开发 三种内存芯片了 ,没有人力再设计八种新的芯片。第二 ,用八种芯片实现计算器 ,将大大超出预算成本。英
特尔的一个名叫特德?霍夫 (Ted Hoff )的工程师仔细分析了日本同行的设计 ,他发现了一个现象。这八块芯片各实现一种特定的功能。
当用户使用计算器时 ,这些功能并不是同时都需要的。比 如 ,如果用户需要计算100个数的和 ,他会重复地输入一个数 ,再做一次加法 ,
一共做100次 ,最后再打印出来。负责输入、加法和打印的电路并不同时工作。 这样 ,当一块芯片在工作时 ,其他芯片可能是空闲的。
霍夫有了一个想法 :为什么不能用一块通用的芯片加上程序来实现几块芯片的功能呢 ?当需要某种功能时 ,只需要把实现该功能的一段程
序代码 (称为子程序 )加载到通用芯片上 ,其功能与专用芯片会完全一样。
经 过几天的思考后 ,霍夫画出了计算器的新的体系结构图 ,其中包含4块芯片 :一块通用处理器芯片 ,实现所有的计算和控制功能 ;一块
可读写内存 (RAM )芯片 , 用来存放数据 ;一块只读内存 (ROM )芯片 ,用来存放程序 ;一块输入输出芯片 ,实现键入数据和操作命
令、打印结果等等功能。
看完这个故事后 ,可以总结 :CPU是一种用来代替专用集成电路的器件 (这只是我的理解 ,不同人有不同理解 ,这个就智者见智了 ,我在
接下来的例子中也会说明我的想法 )。
然后考虑如下这个例子 :
例1-1:
mov eax,0
repeat:inc eax
j mp repeat
例1-2:
int main()
{
unsigned int i = 0;
while(1)
i++;
}
例1-3:
可 以看到 ,以上三个例子都产生了一个从0不断增加的序列 ,而且前两个例子会一直加到溢出又从0开始 (这个取决于计算机的字长也就
是多少位的CPU ,eax是 32位寄存器所以必然是加到4294967295然后回0 ,而后面那个c程序则看不同编译器和不同平台不一样 ),后面
那个例子则看你用的是什么样的加法器 和多少个D触发器
那问题就来了 ,我假设要一个递减的序列怎么办呢 ?前两个例子很好解释 ,我直接改代码不就得了 :
例2-1:
mov eax,0
repeat:dec eax
j mp repeat
例2-2:
int main()
{
unsigned int i = 0;
while(1)
i--;
}
你只需要轻轻敲击键盘 ,修改了代码之后 ,它就会如你所愿的执行。
但是后面那个例子怎么办呢 ?可能你已经想到办法了 :如例2-3所示。
例2-3:
问题就来了 ,你在键盘上敲两下可不能改变实际电路 !上面 (例1-3 )中是个加法器 ,但是跑到这里却变成了减法器 (例2-3 )!
这样的话 ,你就得再做一个电路 ,一个用来算加法 ,一个用来算减法 ,可是两个电路代表你得用更多的电路和芯片 ,你花的钱就得更多 ,
要是你不能同时使用这两个电路你就花了两份钱却只干了一件事 !
这个问题能被解决吗 ?答案是能 !
请看例3 :
这 个例子中使用了一个加法器一个减法器 ,没比上面的电路省 (显然。。。。难道你想用减法器做加法器的功能 ?不可能吧 !当然 ,加上
一个负数的补码确实就是减去 一个数 ,但是这里先不考虑这种问题 ),多了一组多路器 ,少了一组D触发器。总的来说 ,优势还是明显的
(两块电路板和一块电路板的差别 )。
而sel信号就是用来选择的 (0是递增 ,1
显示全部