RISC-V单板计算机模拟和FPGA板多核IP实现

这篇具有很好参考价值的文章主要介绍了RISC-V单板计算机模拟和FPGA板多核IP实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎯要点

  1. 🎯使用单板计算机 Visionfive 2 或模拟器测试RISC-V汇编
  2. 🎯RISC-V汇编加载和算术。🎯使用GNU MAKE汇编RISC-V指令,ESP32使用CMake编译执行指令。🎯RISC-V汇编功能和使用释义:控制指令,内存管理,功能块和堆栈。
  3. 🎯 使用RISC-V汇编代码控制GPIO。🎯RISC-V汇编指令嵌入C 代码,C代码调用汇编指令控制,Python代码调用RISC-V汇编指令。🎯RISC-V数学计算汇编指令,矩阵乘法示例。🎯使用模拟器测试RISC-V浮点运算。🎯RISC-V汇编代码优化,使用渗透工具将RISC-V汇编和C 代码之间关系。
  4. 🎯ESP32-C3使用RISC-V 汇编:安装RISC-V模拟器编译调试。🎯 C代码和RISC-V汇编示例1:32位整数累加。🎯C代码和RISC-V汇编示例2:控制LED闪烁🎯C代码和RISC-V汇编示例3:奇校验。🎯C代码和RISC-V汇编示例4:加载和存储。🎯C代码和RISC-V汇编示例5:摄氏度数据。🎯C代码和RISC-V汇编示例6:调用程序指令。🎯C代码和RISC-V汇编示例7:程序流控制。🎯C代码和RISC-V汇编示例8:算术运算。🎯C代码和RISC-V汇编示例9:乘法除法。🎯C代码和RISC-V汇编示例10:寻址、下标和字符串。🎯C代码和RISC-V汇编示例11:浮点处理。🎯C代码和RISC-V汇编示例12:使用GCC处理测试代码。🎯C代码和RISC-V汇编示例13:控制拓展。🎯C代码和RISC-V汇编示例14:内嵌汇编。
    5.🎯安装FPGA开发工具HLS和IDE,创建和模拟IP。
    1. 🎯安装和使用RISC-V工具链,模拟器/调试器,调试C代码示例。🎯RV32I(RISC-V)汇编示例,C代码和汇编代码。
    2. 🎯更新程序计数器的路径C++代码:顶层函数原型,读取内存数组函数,执行函数,IP运行条件函数,使用测试平台进行 IP 仿真,FPGA开发板测试IP,构建 RISC-V 指令编码,填充执行阶段构建寄存器路径。
    3. 🎯构建RISC-V处理器(C++代码):RV32I 顶层函数,更新指令编码,计算访问地址,使用测试平台模拟RV32I,FPGA开发板测试IP。
    4. 🎯自编汇编代码测试RISC-V处理器,使用RISC-V ISA模拟器测试,在 Rv32I 处理器上运行基准测试套件,使 Rv32I IP 适应 RISC-V F 扩展。
    5. 🎯构建流水线 RISC-V 处理器(C++代码):级间传输类型定义,IP 顶层函数,编码函数,执行函数,IP的仿真与综合,Vivado项目使用该IP,将流水线分为多个阶段。
    6. 🎯使用多周期流水线构建 RISC-V 处理器(C++代码),使用多个 Hart 流水线构建 RISC-V 处理器,互连 IP ,构建多核RISC-V处理器,使用 Multihart 内核的多核 RISC-V 处理器,开发板使用RISC-V处理器。

🍇RISC-V汇编

输入Doubler

您应该知道,RISC-V 函数的输入位于寄存器 a0、a1 至 a7 中。这些只是从 x10 开始的寄存器的别名。

doubler:
   ADD a0, a0, a0

为了测试这一点,请在模拟器中运行代码之前在寄存器 a0 中放置一个初始值。如果有效,那么 a0 应该加倍。函数应该在 a0 中返回结果,所以这是正确的方法。

如果这是从其他地方调用的真实函数,我们将需要在最后一行从函数返回:

JALR zero, ra, 0

通常RISC-V汇编器会有一条伪指令RET来实现这一点。

该指令如何运作?在真实的程序中,我们以 42 作为参数调用的倍增函数必须写成这样:

ADDI a0, zero, 42
JAL ra, doubler
SUB t3, t4, t2

