用Verilog搭出RISC-V架构单周期CPU

VIP用Verilog搭出RISC-V架构单周期CPU
这是笔者学校暑期学期的必修课,难度并不高(仅追求及格的话),但相当耗时,对于在硬件设计方面完全不感冒的同学更是一场避不开的折磨,所以笔者想通过自己的成果和被折磨经验来帮助有此方面需求的同学,或是对于CPU设计有浓厚兴趣的人。
开通可读全文 ·1.3w 人阅读
最低0.47元/天 解锁文章

一、前言(一些废话)

  封面与内容无关!侵权必删!
  这是笔者学校暑期学期的必修课,难度并不高(仅追求及格的话),但相当耗时,对于在硬件设计方面完全不感冒的同学更是一场避不开的折磨,所以笔者想通过自己的成果和被折磨经验来帮助有此方面需求的同学,或是对于CPU设计有浓厚兴趣的人。


这是笔者在CSDN上第一篇博客,若有不足请多海涵
若有源码需求或对本文章有所见解者,请不吝赐教

二、知识预备

  如果在编写Verilog这类硬件编程语言时出现没有思路等现象时,可尝试反思对于设计所要求的理论知识是否牢固。
编写CPU的预备知识如下:

  • 对数字逻辑设计有一定了解或更深层次的学习
  • 对硬件原理有较好的基础并且能加以运用
  • 对《计算机组成原理》理论至少要有所涉猎
  • 对《计算机组成原理》教材(国内外皆可)中的CPU工作原理比较熟悉,并且能够自行构思其完整工作过程

三、整体构造图及开发板型号

手绘的单周期CPU整体框图

  • 本设计基于开发板为Xilinx的xc7a100tfgg484系列

四、将CPU工作分解

 4.1取指(IF)

  4.1.1 PC模块

   我们知道CPU要取出指令,所依靠的计数器就是PC,通过PC的值pc,CPU可确定取指令的位置,所以此模块负责传输pc值。

  4.1.2 NPC模块

   在单周期模型中,PC需要在每个时钟上升沿到来之际进行相应更新,我们可以把这个逻辑单元单独拿出来,向PC模块传输下一个pc的值npc,同时此模块也接受一些后序模块数据,因为这些数据可能影响到如何选择npc的正确值。

  4.1.3 IROM模块

   该模块使用vivado平台提供的IP核实现,通过预先存入16进制指令序列,并且接受PC模块的pc值作为地址寻址取指令,并将取出的指令inst传送至后序模块(inst可以说是CPU最重要的变量了,没有inst一切工作都不可能进行)。

 4.2译码(ID)

  4.2.1 CU模块

   控制单元(control unit)的简称,CU是CPU的“大脑”,负责解析从IROM模块传来的inst指令,并且生成各类控制信号,用于调遣其余部件进行工作。

  4.2.2 RF模块

   寄存器堆(register file)的简称,寄存器堆是CPU负责高速存储运算结果以及一些常用数据的存储设备,有读\写两种功能,为正确读写数据并且尽可能使CPU实际性能提示,采用组合逻辑读,时序逻辑写操作。

  4.2.3 SEXT模块

   符号扩展单元(sign extend),负责对risv-v指令的“可能”立即数位置所表示的立即数进行符号扩展为32位宽的数据,该行为受CU单元的sext_op信号所控制。

 4.3执行(EXE)

  4.3.1 ALU模块

   ALU是算数逻辑单元,负责CPU内部绝大部分运算任务(所以主频的提高关键跟ALU性能有着偌大的关系),接受前面IF阶段和ID阶段的各类信号以及数据输入,通过CU单元的控制信号选择第一、第二运算数以及运算类型。

 4.4访存(MEM)

  4.4.1 DRAM模块

   DRAM模块是使用vivado平台提供的IP核搭建的模拟主存,读写接口会有所提示。

 4.5写回(WB)

  4.5.1 WB模块

   其实单周期CPU中的写回模块就是一个多路选择器,通过CU单元的控制信号wd_sel决定写回数据的选择,备选的数据有:ALU运算结果,pc值,符号扩展结果imm,主存读取输出ramdout。

 4.6显示(DISPLAY)

  4.6.1 display模块

   此模块是为了实际下板而设立的,主要负责控制开发板上的LED灯,拨码开关和数码管。

 4.7各模块逻辑类型总结

  • 组合逻辑:NPC, IROM, SEXT, CU, ALU, WB
  • 时序逻辑:PC, DRAM, DISPLAY
  • 混合逻辑:RF(逻辑读,时序写)

