> ## Content Index
> Fetch the complete content index at: https://cms.yufeiran.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# 用Nexys4 DDR 制作一台计算机[1] 硬件
- URL: https://cms.yufeiran.com/yong-nexys4ddr-zhi-zuo-yi-tai-ji-suan-ji-1/
- Published: 2020-06-29T06:58:16.000Z
- Updated: 2026-09-27T12:38:01.000Z
- Author: Feiran Yu
- Tags: 作品, #legacy-import

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

## 索引

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

1. [总体](https://yufeiran.com/yong-nexys4ddr-zhi-zuo-yi-tai-ji-suan-ji/?ref=cms.yufeiran.com)
2. [硬件](https://yufeiran.com/yong-nexys4ddr-zhi-zuo-yi-tai-ji-suan-ji-1/?ref=cms.yufeiran.com)
3. [操作系统](https://yufeiran.com/yong-nexys4ddr-zhi-zuo-yi-tai-ji-suan-ji-2-cao-zuo-xi-tong-she-ji/?ref=cms.yufeiran.com)
4. 应用

## 1 特性

- CPU 部分
  - 主频50Mhz
  - 5级流水线
  - 32位处理器
  - 支持加减乘除操作
  - 支持内核模式
  - 使用MIPS Ⅱ指令集
  - 支持TLB分页缓存 \[未完成\]
  - 支持Cache缓存 \[未完成\]
- 内存部分
  - 使用[DDR2协议](https://yufeiran.com/ddr2-ram-de-shi-xian-verilog/?ref=cms.yufeiran.com)
- 硬盘部分
  - 使用[SPI FLASH协议](https://yufeiran.com/spi-flash-du-qu-mo-kuai/?ref=cms.yufeiran.com)
- 显卡部分
  - 分辨率，刷新率 1024x768@70Hz
  - 能够显示ASCII文本
- 总线部分
  - 使用Wishbone总线

## 2 SoC结构

![soc](https://yufeiran.com/content/images/2021/06/soc.png)

## 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](https://github.com/yufeiran/OpenMIPS?ref=cms.yufeiran.com)

## 5 演示视频

[自制CPU和外设运行贪吃蛇](https://www.bilibili.com/video/BV1Rf4y1t7Wo?ref=cms.yufeiran.com)

## 6 参考书籍

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

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

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