这意味着返回地址存储在 ra (x1) 寄存器中,因此当 doubler 返回时,它开始执行 SUB t3、t4、t2 指令。这意味着什么?只是我放在那里的任意指令。

乘八

这次我要你将 input 的输入乘以 8。基本 RISC-V ISA 没有乘法指令,我们使用的解释器没有任何支持除法和乘法的 RISC-V M 扩展。

加法

从概念上讲,乘法只是重复加法,所以这可能是最明显的解决方案:

eight_times:
   ADD a0, a0, a0
   ADD a0, a0, a0
   ADD a0, a0, a0
   HLT              # Stop execution

使用逻辑移位

在二进制数系统中,将所有数字向左移动一位与乘以二相同。移动两个位置就像乘以四。

010b = 2
010b << 1 = 100b = 4
001b << 2 = 100b

在 RISC-V 汇编中,我们使用 SLLI 和 SLL 执行左移。 I 后缀表示我们使用立即值而不是寄存器来指定要移位的位置数。

eight_times:
   SLLI a0,   a0, 3
   JALR zero, ra, 0
   HTL                # Stop excution. Normally you put RET

寻找最大值

这是公共函数 c = max(a, b) 的实现,它将 a 或 b 中较大的值分配给 c。要解决这个问题需要使用跳转和分支指令。有关如何将值从一个寄存器移动到另一个寄存器的提示是,您可以使用 ADD 或 ADDI 指令。

普通的 RISC-V 汇编代码有一个称为 MV 的伪指令,我们在这里无法访问它,但以下这两行是等效的:

MV a4, a3
ADDI a4, a3, 0

查看下面的解决方法:

max:
   BLT a0, a1, second   # if a0 < a1 then a1 is larger
   JAL zero, done
second:
   ADD a0, zero, a1     # make a1 the return value
done:
    HLT                 # normally a RET would be here

如果你没搞清楚这一点。您可以尝试实现 min 函数。

简单乘数

我们不用与固定数字相乘,而是将两个任意数字相乘。 在这种情况下,您可以仅使用添加和分支。 它不需要是高效的。 该函数将 a0 和 a1 中的两个参数相乘,并像往常一样在 a0 中返回结果。

multiply:
  ADD  t0, zero, zero
  ADDI a1, a1, -1
accumulate:
  ADD  t0, t0, a0
  ADDI a1, a1, -1
  BGE  a1, zero, accumulate
  ADD  a0, zero, t0
  HLT

由于我们的解释器缺少大量 RISC-V 指令,因此它的长度稍长,可读性也较差。

multiply:
  LI   t0, 0         # set t0 to 0
accumulate:
  ADD  t0, t0, a0
  ADDI a1, a1, -1      # decrement a1
  BGT  a1, zero, accumulate
  MV  a0, t0           # copy t0 value to a0
  RET                  # return to calling function

快速乘法

当乘法在软件中实现时,我们上面使用的方法没有被使用,因为这太慢了。相反,使用了添加和移位的组合。比如执行 42 × 20,只需两次加法,而不是二十次加法。您可以使用左移 SLL 或 SLLI 以及右移 SRA 和 SRAI。文章来源地址https://www.toymoban.com/news/detail-849230.html

fast_multiply:
   ADD  t0, zero, zero      # to keep track of result
   
next_digit:
   ANDI t1, a1, 1           # is rightmost bit 1?
   SRAI a1, a1, 1
   
   BEQ  t1, zero, skip      # if right most bit 0, don't add
   ADD  t0, t0, a0
skip:
   SLLI a0, a0, 1           # double first argument
   BNE  a1, zero, next_digit
   ADD  a0, zero, t0        # move accum result to a0
   HLT
参阅一:计算思维
参阅二:亚图跨际

