Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >简易RISC软核CPU设计

简易RISC软核CPU设计

作者头像
数字积木
发布于 2021-04-15 02:51:29
发布于 2021-04-15 02:51:29
1.3K0
举报
文章被收录于专栏:数字积木数字积木

1,简介

FPGA设计中在IP核的提供方式上,通常将其分为软核、固核和硬核这3类。软核(Soft IP Core) : 软核在EDA 设计领域指的是综合之前的寄存器传输级(RTL) 模型;通常遍是指以HDL代码(Verilog,VHDL...)为形式的可综合源代码;固核(Firm IP Core) :固核在EDA 设计领域指的是带有平面规划信息的网表;硬核 (Hard IP Core) :硬核在EDA 设计领域指经过验证的设计版图。软核只经过功能仿真,需要经过综合以及布局布线才能使用。其优点是灵活性高、可移植性强,允许用户自配置。软核处理器是指利用HDL语言描述的处理器功能代码,用于实现处理器的所需要的各种功能。

通常的处理器架构由以下部分组成。指令寄存器、累加器、算术逻辑运算单元、数据控制器、状态控制器、程序计数器、地址多路器等基本部件。是用于实现根据特定指令集生成的汇编代码的硬件运行环境。本文在介绍risc-v 指令集的相关基本概念后,通过一个简易的risc-v 处理器设计,来说明处理器工作时的各种细节。

2,CPU的工作流程

常见的CPU内部有5级流水线组成。cpu的工作大致分为以下几个步骤;

1:取指。该阶段从内存中读取指令,PC(程序计数器)制定指令的地址。

2:译码。该阶段将从内存读取的指令翻译为各种操作。并从寄存器中取出操作数。

3:执行。该阶段算数逻辑单元执行指令表示的操作。

4:访存。该阶段将结果数据写入到内存中。

5:写回。将结果写会到寄存器文件中。

(1)取指令(IF)

CPU在取指令阶段(IF阶段)时,先向一级指令缓存要指令,要到指令后我们将程序计数器(PC)自增1(1表示移动一条指令的宽度,如果数据单位是32位,那么就自增1,如果数据单位是8位1字节,那么就自增4)。这样我们在下次取指令的时候就能取到下一条指令了。同时如果你实现了分支预测,那么在这里则需要做另外的处理。

(2)解码(ID)

注意到我们有这些指令对:add和addi,addu和addui,or和ori等,这些指令对的功能是一样的,只是取操作数的方式不一样,如果我们能用某种方式统一这些指令对,那么我们在实现这些指令的执行将会变得更简单,因为对于同一类的指令我们能做同一个操作。解码器就是做这个事情的。

CPU在解码阶段(ID阶段)时还需要根据解码器得到的操作数寄存器的编号,从相应的寄存器中取出ALU所需要的操作数,因此我们也将寄存器归到解码阶段中。

(3)执行(EX)

执行阶段(EX阶段)是我们调用ALU进行真正的计算过程。由于乘法和除法的速度比较慢,如果1个周期能完成加法的计算,那么乘法和除法就需要超过1个周期的时间,也就是说乘法器和除法器在多周期CPU里是多周期的。同时,所有的浮点运算也都是多周期的,比如浮点加是4个周期(另外在浮点运算单元中同样存在流水线,把浮点加法分成4个阶段计算)。

同时对于syscall指令,我们也要在执行阶段完成操作。

因此执行阶段CPU一共会有以下执行模块,分别是ALU、整数的乘除运算单元、浮点运算单元(内部仍存在流水线,而且加减法和乘除法可以并行执行)和其他的一些处理电路。

【ALU】

ALU在执行阶段将会按照给定的ALU的微指令,对两个操作数进行运算(无论是加减运算、位运算、比较运算以及跳转指令需要的比较运算),并得到结果输出(输出包括运算结果、是否跳转等信息)。对于内存操作的指令,我们也需要ALU计算出我们要读取的内存的真实地址(因为指令规范中给定的是某个寄存器的偏移,或者当前指令的偏移)。

(4)内存读写(MEM)

对于lb、lbu、lh、lhu、lw、sb、sbu、sh、shu、sw等内存操作的指令,这个阶段将被启用。这个阶段将会与一级的数据缓存交互。

