用Nexys4 DDR 制作一台计算机[1] 硬件
一个基础的计算机硬件部分
索引
这个项目由多个部分组成 你可能看到的不是第一篇文章
1 特性
- CPU 部分
- 主频50Mhz
- 5级流水线
- 32位处理器
- 支持加减乘除操作
- 支持内核模式
- 使用MIPS Ⅱ指令集
- 支持TLB分页缓存 [未完成]
- 支持Cache缓存 [未完成]
- 内存部分
- 使用DDR2协议
- 硬盘部分
- 显卡部分
- 分辨率,刷新率 1024x768@70Hz
- 能够显示ASCII文本
- 总线部分
- 使用Wishbone总线
2 SoC结构
3 CPU特性
支持的指令以及功能为
lb/lh/lw: 从存储器中读取一个byte/half word/word的数据到寄存器中
sb/sh/sw: 把一个byte/half word/word的数据从寄存器存储到存储器中
add/addu:把两个定点寄存器的内容相加
sub/subu:把两个定点寄存器的内容相减
div/divu:两个定点寄存器的内容相除
mul/mulu:两个定点寄存器的内容相乘
and/andi:与运算,两个寄存器中的内容相与
or/ori:或运算
xor/xori:异或运算
beq/beqz/benz/bne:条件转移eq相等,z零,ne不等
j/jr/jal/jalr:j直接跳转;jr使用寄存器跳转
lui:把一个16位的立即数填入到寄存器的高16位,低16位补零
sll/srl:逻辑左移/右移
slt/slti/sltui:如果2的值小于3,那么设置1的值为1,否则设置1的值为0
mov/movz/movn:复制,n为负,z为零
trap:根据地址向量转入管态
eret:从异常中返回到用户态
cpu有32个通用寄存器,功能如下
0($zero): 永远返回值为0
1($at): 用做汇编器的暂时变量
2-3(v0−v1): 子函数调用返回结果
4-7(a0−a3): 子函数调用的参数
8-15(t0−t7): 暂时变量,子函数使用时不需要保存与恢复
16-23(s0−s7): 子函数寄存器变量。子函数必须保存和恢复使用过的变量在函数返回之前,从而调用函数知道这些寄存器的值没有变化。
24-25(t8−t9): 暂时变量,子函数使用时不需要保存与恢复
26-27(k0−k1): 通常被中断或异常处理程序使用作为保存一些系统参数
28($gp): 全局指针。一些运行系统维护这个指针来更方便的存取“static“和”extern”变量。
29($sp): 堆栈指针
30(s8/fp): 第9个寄存器变量。子函数可以用来做桢指针
31($ra): 子函数的返回地
cp0:协处理器0,MIPS对CPU的控制用cp0完成
4 Github仓库
5 演示视频
自制CPU和外设运行贪吃蛇6 参考书籍
[1] 雷思磊.自己动手写CPU[M].电子工业出版社:北京,2014:1.
[2]Noam Nisan ,Shimon Schocken.计算机系统要素[M].电子工业出版社:北京,2017:1.
[3][日] 水头一寿 , [日] 米泽辽 , [日] 藤田裕士.CPU自制入门[M].人民邮电出版社:北京,2014:1.