五、各模块关键代码

 5.1取指(IF)

  5.1.1 PC模块

module PC(
    input                   clk     ,//CPU时钟
    input                   rst     ,//复位信号,高电平有效
    input           [31:0]  npc     ,//NPC模块的npc值
    output  reg     [31:0]  pc		 //PC模块的输出值pc
    );
    always @(posedge clk, posedge rst)
    begin
        if(rst)     pc <= 32'h0ffff_fffc;//方便复位之后的第一个pc将为全0
        else        pc <= npc;			 //不复位时将npc作为pc的新值
    end
endmodule

 

  4.1.2 NPC模块

module NPC(
    input   [31:0]  imm     ,//符号扩展结果
    input   [31:0]  rD1     ,//寄存器的第一输出
    input           pc_sel  ,//来自CU单元,用于分支和跳转指令
    input           npc_op  ,//同pc_sel来源相同
    input   [31:0]  pc      ,
    output  [31:0]  npc
    );
    //npc_op为0时pc+4,为1时有跳转(pc_sel为0时pc + imm,为1时pc = rD1 + imm)
    assign npc = npc_op ? (pc_sel ? rD1 + imm : pc + imm) : pc + 4;
endmodule

 

  5.1.3 IROM模块

module inst_mem(
    input   [15:2]  addr,//是pc信号的部分截取,可以思考一下为什么只需要2~15bit位?
    output  [31:0]  inst //32位risv-v架构的指令
    );
    //program为vivado对应IP核的实例化,大小为16384*32bit
    program U0_irom
    (
        .a  (addr[15:2]),
        .spo
VIP RISC-V— 架构基础知识学习 蜂鸟 E200 系列是一个开源的RISC-V 处理器。蜂鸟 E200 系列由中国大陆研发团队开发,用户能够轻松与开发人员取得交流和支持。RI蜂鸟 E200 处理器研发团队拥有在国际一流公司多年开发处理器的经验,使用稳健的Verilog 2001 语法编写的可综合 RTL 代码,以工业级标准进行开发。蜂鸟 E200 的代码为人工编写,添加丰富的注释且可读性强,非常易于理解。 开通可读全文·1.2w 阅读·10 点赞·34 收藏 阅读全文

相关推荐

数字设计实验:RISC-V指令单周期CPU

本文旨在介绍RISC-V指令单周期CPU的设计思路和仿真实现(含代码)

2401_83740084的博客 2702

Risc-V单周期CPU设计思考

Risc-V单周期CPU设计思考 今年学校课程改革,计算机组成课开始教学Risc-V,写单周期CPU的时候发现网上好像大多都是MIPS的CPU设计,所以就把自己关于设计Verilog的一些思路整理出来。看完同学的设计之后再一次确定了我非常非常菜,本文就仅供参考。(为防影响以后的教学作业,大多数源代码已经隐去、并未将宏等解释性语言加入博客)。 文章目录Risc-V单周期CPU设计思考基础指令集的实现Control模块ImmGen模块ALU Control、ALU(与Comparator)模块Instructi

weixin_46645439的博客 3818

从零认识cpu之RISC-V架构(四)构建一个多周期CPU详细教程(1)

本文章参考书籍:Digital Design and Computer Architecture RISC-V Edition32位RISC-V指令集:因为本文章构建的cpu仅用来学习和理解risc-v架构,因此并没有包括所有指令,仅基于部分指令集。关于指令的含义,可以参照上图。和构建单周期cpu的思路一样,我们将cpu分为数据路径模块和控制单元模块。

weixin_47138614的博客 1961

手把手教你用Verilog实现RISC-V单周期CPU(附斐波那契数列实战)

本文详细介绍了如何使用Verilog语言实现RISC-V单周期CPU,并通过斐波那契数列实战演示其功能。内容涵盖CPU核心架构设计、关键数据通路、Verilog模块实现及调试技巧,适合计算机组成原理学习者和硬件设计爱好者。

h3i4j的博客 711

从零开始:用Xilinx FPGA实现RISC-V单周期CPU(附完整Verilog代码)

本文详细介绍了如何使用Xilinx FPGA从零开始实现RISC-V单周期CPU,包括开发环境搭建、核心架构设计、Verilog代码实现及功能验证。通过实战指南和完整代码示例,帮助开发者掌握RISC-V CPU设计的关键技术,适用于嵌入式系统和定制化计算场景。

weixin_30664051的博客 536

RISC-V单周期CPU实战:从Verilog代码到Vivado仿真的完整指南

本文详细介绍了如何从零开始实现一个支持基础指令集的单周期RISC-V CPU,包括Verilog代码编写、关键模块设计以及Vivado仿真验证的全过程。通过实战案例,帮助读者深入理解CPU工作原理和RISC-V指令集架构,为后续性能优化和功能扩展奠定基础。

weixin_29176179的博客 463

RISC-V内核的32位微控制器设计与Verilog实现:从原理到代码的完整指南

RISC-V(读作“risk-five”)是一个开放的指令集架构(ISA),它是为各种计算设备设计的,从微控制器到超级计算机。为了给大家一个直观的了解,我们将从零开始设计一个简单的RISC-V 32位微控制器,并使用Verilog进行实现。的模块,它模拟了时钟信号和重置信号,并实例化了我们的微控制器。的模块,它接受一个7位的操作码作为输入,并输出是否读取寄存器、是否写入寄存器和ALU操作类型。的模块,它接受两个32位的操作数和一个3位的操作类型作为输入,并输出一个32位的结果。首先,我们来实现寄存器文件。

qq_38334677的博客 1001

基于RISC-V的单周期CPU设计

本文介绍支持45条RISC-V指令的单周期CPU设计,涵盖数据通路、控制单元、ALU与寄存器文件等核心模块,强调教学实践中对计算机体系结构的深入理解,通过Verilog实现与仿真帮助学生掌握指令执行流程与硬件协同机制。

css33的专栏 1212

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5061

HEVC/VVC中R-Lambda码率控制算法原理

文章目录1. 比特分配1.1 GOP级比特分配1.2 帧级比特分配1.3 LCU级比特分配2. 码率控制2.1 λ的计算和更新2.2 参数QP的确定 VVC中码率控制算法沿用了HEVC中经典的R-λ码率控制模型,R-λ由中科大的李斌博士提出(详情参考JCTVC-K0103)。R-λ模型的基础为视频编码中 R(比特 bpp)和 D(失真 MSE)之间的双曲线模型,即 D(R)=CR−KD(R) = ...

Aidoneus_y 6130

交流异步机VVVF变频控制simulink/matlab仿真分析

VVVF,是Variable Voltage and Variable Frequency的缩写, 意为:可变电压、可变频率,也就是变频调速系统。 VVVF控制的逆变器连接电机,通过同时改变频率和电压,达到磁通恒定(可以用反电势/频率近似表征)和控制电机转速(和频率成正比)的目的,所以多应用在变频器中,属于工业自动化领域。

Ezekiel_Mok的博客 4194

基于BQ24610的24V电池充电板

转自我的博客 本文的主要目的在于传播基本的阅读datasheet的能力,以及PCB设计需要注意的基本问题。 本次需要设计的是24V动力锂电池充电电路。 原理图设计 参考官方参考电路 为了快速设计电路,自然是参考官方参考电路,选择Typical Application。 做细微的参数调整 由于我们的需求是给24V的电池充电,所以需要稍微修改一下原理图,接下来需...

greedyhao的博客 1万+

深度学习部署工程师--8(docker+TensorRT部署到推理+yolo人体检测)下

本文介绍了YOLOv5模型通过TensorRT加速部署的流程。首先需要检查磁盘空间,确保有30GB可用。文章对比了不同推理方式的性能:int8量化+TensorRT可达200FPS,纯TensorRT为166FPS,CUDA为147FPS,CPU为93FPS。重点讲解了将YOLOv5模型导出为ONNX格式的详细步骤,包括修改Detect类的forward方法以移除decode运算,使用git patch批量修改代码,安装必要的依赖库,以及通过onnx-graphsurgeon工具修改ONNX图结构。最终目标

FJN110的博客 483

Unity实战篇 | 教你怎样将Unity的启动Logo 设置成 自己制作的 帧动画

上一篇文章我们讲了怎样在不购买专业版的情况下自定义Unity的启动Logo。 那本篇文章就来介绍一下,怎样在去除默认Logo的前提下制作自己的启动动画!

努力前行,总会成为自己心中的那道光 6万+

TC397 EB MCAL开发从0开始系列 之 [13.1] Dma配置实战 -实现M2M数据传输(读存储写存储)

TC3XX TC397 MCAL DMA 从0搭建测试用例-实现M2M 存储到存储数据传输

yy九歌的博客 1902

TensorRT量化校准数据集选择

在TensorRT中进行INT8量化时,校准数据集的选择至关重要,直接影响量化后模型的精度和推理性能。这是一个典型的问题。

浩瀚之水的专栏 492

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

下一篇: 用Verilog搭建RISC-V架构流水线CPU

双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —
LYZ832
博客等级 码龄7年 39粉丝 10原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值