到了这里,关于RISC-V单板计算机模拟和FPGA板多核IP实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 计算机系统基础(六)之RISC-V流水线设计——用ChatGPT辅助学习

    计算机系统基础(六)之RISC-V流水线设计——用ChatGPT辅助学习

    一、CPU的流水线通常被划分为五个部分,它们是: 取指令(Instruction Fetch):从内存中获取指令并将其放入指令寄存器中。 指令译码(Instruction Decode):将指令从指令寄存器中读取并解码成相应的操作。 执行指令(Execution):根据操作码执行指令,可能需要读取寄存器或内

    2024年02月03日
    浏览(9)
  • 在FPGA上运行轻量级Linux系统的RISC-V内核 FPGA开发

    随着嵌入式系统的发展,FPGA(现场可编程门阵列)在实现高性能和灵活性方面发挥着重要作用。RISC-V是一种基于开放指令集架构(ISA)的处理器架构,它在嵌入式系统中越来越受欢迎。本文将介绍如何在FPGA上实现一个轻量级Linux系统,其中包括RISC-V内核的开发。 为了在FPGA上

    2024年02月04日
    浏览(11)
  • 使用 C++23 从零实现 RISC-V 模拟器(5):CSR

    👉🏻 文章汇总「从零实现模拟器、操作系统、数据库、编译器…」:https://okaitserrj.feishu.cn/docx/R4tCdkEbsoFGnuxbho4cgW2Yntc RISC-V为每个hart定义了一个独立的控制状态寄存器(CSR)地址空间,提供了4096个独立的寄存器位置。每个hart都可以通过这个独立的CSR地址空间来配置、管理和

    2024年02月19日
    浏览(9)
  • 使用 C++23 从零实现 RISC-V 模拟器(6):权限支持

    本节内容增加了权限表示,设置了三种权限。当 cpu 初始化时默认的权限为 Machine 模式。接下来实现这三种特权模式,随后实现 sret 和 mret 指令。 RISC-V定义了三种特权等级,分别是用户态(User Mode)、监管态(Supervisor Mode)、和机器态(Machine Mode)。这三种特权等级对应着不

    2024年02月20日
    浏览(11)
  • 【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

    【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

    实验板卡 :xc7a100tlc sg324-2L,共20个开关 实验要求:          

    2024年02月16日
    浏览(15)
  • 使用 C++23 从零实现 RISC-V 模拟器(1):最简CPU

    👉🏻 文章汇总「从零实现模拟器、操作系统、数据库、编译器…」:https://okaitserrj.feishu.cn/docx/R4tCdkEbsoFGnuxbho4cgW2Yntc 本节实现一个最简的 CPU ,最终能够解析 add 和 addi 两个指令。如果对计算机组成原理已经有所了解可以跳过下面的内容直接看代码实现。 完整代码在这个分支

    2024年02月20日
    浏览(11)
  • 【risc-v】易灵思efinix FPGA riscv嵌入式软件源码分享

    【risc-v】易灵思efinix FPGA riscv嵌入式软件源码分享

    分享一些fpga内使用riscv软核的经验,共大家参考。后续内容比较多,会做成一个系列。 本系列会覆盖以下FPGA厂商  易灵思 efinix  赛灵思 xilinx  阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 【risc-v】易灵思efinix FPGA sapphire_soc IP配置参数分享-CSDN博客 【risc-v】易灵思

    2024年01月19日
    浏览(36)
  • 在x86下运行的Ubuntu系统上部署QEMU用于模拟RISC-V硬件系统

    在x86下运行的Ubuntu系统上部署QEMU用于模拟RISC-V硬件系统

    下载地址: 建议选择stable版本,arch选择riscv64-lp64d,libc选择常用的glibc。 下载后解压,然后将bin目录加入PATH环境变量中。 下载地址: 建议选择稳定版本,下载后解压,然后make --enable-virtfs 用户虚拟机和宿主机之间共享文件 Linux内核下载地址: 选择稳定的版本,下载完后解

    2024年02月13日
    浏览(13)
  • 使用 C++23 从零实现 RISC-V 模拟器(4):完善 log 支持并支持更多指令

    👉🏻 文章汇总「从零实现模拟器、操作系统、数据库、编译器…」:https://okaitserrj.feishu.cn/docx/R4tCdkEbsoFGnuxbho4cgW2Yntc 这一节内容解析了更多的指令,并且提供了更详细的 log 输出从而进一步的定位问题。 具体代码可以参考这个分支的代码:https://github.com/weijiew/crvemu/tree/lab4

    2024年02月20日
    浏览(9)
  • 【RISC-V】RISC-V寄存器

    【RISC-V】RISC-V寄存器

    寄存器 别名 全称 说明 X0 zero 零寄存器 可做源寄存器(rs)或目标寄存器(rd) X1 ra 链接寄存器 保存函数返回地址 X2 sp 栈指针寄存器 指向栈的地址 X3 gp 全局寄存器 用于链接器松弛优化 X4 tp 线程寄存器 常用于在OS中保存指向进程控制块(task_struct)数据结构的指针 X5 ~ X7 X28 ~ X31 t0

    2024年02月10日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包