自己动手设计一个FPGA上可运行的简易CPU及汇编器

该项目目前已经转移到:https://gitee.com/jianfengtony/risc_t16 欢迎一起研讨。

前言

其实自己写一个CPU的想法早在2008年还在上大学的时候就有了,因为后来工作的原因,当然更多的是因为自己懒散的原因,一直没有投入精力去做这件事情。差不多在2015年的时候在做一个控制项目时,因为有一些实时性要求很高的控制及信号处理,又重新用到了FPGA,当时的项目是在FPGA上实现的,自己参与时项目主体基本完工,但是仔细了解项目后发现项目里面很多模块都用到了状态机,然后通过编码的二进制去实现复杂的计算,当时就再次萌发了写一个精简的CPU来替换项目中众多的定制化CPU,充分利用FPGA上的分布式RAM、LUT及乘法器等资源。
后来花费了两三周的时间设计了一个三级流水线CPU,用FPGA内部的RAM模块作为存储器,可以运行起来,无奈项目规模太大,这个设计的CPU项目中一直不愿替换,就一直存在我的电脑中无用武之地。
最近因为多方面的原因,包括看到中美贸易战科技战,自己想把这个简易CPU的想法和代码总结一下发到网上,大家一起学习。

简易CPU的基本功能和架构简介

在这里我定义一个最简的CPU包含如下几方面的特性或指令:

  1. 能够读取数据和指令,即具备访问存储器或寄存器的寻址能力
  2. 有程序指针,控制CPU按照节奏顺序执行指令
  3. 具有跳转指令,能够实现程序循环
  4. 具备逻辑比较等指令,能够实现条件判断
  5. 具备外部IO,能够处理输入和输出,与外界交互
  6. 具备算术运算、逻辑运算等指令支持更加复杂的运算等,这个我认为不是全部必须,但是要有能力扩展,需要哪个指令的时候能够通过总线增加。

以上这些就是设计这个CPU的一些基本特性和目标。

当然最后我们还要设计一个汇编器(计划用python来实现,替换原来用C#实现的),以方便对于CPU进行编程。至于C语言的支持,因为本人对于编译还不太懂,暂时不打算实现和支持。
原来是用VHDL来实现的设计,本次整理计划改为用verilog来实现。

存储模块设计(背景设计)

为了验证CPU的设计,我们先做一些铺垫,这里先分析一下存储的一些典型特性及建立我们设计CPU的一些前提输入。
存储是计算机系统最重要的一个模块之一,对于CPU来说存储系统分为数据存储器和程序存储器,当然也有将数据存储器和程序存储器合一的,这取决于CPU的架构,这里我们采用的是程序和数据分开的哈佛架构,相对来说这样设计逻辑简单,便于入门,而且对于FPGA上的资源来说也比较容易实现。
我们先来看看典型sdram的时序图:

指令系统设计

原来的指令采用的是自己设计的16bits的指令系统,本次改为采用RISC-V指令系统,从中间选取一些必要的最小集合来实现。
RISC-V指令系统格式分为以下几种:

待上传图片

其中的寄存器片段为rs1和rs2以及rd,均为5bits设计,也就是可以最大容纳32个寄存器的编址。
opcode片段为7bits的设计,最大容纳 2 7 = 128 2^7=128 27=128个编码
RISC-V的指令集分类基础指令和扩展指令,我们重点实现RV32I的基础指令集。
下面为挑选出来的RV32I基础指令集:

指令汇编funct - 7rs2 - 5rs1 - 5funct - 3rd - 5opcode - 7R
add rd,rs1,rs20000000rs2rs1000rd0110011R
addi rd,rs1,immediateimme
  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值