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

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

    索引

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

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

    1 特性

    • CPU 部分
      • 主频50Mhz
      • 5级流水线
      • 32位处理器
      • 支持加减乘除操作
      • 支持内核模式
      • 使用MIPS Ⅱ指令集
      • 支持TLB分页缓存 [未完成]
      • 支持Cache缓存 [未完成]
    • 内存部分
    • 硬盘部分
    • 显卡部分
      • 分辨率,刷新率 1024x768@70Hz
      • 能够显示ASCII文本
    • 总线部分
      • 使用Wishbone总线

    2 SoC结构

    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.