(5)寄存器写(WB)

这个阶段(WB阶段)有结果的指令将会把数据存到对应的寄存器里。

在CPU的工作流程中,首先读取PC(程序计数器)指向的地址的指令,送入到译码模块,译码器对opcode指令进行译码,经过译码之后得到指令需要的操作数寄存器索引,可以使用此索引从通用寄存器组(Register File,Regfile)中将操作数读出。指令译码之后所需要进行的计算类型都已得知,并且已经从通用寄存器组中读取出了所需的操作数,那么接下来便进行指令执行。指令执行是指对指令进行真正运算的过程。譬如,如果指令是一条加法运算指令,则对操作数进行加法操作;如果是减法运算指令,则进行减法操作。

3,RISC-V指令集介绍

下图显示了六种基本指令格式,分别是:用于寄存器-寄存器操作的 R 类型指令,用于短立即数和访存 load 操作的 I 型指令,用于访存 store 操作的 S 型指令,用于条件跳转操作的 B 类型指令,用于长立即数的 U 型指令和用于无条件跳转的 J 型指令。

首先,指令只有六种格式,并且所有的指令都是 32 位长,这简化了指令解码。第二,RISC-V 指令提供三个寄存器操作数(rs1,rs2,rd),而不是像 x86-32 一样,让源操作数和目的操作数共享一个字段。当一个操作天然就需要有三个不同的操作数,但是 ISA 只提供了两个操作数时,编译器或者汇编程序程序员就需要多使用一条 move(搬运)指令,来保存目的寄存器的值。第三,在 RISC-V 中对于所有指令,要读写的寄存器的标识符总是在同一位置,意味着在解码指令之前,就可以先开始访问寄存器。第四,这些格式的立即数字段总是符号扩展,符号位总是在指令中最高位。这意味着可能成为关键路径的立即数符号扩展,可以在指令解码之前进行。

RV32I 带有指令布局,操作码,格式类型和名称的操作码映射。

4,设计总览

在本设计中,为了简化设计,降低设计的复杂度,并没有采用多级流 水线形式来设计,而是采用了状态机的方法。取指,译码, 执行,访问,写回分别在几个周期内完成,等 完成该指令的操作后,在读取下一个指令。整个 RISC_CPU 设计方案组成框图应该包含以下内容:

从上述架构图可以看出,RICS_CPU 结构比较复杂,但是它的基本部件并不复杂,整个方案设计可以从它的 8 个基本组成部分来考虑:

  • 时钟发生器
  • 指令寄存器
  • 累加器
  • 算术逻辑运算单元
  • 数据控制器
  • 状态控制器
  • 程序计数器
  • 地址多路器

4.1 时钟发生器

该模块的设计主要是利用外部时钟信号 clk 来产生一系列时钟信号,并且可以送到 CPU 的其它各个部件中。其中,fetch 是控制信号,clk 的 6 分频信号。当 fetch 高电平时,使 clk 能触发 cpu 控制器开始执行一条指令;同时 fetch 信号还将控制地址多路器输出指令地址和数据地址。clk 信号还用作指令寄存器,累加器,状态控制器的时钟信号。

图 2 时钟发生器原理图

4.2 指令寄存器

指令寄存器的触发信号时 clk,在 clk 的正沿触发下,寄存器将数据总线送来的指令存入 16 位的寄存器中,但并不是每个 clk 的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由 CPU 状态控制器的 load_ir 信号控制。load_ir 信号通过 load_ir 口输入到指令寄存器,复位后,指令寄存器被清为零。

图 3 指令寄存器原理图

4.3 累加器

累加器用于存放当前的结果,它也是双目运算中的一个数据来源。复位后, 累加器的值是零。当累加器通过 load_acc 信号时,在 clk 时钟跳变沿时就受到来自于数据总线的数据。

图 4 累加器原理图

4.4 算术运算器

算术逻辑运算单元,它根据输入的 16 种不同的操作码分别进行加减乘,与或非等基本操作运算,利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。

图 5 算术运算器原理图

4.5 数据控制器

