这个是我这个学期FPGA的期末大作业,老师说是给两周的时间去写,其实还是在最后一周匆匆赶制出来的
不到DDL不开工。其实吧,要我自己评价是挺不满意的,主要是结构缩水了太多,为了节省代码量,我们甚至连PC指针砍掉,并且将ALU和Control Unit强行拼在了一起,变成了一个单地址指令结构的(严格来说应该也算不上)CPU。可能唯一的优点就是执行快吧……
一、设计原理
看的出来其实我们设计的这个原理十分简单,一个只剩下指令寄存器的控制单元,不用计算PC指针,还和运算单元结合在了一起,连在顶层文件中的连接都省了。由于是在家里上课,也没有上板之类的,只要ModuleSim能跑就行,所以把外围内存都删了(其实原理也挺简单的),直接看输入输出波形就完事了。但是内部的存储单元还是得要,不然有许多操作的中间值没地方放,自己写一个就行了,也不要什么IP Core之类的。
二、指令列表
输入信号为16位数 别问,问就是强迫症,高8位为指令码,低8位为操作数。
总共就九个指令,全部围绕寄存器A进行:
- in_ram:将A中的数写入RAM,地址为输入数据低8位所指的空间
- load_num:从外部输入数据到A
- out_ram:将RAM中的数写入A,地址为输入数据低8位所指的空间
- clr:清空A
- inc:A中的数自加1
- dec:A中的数自减1
- stay:等待指令
- add:将A中的数与输入数据低8位相加
- min:将A中的数与输入数据低8位相减
三、代码设计
工程总共有4个文件:输入模块,运算控制模块,RAM模块以及顶层模块
1、输入模块(IDEC.v)
输入模块负责将输入的16位二进制数分割为2个8位二进制数,高8位为指令,低8位为操作数或者RAM地址。
1 | module IDEC( |
2、运算控制模块 (IMP.v)
运算控制模块大致代码分为两个部分,前半部分是声明指令是干什么的,后半部分进行相应指令的对应操作,最后的task部分为加减算法。
1 | module IMP( |
3、RAM模块 (RAM.v)
此模块为我们自己写的RAM存储器,负责存储操作数。
1 | module RAM( |
4、顶层文件 (TOP.v)
1 | module cpu( |
四、仿真 (tb.v)
我们是用ISE额外的ModelSim软件进行波形仿真,使用的testbench文件如下:
1 | module TEXT; |
得到的波形图如下所示:
可以看出data_out输出先显示出:
- A先加载0FEH
- 将数放入RAM
- 自加1
- 读出数据
- A加1
- A减2
用Synplify Pro以100MHz为仿真输入的结果是:
- Worst Slack: 4.096
- Estimated Frequence: 169.4MHz
电路图我就不贴了,就是俩模块。只要输入输出线都连上了基本就没有什么问题。有能力的可以尝试将ALU与Control Unit分开,再加个PC寄存器,就差不多是个常见的CPU结构了。