自己动手写CPU(基于FPGA与Verilog)
大三上学期开展了数字系统设计的课程,下学期便要求自己写一个单周期CPU和一个多周期CPU,既然要学,就记录一下学习的过程。
CPU——中央处理器,顾名思义,是计算机中最重要的一部分,功能就是周而复始地执行指令。其实开始做这部分之前,想到CPU就觉得很麻烦,毕竟时计算机内部最重要的东西,但其实刨开来细看,也就慢慢地接受了,当然我现在也不能说是了如指掌,说简单,毕竟自己还处于学习阶段,甚至可能还没有入门。慢慢来吧,先从简单的开始,一步一个脚印,总能写成的。今天先写在具体写代码之前的思路和设计方案。
这次的设计是基于FPGA和Verilog设计一个RISC处理器,目前计划指令是14条,最终采用ISE进行代码编写与仿真。
14条指令分别如下:
指令类型 |
指令名称 |
指令表示 |
指令 |
指令含义 |
|||||
R型 |
Add |
0 | 18 | 19 | 17 | 0 | 32 |
add rd,rs,rt |
两个操作数相加 |
R型 |
Subtract |
0 | 18 | 19 | 17 | 0 | 34 |
sub rd,rs,rt |
两个操作数相减 |
I型 |
Load word |
35 | 18 | 17 | 100 |
lw rt,rs,imm16 |
从内存取一个数写入到寄存器 |
||
I型 |
Store word |
43 | 18 | 17 | 100 |
sw rt,rs,imm16 |
从寄存器中读出一个数写入到内存 |
||
R型 |
And |
0 | 18 | 19 | 17 | 0 | 36 |
and rd,rs,rt |
按位与 |
R型 |
Or |
0 | 18 | 19 | 17 | 0 | 37 |
or rd,rs,rt |
按位或 |
R型 |
Nor |
0 | 18 | 19 | 17 | 0 | 39 |
nor rd,rs,rt |
按位非 |
I型 |
Ori |
13 | 18 | 17 | 100 |
ori rt,rs,imm16 |
寄存器和常数按位或 |
||
I型 |
Andiu |
12 | 18 | 17 | 100 |
addiu rt,rs,imm16 |
寄存器和常数按位与 |
||
I型 |
Beq |
4 | 18 | 17 | 100 |
beq rs,rt,imm16 |
想等则转移 |
||
I型 |
Bne |
5 | 18 | 17 | 100 |
beq rs,rt,imm16 |
不相等则转移 |
||
R型 |
Shift left logical |
0 | 0 | 18 | 17 | 10 | 0 |
sll rd,rs,rt |
逻辑左移 |
R型 |
Shift right logical |
0 | 0 | 18 | 17 | 10 | 2 |
srl rd,rs,rt |
逻辑右移 |
J型 |
J |
2 | 2500 |
j target |
跳转目标地址 |
确定好CPU可以执行的指令后,就可以具体写设计方案了。从上面的表就可以看出,有三种指令类型,分别是R型、I型和J型,那一个完整的设计方案必须包含这三种指令的执行。下面我给出我的设计方案图以及各个部件的功能。
PC:存储当前指令地址。
下地址逻辑:计算下一条指令地址。
指令存储器:存储指令。
主控部件:根据操作码判断指令类型是I型还是R型还是J型。
寄存器组:保存参加运算的操作数和中间结果。
ALU:算术逻辑单元,通过func选择操作类型,完成基本的算术运算和逻辑运算。
扩展器:将16位立即数进行符号扩展或零扩展得到32位立即数。
数据选择器1:根据指令类型选择相应数据进行算术或逻辑运算。指令类型若为R型,则将busb作为ALU的输入进行运算;若为I型,则将imm32作为ALU的输入进行运算。
数据选择器2:根据指令类型选择是将ALU运算后的结果写入寄存器组还是将数据存储器中的数据存入寄存器组。指令若为R型,则将ALU运算后的结果写入寄存器组;指令若为I型,则将数据存储器中的数据存入寄存器组。
数据选择器3:在overflow的控制下,选择是将rd作为寄存器组的写入地址还是将rt作为寄存器组的写入地址。指令若为R型,则将rd作为寄存器组的写入地址;指令若为I型,则将rt作为寄存器组的写入地址。
基本的设计方案就是这样,看起来部件或许比一些书上的多一些,是因为我将很多大部件拆成了一个个的小部件,这样看起来会好理解很多。最后给出各个端口的定义。
接口定义如下:
接口名称 |
类型 |
位宽/位 |
备注 |
addr |
reg |
6 |
指令地址寄存器 |
rs |
reg |
5 |
源操作数寄存器 |
rt |
reg |
5 |
源操作数寄存器 |
rd |
reg |
5 |
目的寄存器 |
op |
reg |
6 |
操作码 |
func |
reg |
6 |
指令操作类型 |
imm16 |
reg |
16 |
立即数 |
imm32 |
reg |
32 |
扩展后的立即数 |
busa |
reg |
32 |
rs内的数据 |
busb |
reg |
32 |
rt内的数据 |
R_type |
reg |
1 |
R型指令信号 |
I_type |
reg |
1 |
I型指令信号 |
J_type |
reg |
1 |
J型指令信号 |
data_in |
reg |
32 |
数据选择器1选择出来的数据 |
data_out |
reg |
32 |
ALU操作后的结果 |
Overflow |
reg |
1 |
溢出信号 |
data_I |
reg |
32 |
读出的数据存储器内的数据 |
out |
reg |
32 |
写入到寄存器组内的数据 |
自己动手写CPU(基于FPGA与Verilog)的更多相关文章
- 自己动手写CPU 笔记
自己动手写CPU 跳转至: 导航. 搜索 文件夹 1 处理器与MIPS 2 可编程逻辑器件与Verilog HDL 3 教学版OpenMIPS处理器蓝图 4 第一条指令ori 5 逻辑.移位与nop ...
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
- 自己动手写CPU之第七阶段(7)——乘累加指令的实现
将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
- 自己动手写CPU之第五阶段(1)——流水线数据相关问题
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...
- 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...
- 自己动手写CPU之第六阶段(2)——移动操作指令实现思路
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...
- 自己动手写CPU之第八阶段(4)——转移指令实现过程2
将陆续上传本人写的新书<自己动手写CPU>,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上,发表<自己动手写CPU>书评的前十名读者,均 ...
- 《自己动手写CPU》写书评获赠书活动结果
<自己动手写CPU>写书评获赠图书的读者有: 京东:8***2.16号哨兵.magicyu.kk6803.jddickyd.杰出的胡兵 亚马逊:徐贺.马先童.jaychen.farmfar ...
- 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立
将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...
随机推荐
- 【BZOJ4538】【HNOI2016】网络(树链剖分,线段树,堆)
题目链接,我是真的懒得调题目的格式... 题解 树链剖分搞一下LCA 把线段树弄出来 这只是形式上的线段树 本质上是维护一段区间的一个堆 每次把堆插入节点, 询问的时候查询线段树上的堆的最大值就行了 ...
- Vue-开发工具的安装
1. github官网下载vue工具:https://github.com/vuejs/vue-devtools.并解压 2. 在有package.json的文件夹下,按住shift右键,选择&qu ...
- 使用zxing生成解析二维码
1. 前言 随着移动互联网的发展,我们经常在火车票.汽车票.快餐店.电影院.团购网站以及移动支付等各个场景下见到二维码的应用,可见二维码以经渗透到人们生活的各个方面.条码.二维码以及RFID被人们应用 ...
- .NET Core开源API网关 – Ocelot中文文档
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...
- WP Super Cache+七牛云配置CDN加速,让你的网站秒开
CDN加速网站是几乎所有的站长都在考虑的问题,CDN,全称是Content Delivery Network,即内容分发网络.所谓CDN加速,通俗的来说就是把原服务器上数据复制到其他服务器上,用户访问 ...
- Unity3D打包 将发布的exe文件打包成一个Windows安装文件(自解压文件)
Unity打包Standalone时 会出现一个exe文件和一个data文件夹 可是我们平常见过的软件 基本没有这种像这种结构的 一般都是一个安装文件,然后点击安装,选择路径,生成快捷方式- 本篇博客 ...
- 【Unity与23种设计模式】适配器模式(Adapter)
GoF中定义: "将一个类的接口转换成为客户端期待的类接口.适配器模式让原本接口不兼容的类能一起合作." 适配器模式与装饰模式有一定的相似之处 两者都是在着手解决C#不能多继承的问 ...
- cxGrid_Q31584 cxgrid 拖放移动记录
cxgrid 拖放移动记录,cxgrid 拖放,cxgrid 拖动记录,cxgrid 鼠标拖动记录 这是cxgrid开发公司回复客户时所发送的源码项目,用于实现鼠标拖动记录,改变记录在表格中的位置,所 ...
- 关于IPFS的热门问题
最近小编在公众号收到了一些提及比较高的问题,今天总结一下统一回答 目前网络上有一些对ipfs的解读五花八门,各式各样,有看好的,也有打击的,总之一项新技术诞生之初遇到的问题IPFS都遇到了. 问题 ...
- Mac下使用终端连接远程使用ssh协议的git服务器
最近换了台新电脑, MacBook pro,拿到新电脑之后小小心喜了一下(终于解脱windows的束缚拥抱mac啦), 然后就开始苦逼的安装各种开发环境了. 之前在windows上使用tortoise ...