数据控制器,其作用是控制累加器的数据输出,由于数据总线是各种操作时传送数据的公共通道,不同情况下传送不同的内容。有时要传输指令,有时要传送 RAM 区或接口的数据。累加器的数据只有在需要往 RAM 区域或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。所以任何部件往总线上输出数据时,都需要一控制信号。而此控制信号的启停则由 cpu 状态控制器输出各信号控制决定。数据控制器何时输出累加器的数据则由状态控制器输出的控制信号 data_ena 决定。

图 6 数据控制器原理图

4.6 地址多路器

地址多路器,它用于选择输出的地址是 PC 地址还是数据/端口地址。每个指令周期的前 3 个时钟周期用于从 ROM 中读取指令,输出的应是 PC 地址,后 3 个时钟周期用于 RAM 或端口的读写,该地址有指令给出。地址的选择输出信号由时钟信号的 6 分频 fetch 提供。

图 7 地址多路器原理图

4.7 程序计数器

它用于提供指令地址,以便读取指令。指令按地址顺序存放在存储器中。有两种途径可形成指令地址;其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行 JMP 指令后,需要形成新的地址。

图 8 程序计数器原理图

4.8 状态控制器

状态机控制器接收复位信号 reset,当 reset 有效时,通过信号 ena 使其为零, 输入到状态机中,以停止状态机的工作。状态机是 cpu 的控制核心,用于产生一系列的控制信号,启动或停止某些部件。cpu 何时进行指令来读写I/O 端口及RAM 区等操作,都是由状态机来控制的。状态机的当前状态,由变量 state 记录,state 的值就是当前这个指令周期中已过的时钟数。

指令周期是有 6 个时钟周期组成,每个时钟周期都要完成固定的操作,即:

1. 第 0 个时钟,cpu 状态控制器的输出 rd,data_ctl 和 load_ir 为高电平,inc_pc从 0 变为 1 故 pc 加 1,ROM 送来的指令代码寄存在指令寄存器中。

2. 第 1 个时钟空操作

3. 第 2 个时钟。若操作符为 HLT,则输出信号 HLT 为高。如果操作符不为HLT,除了 PC 增 1 外,其他各控制线输出为零。

4. 第 3 个时钟,若操作符为 AND,ADD,XOR,LDA,NOT,MUL,SUB , OR, RL, RR, POP, PUSH,读取相应地址的数据;若为 STO,输出累加器数据。

5. 第 4 个时钟,若操作符为 AND,ADD 等算术运算,算术运算器就进行相应的运算;若操作符为 LDA,就把数据通过算术运算符送给累加器;若为SKZ,先判断累加器的值是否为 0,如果为 0,PC 加 1,否则保持原值;若为 JMP,锁存目标地址;若为 STO,将数据写入地址处。

6. 第 5 个时钟空操作

5,仿真结果

图 10 RISC_CPU 顶层系统级仿真及部分信号说明

图 11 RISC_CPU 复位及内部寄存器初始值仿真

仿真结果说明:RISC_CPU 的复位和启动操作是通过 reset 引脚的信号触发执行。当 reset 信号一进入高电平,RISC_CPU 就会结束先行操作,并且只要 reset 停留在高电平状态,cpu 就维持在复位状态。在复位状态,cpu 各个内部寄存器都被设有初值,全部为零。数据总线为高阻态,地址总线为 000H,所有控制信号均为无效状态,reset 回到低电平后,接着到来的第一个 fetch 上升沿奖启动RISC_CPU 开始工作,从 ROM 的 000 处开始读取指令并执行相应操作,波形见图 11。

图 12 RISC_CPU 时钟分频模块仿真-6 分频

图 13 CPU 总线写操作—RISC_CPU 写入数据时序仿真

图 14 RISC_CPU 读取数据时序仿真

仿真结果说明:每个指令周期的前 0~2 个时钟周期用于读指令;第 2.5 个周期处,存储器或端口地址就输入到地址总线上;第 3~5 个时钟周期,读信号 rd有效,数据送到数据总线上,以便累加器锁存,或参与算术,逻辑运算。

图 15 RISC_CPU 指令寄存器模块仿真

图 16 RISC_CPU 运算器模块仿真

