自己动手写CPU

共49讲

自己动手写CPU教程,来源:https://blog.csdn.net/leishangwen/category_5723475

第一章(1)计算机的简单模型、架构、指令集

时间从1971年11月15日开始,那一天,Intel发布了世界上第一款单芯片微处理器4004。


第一章(2)MIPS指令集架构的演变

MIPS指令集架构自上世纪80年代出现后,一直在进行着更新换代,从最初的MIPS I到MIPS V,发展到可支持扩展模块的MIPS32、MIPS64系列,再到集成代码压缩技术的microMIPS32、microMIPS64。


第一章(3)MIPS32指令集架构简介

本书设计的处理器遵循MIPS32 Release 1架构,所以本节介绍的MIPS32指令集架构指的就是MIPS32 Release 1。


第二章(1)可编程逻辑器件与PLD电路设计流程

本书是通过“代码 + FPGA”的方式实现CPU的,本章将对其原理进行解释,并对使用的编程语言Verilog HDL进行介绍。


第二章(2)Verilog HDL简介

本章接下来的几节将介绍Verilog HDL的一些基本知识,包括语法、结构等。


第二章(3)Verilog HDL行为语句

Verilog定义的模块一般包括有过程语句,过程语句有两种:initial、always。其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的。


第二章(4)电路设计举例

本节将设计一个简化的处理器取指令电路,通过这个例子体会Verilog HDL的使用。


第二章(5)ModelSim电路仿真

本节将解答指令存储器初始化问题和如何给出时钟信号,在此基础上,使用ModelSim进行仿真。


第三章 教学版OpenMIPS处理器蓝图

本章给出了教学版OpenMIPS的系统蓝图,首先介绍了系统的设计目标,其中详细说明了OpenMIPS处理器计划实现的5级流水线。


第四章(1)第一条指令ori的实现

本章我们将实现OpenMIPS处理器的第一条指令ori,为什么选择这条指令作为我们实现的第一条指令呢?


第四章(2)验证第一条指令ori的实现效果

本节将验证我们的OpenMIPS是否实现正确,包含:流水线是否正确、ori指令是否实现正确。


第四章(3)MIPS编译环境的建立

本节将说明如何安装使用GNU开发工具链以及如何制作Makefile文件,从而以更加方便、快捷、自动的方式对测试程序进行编译。


第四章(4)Makefile文件建立

本章通过实现指令ori,搭建了一个原始的五级流水线结构,这也是OpenMIPS的核心。


第五章(1)流水线数据相关问题

本章首先讨论了流水线数据相关问题,然后修改OpenMIPS以解决该问题,并在5.3节验证了解决效果。


第五章(2)OpenMIPS对数据相关问题的解决措施

OpenMIPS处理器采用数据前推的方法来解决流水线数据相关问题。


第五章(3)MIPS指令集中的逻辑、移位与空指令

MIPS32指令集架构中定义的逻辑操作指令有8条:and、andi、or、ori、xor、xori、nor、lui,其中ori指令已经实现了,本章要实现其余7条指令。



第五章(5)测试逻辑、移位与空指令的实现

本章分析了流水线中存在的数据相关问题,然后使用数据前推的方法解决了数据相关问题。


第六章(1)移动操作指令说明

本章将实现移动操作指令,首先在6.1节介绍了MIPS32指令集架构中定义的移动操作指令的格式、作用。


第六章(2)移动操作指令实现思路

本节给出移动操作指令实现思路,介绍了修改后的数据流图、新出现的数据相关问题及其解决措施,并给出了修改后的OpenMIPS系统结构图。


第六章(3)移动操作指令的实现

本节列出了详细的修改过程。


第六章(4)验证移动操作指令实现效果

本节将通过一个测试程序验证为OpenMIPS处理器添加的移动操作指令是否实现正确。


第七章(1)简单算术操作指令说明

本章将实现MIPS32指令集架构定义的所有算术操作指令,共有21条


第七章(2)简单算术操作指令实现过程

虽然简单算术操作指令的数目比较多,有15条,但实现方式都是相似的。


第七章(3)简单算术操作指令实现过程(续)

上一篇中已经介绍了对译码阶段ID模块的修改过程,本文继续介绍执行阶段EX模块的修改过程。










第八章(1)转移指令介绍

本章将为OpenMIPS处理器添加转移指令,转移指令包括跳转、分支两种,区别在于前者是绝对转移,后者是相对转移,但实现方法是相似的。





第九章(1)加载存储指令说明1

本章将实现MIPS32指令集架构中定义的加载存储指令,分两步:首先实现除ll、sc指令外的一般加载存储指令,其次实现比较特殊的加载存储指令ll、sc。


第九章(2)加载存储指令说明2(lwl、lwr)

本节继续对MIPS32中加载存储指令进行说明(主要是lwl、lwr),上次已经介绍一些其他的加载存储指令,大家可以回顾。


第九章(3)加载存储指令说明2(swl、swr)

本节继续对MIPS32中加载存储指令进行说明(主要是swl、swr),上次已经介绍一些其他的加载存储指令,大家可以回顾。


第九章(4)加载存储指令实现思路

本节介绍除ll、sc之外的加载存储指令的实现思路。






第九章(6)修改最小SOPC

前几篇实现了加载存储指令,今天将修改最小SOPC,用以测试加载存储指令是否实现正确。


第九章(7)MIPS32中的LL、SC指令说明

本节将介绍链接加载指令LL、条件存储指令SC,在后续将实现这两条指令。


第九章(8)MIPS32中的LL、SC指令实现思路

这2条指令都涉及到访问链接状态位LLbit,可以将LLbit当做寄存器处理,ll指令需要写该寄存器,sc指令需要读该寄存器,同时,与对通用寄存器的访问一样,对LLbit寄存器的写操作也放在回写阶段进行。