用Nexys4 DDR 制作一台计算机[1] 硬件

一个基础的计算机硬件部分

索引

这个项目由多个部分组成 你可能看到的不是第一篇文章

  1. 总体
  2. 硬件
  3. 操作系统
  4. 应用

1 特性

  • CPU 部分
    • 主频50Mhz
    • 5级流水线
    • 32位处理器
    • 支持加减乘除操作
    • 支持内核模式
    • 使用MIPS Ⅱ指令集
    • 支持TLB分页缓存 [未完成]
    • 支持Cache缓存 [未完成]
  • 内存部分
  • 硬盘部分
  • 显卡部分
    • 分辨率,刷新率 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仓库

OpenMIPS

5 演示视频

自制CPU和外设运行贪吃蛇

6 参考书籍

[1] 雷思磊.自己动手写CPU[M].电子工业出版社:北京,2014:1.

[2]Noam Nisan ,Shimon Schocken.计算机系统要素[M].电子工业出版社:北京,2017:1.

[3][日] 水头一寿 , [日] 米泽辽 , [日] 藤田裕士.CPU自制入门[M].人民邮电出版社:北京,2014:1.