6,工程源码

公众号对话框回复

RISC-V-CPU

即可获得工程源码下载链接。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
不懂底层的程序员不是好程序员,解密代码在计算机中运行原理
还记得Windows的CMD吗?只需向这个黑框框输入指令,计算机即可做出相对应的响应。其实计算机的运行本身就是依靠向CPU下达一条一条的指令,并使计算机按指令运行。计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。
IT大咖说
2019/12/26
1.5K0
揭秘计算机指令执行的神秘过程:CPU内部的绝密操作
从软件工程师的角度来看,CPU是执行计算机指令的逻辑机器。计算机指令可以看作是CPU能够理解的语言,也称为机器语言。
努力的小雨
2023/11/30
8000
计算机组成原理概述
计算机硬件是构成计算机系统各功能部件的集合。是由电子、机械和光电元件组成的各种计算机部件和设备的总称,是计算机完成各项工作的物质基础。计算机硬件是看得见、摸得着的,实实在在存在的物理实体。 计算机软件是指与计算机系统操作有关的各种程序以及任何与之相关的文档和数据的集合。其中程序是用程序设计语言描述的适合计算机执行的语句指令序列。 没有安装任何软件的计算机通常称为“裸机”,裸机是无法工作的。如果计算机硬件脱离了计算机软件,那么它就成为了一台无用的机器。如果计算机软件脱离了计算机的硬件就失去了它运行的物质基础;所以说二者相互依存,缺一不可,共同构成一个完整的计算机系统。
黄规速
2022/04/14
1.4K0
计算机组成原理概述
【愚公系列】软考高级-架构设计师 002-中央处理单元CPU
中央处理单元(CPU,Central Processing Unit)是计算机硬件的核心部件,负责解释和执行大部分计算机指令。它是计算机的大脑,处理数据并控制计算机其他部件的操作。CPU的性能直接影响到整个系统的效率。
愚公搬代码
2024/05/07
2330
模型机的构建和指令的执行流程
存储器的主要结构如下图所示,左边的四位的事我们的存储器里面的内存单元的地址,框框里面的8位是一个字节,是我们的指令的具体内容,默认情况下都是按照字节编址,也就是默认情况下8bit就是一个地址,也就是我们下面的这个图片的一行表示的就是一个具体的内存单元的地址;
阑梦清川
2025/05/22
1040
关于CPU的内部架构和工作原理
今天在某个群里讨论为什么亲戚得知我是学计算机的之后就会来找我修电脑、装软件,但是他们从来不会问我CPU是如何工作的。
RD.Timon
2020/10/26
1.6K0
关于CPU的内部架构和工作原理
【Linux系统编程】——理解冯诺依曼体系结构(进程)
冯·诺依曼结构(Von Neumann Architecture)是现代计算机的基本结构之一,由数学家约翰·冯·诺依曼在20世纪40年代提出。这种结构被广泛应用于现代计算机设计中,其核心思想是将程序和数据存储在同一存储器中,通过共享一套硬件实现灵活的操作。以下是冯·诺依曼结构的基本组成部分及特点:
用户11286421
2025/01/17
2830
【Linux系统编程】——理解冯诺依曼体系结构(进程)
互联网十万个为什么之什么是CPU?
CPU(中央处理器)是计算机系统的核心硬件组件,负责执行程序代码,处理数据,以及控制其他硬件设备的操作。CPU接收来自内存或输入设备的指令,然后按照指令执行运算和逻辑处理,最终输出结果。它可以看作是计算机的大脑,任何的计算任务都依赖于CPU处理。
linus_lin
2024/09/06
2560
互联网十万个为什么之什么是CPU?
CPU的基本架构以及指令的执行过程
以上是CPU的基本架构和核心组成部分,它们相互配合,完成指令的执行和数据的处理,是计算机系统中最重要的组成部分。
一凡sir
2023/08/07
1.3K0
计算机组成原理 CPU的功能和基本结构和指令执行过程
用户不可见的寄存器 (对用户透明,用户不可编程) : SR,T,MAR,MDR,IR
onenewcode
2024/01/22
7860
软考数据库——第一章计算机系统知识(知识点介绍和历年真题)
2、中断方式:CPU不等待,也不执行程序去查询外设的状态,而是由外设在准备好以后,向CPU发出中断请求信号通知CPU,CPU收到中断请求信号以后,保存正在执行程序的现场,转入1/0中断服务程序的执行,然后再返回到被打断的程序继续执行。
老虎也淘气
2024/07/26
4250
软考数据库——第一章计算机系统知识(知识点介绍和历年真题)
《计算机组成原理》基础概念笔记整理
2、计数器查询;(优先级设置比较灵活,对故障不敏感,连线及控制部分过程比较复杂。)
全栈程序员站长
2022/08/23
1.6K0
软件评测师笔记(四)—— 操作系统
高级语言源程序中的错误分为两类:语法错误和语义错误,其中语义错误可分为静态语义和动态语义错误
小菠萝测试笔记
2020/06/09
8690
②CPU - 运算器、控制器 【软考-软件设计师考点】
.29.
2023/10/31
4200
②CPU - 运算器、控制器 【软考-软件设计师考点】
软件设计师考试 | 计算机系统
计算机系统是由软硬件共同组成,协同运行程序。计算机的基本硬件由 运算器、控制器、存储器、输入设备、输出设备 5 大部件组成。其中,运算器和控制器等部件集成到一起的部分称为中央处理器(CPU)。CPU 是硬件系统的核心,用于加工处理各种数据,能完成各种算术、逻辑运算以及控制功能。
村雨遥
2022/11/30
8250
软件设计师考试 | 计算机系统
跟着博主玩转计算机组成结构--中央处理器CPU(不知道CPU干啥的小伙伴看过来)
CPU的工作过程就是不停的执行指令,计算机各个部分的所进行的工作可以说都是由CPU根据指令来启动的(指的是进入操作系统之后,纯硬件的话还是有南北桥)。因为CPU的速度太快,为了使CPU减少等待时间,甚至不参与计算机输入输出过程(等待时间太久),采取程序中断的方式和DMA的方式。这两种方式下,外部设备需要向CPU提出中断请求或DMA请求,因此在执行指令过程中,CPU还要按时通过采样相应的引脚来查询有没有中断请求或DMA请求。一般, 在一个机器 周期结束时,查询是否有DMA请求,如果有,则CPU脱离总线,由DMA控制器控制使用总线。在一个指令周期结束时,查询是否有中断请求,如果有,则进入中断响应机器周期,相当于执行了一条中断响应隐指令。在中断响应过程中,得到中断服务程序的入口地址,并送程序计数器(PC)中,下个指令周期开始时,取出中断服务程序的第一条指令 执行。
风骨散人Chiam
2020/10/28
3K1
计算机组成原理:第五章 中央处理器
数据寄存器(Data Register,DR)又称数据缓冲寄存器,其主要功能是作为CPU和主存、外设之间信息传输的中转站,用以弥补CPU和主存、外设之间操作速度上的差异。
Here_SDUT
2022/08/11
2.6K0
计算机组成原理:第五章   中央处理器
数据库系统工程师笔记(一)计算机系统
执行所有的算术运算。加减乘除等 执行所有的逻辑运算。逻辑与、逻辑非、逻辑或。 组成:
Maynor
2024/05/26
1670
数据库系统工程师笔记(一)计算机系统
计算机系统构成及硬件基础知识
其具体操作方式为:将R进制数的每一位数值用Rk形式表示,即幂的底数是R,指数是k,k与该位和小数点之间的距离有关。当该位位于小数点左边,k值是该位和小数点之间数码的个数,而当该位位于小数点右边,k值是负值,其绝对值是该位和小数点之间数码的个数加1。
全栈程序员站长
2022/07/23
1.1K0
计算机系统构成及硬件基础知识
【软考学习4】计算机构成——CPU 结构、Flynn 分类法、CISC和RISC
全名 复杂指令系统计算机,Complex InstrucTIon Set Computer。
Designer 小郑
2023/08/01
1.1K0
【软考学习4】计算机构成——CPU 结构、Flynn 分类法、CISC和RISC
推荐阅读
相关推荐
不懂底层的程序员不是好程序员,解密代码在计算机中运行原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档