一个简单 CPU 的实现
目 录
一.前言………………………………………………………
…………………1
二.总体框图 …………………………………………………
……………..4
三.指令系统…………………………………………………
……………….5
四.ASM 状态图………………………………………………
………………6
五.每个部件的实现…………………………………………
……………9
六.调试中的问题与解决……………………………………
…………16
七.改进………………………………………………………
……………….17
八.代码………………………………………………………
………………18
一.前 言
周一到周六,整整 6 天时间,没有上课,宅在宿舍里完成了 CPU 的设计与实现,感
觉很棒。
最先的方案是一个纯状态机,没有时序部件,一个时钟周期为一个状态,几十个状态
之间的转换,终于迷路了,于是放弃了。而且这种方式的扩展性不好,添加新的指令比较
麻烦。
第二个方案我决定加入时序部件,一个时钟周期为一个节拍,三个节拍为一个机器周
期,一共 3 个机器周期:取指,译码,执行。于是做好了 Timer,看了仿真波形,感觉很
漂亮。接着实现了 ALU,RAM,REGS(寄存器组)。最后完成了 CU(CU 太费劲了)。
可是部件组合到一块后就有问题了,测试程序的结果的仿真波形根本看不懂,无奈得
很,整整一天不知道该怎么办,最后只能将部件里的信号一个一个输出,分析波形,一个
一个的排除,最后发现 CPU 读指令时乱读,开始我猜测是 CU 没能正确发出信号,于是
分析 CU 发出的信号的波形,结果是对的。我开始怀疑 RAM,终于发现机器周期的节拍
数太少,存储器不能在有限的时间内将数据读到总线,导致了 CPU 取不到正确的指令,
于是程序不知道跑到那个地方去了。
所以我决定给每个机器周期增加一个节拍,问题迎刃而解,当我看到 PC 值,IR 值按
照自己的预想变化时,当我看到最终测试程序得到正确结果时,我在宿舍里欢呼,大叫,
发泄近一个星期的压抑,我甚至都感动了,因为实验过程中有好几次都想放弃了,不过我
告诉自己只要坚持就一定有结果,果然天不负我。
遥想去年数字逻辑设计时,我也是憋足一股劲,挑了老师说的最难的出租车计费系统,
自学了 VHDL,花了 7 天时间完成,我记得当时程序在板子上正确的跑起来时,我流鼻血
了(那几天太热,比较投入,顾不上喝水了)。
我喜欢这种工作方式,感觉效率很高。不过自己做的这种 project 还是太少,对自己
要求不够严格。不过我会努力的,下一步打算做流水线,据说已经有同学做出来了,挺佩
服的,我等皆当效仿啊!