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. 🎯编译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。

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
参阅:亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/499719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS实战开发-实现UIAbility内和UIAbility间页面的跳转

介绍 本篇Codelab基于Stage模型下的UIAbility开发&#xff0c;实现UIAbility内和UIAbility间页面的跳转。包含如下功能&#xff1a; UIAbility内页面的跳转。跳转到指定UIAbility的首页。跳转到指定UIAbility的指定页面&#xff08;非首页&#xff09;。 最终效果图如下&…

新数据显示,寻求博士后职位的美国科学家越来越少

戈罗登科夫/盖蒂图片社 美国国家科学基金会&#xff08;NSF&#xff09;发布的新数据显示&#xff0c;美国公民从事博士后工作的人数急剧下降&#xff0c;特别是在生物和生物医学科学领域。这一趋势凸显了人们对学术界正面临博士后短缺的担忧&#xff0c;以及早期职业科学家越来…

PPP、RRE、MGRE综合实验

一、实验拓扑图 二、实验要求 1.R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址&#xff1b; 2.R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方: R2与R5之间使用ppp的CHAP认证&#xff0c; R5为主认证方;R3与R5之间使用HDLC封装; 3.R1、R2、…

Python:执行py命令,提示: Can‘t find a default Python.

1.Python运行环境罢工 今天&#xff0c;要运行一个前年用python编写的爬虫程序&#xff0c;先检测python运行环境是否正常&#xff1a; D:\Python38-32\works>c:\windows\py.exe Cant find a default Python. 再试&#xff1a; D:\Python38-32\works>py --list Installe…

Keepalived+MySQL简单搭建实现数据库高可用

需求&#xff1a;想要实现当MySQL服务挂了之后&#xff0c;能够自动切换到另一台&#xff0c;不对当前服务造成过多影响。查找了很多实现数据库高可用方案&#xff0c;比较常见的有MHA&#xff08;至少三台&#xff0c;一主多从&#xff09;、开源数据库中间件&#xff08;Myca…

浅试Kimi

最近KIMI大模型挺火的&#xff0c;擅长处理中文文本&#xff0c;咱也来试试吧&#xff01; 测试问题&#xff1a; 写一篇800字以上的短片小说&#xff1a;主要故事是以一位上进但其他方面表现平平的大男孩小贱&#xff0c;刚到公司不久&#xff0c;就被一位名叫大弟的女同事看…

量化交易入门(二十八)什么是布林带,量化中怎么使用

什么叫布林带 布林带&#xff08;Bollinger Bands&#xff09;是一种常用的技术分析指标&#xff0c;由约翰布林&#xff08;John Bollinger&#xff09;于20世纪80年代开发。它由三条线组成&#xff1a;中轨&#xff08;通常为20日移动平均线&#xff09;、上轨&#xff08;中…

python编程软件有什么

Python开发软件可根据其用途不同分为两种&#xff0c;一种是Python代码编辑器&#xff0c;一种是Python集成开发工具&#xff0c;两者的配合使用可以极大的提高Python开发人员的编程效率&#xff0c;以下是常用的几款Python代码编辑器和Python集成开发工具。 一、Python代码编…

嵌入式linux学习之交叉编译器安装

交叉编译器介绍 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;在 Liux 进行 C 语言开发里面使用 GCC 编译器进行代码编译&#xff0c;但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编…

深入理解Java接口:定义、使用与重要性(day13)

导语&#xff1a;Java接口是Java编程语言中的一个核心概念&#xff0c;它提供了一种定义方法但不包含方法实现的方式。接口在Java编程中扮演着重要角色&#xff0c;能够帮助我们实现代码的高内聚、低耦合&#xff0c;提高代码的复用性和可维护性。本文将详细介绍Java接口的定义…

python练习四

1. 求一个十进制的数值的二进制的0、1的个数 def count_binary_ones(n):binary_str bin(n)[2:] # 转换为二进制字符串&#xff0c;去除前缀0bprint(f"{n} 的二进制为: {binary_str}")return binary_str.count(0), binary_str.count(1) n int(input("输入一个…

Python车道线偏离预警

程序示例精选 Python车道线偏离预警 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python车道线偏离预警》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推…

memcached缓存数据库简介

memcached是一套分布式的高速缓存系统&#xff0c;由LiveJournal的Brad Fitzpatrick开发&#xff0c;但被许多网站使用。这是一套开放源代码软件&#xff0c;以BSD license授权发布。 memcached缺乏认证以及安全管制&#xff0c;这代表应该将memcached服务器放置在防火墙后。 …

自建机房私有云吗?

大家好&#xff0c;我是小码哥&#xff0c;之前一种有没搞清楚公有云、私有云的概念&#xff0c;今天算是弄清楚了&#xff0c;这里给大家分享一下公有云、私有云的区别&#xff0c;以及自建机房算不算私有云&#xff01; 其实私有云&#xff08;Private Cloud&#xff09;和公…

快排(六大排序)

快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所…

个人简历主页搭建系列-05:部署至 Github

前面只是本地成功部署网站&#xff0c;网站运行的时候我们可以通过 localhost: port 进行访问。不过其他人是无法访问我们本机部署的网站的。 接下来通过 Github Pages 服务把网站部署上去&#xff0c;这样大家都可以通过特定域名访问我的网站了&#xff01; 创建要部署的仓库…

Spring 源码调试错误修复

Spring 源码调试错误修复 文章目录 Spring 源码调试错误修复1. fatal: not a git repository (or any of the parent directories): .git问题描述解决方案 2. fatal: Needed a single revision问题描述解决方案 1. fatal: not a git repository (or any of the parent director…

14.Java为什么这么火、Java主要特性

文章目录 一、Java为什么这么火&#xff1f;二、Java主要特性 一、Java为什么这么火&#xff1f; 一个语言火不火、能不能长久的生存下去&#xff0c;主要其实是看四个方面 1、用户量&#xff1a;使用的程序员多不多。 不管在国内&#xff0c;还是在国外&#xff0c;使用Jav…

ASCII查询

最近踩的字符坑有点多&#xff0c;自己写了个ASCII查询&#xff0c;不用求人了。 <html> <head> <title>ASCII码查询</title> <style> table { border-collapse:collapse; } th, td { border:1px solid black; padding:10px; text-align:center;…

Java基础之算数运算符的初级用法

运算符 运算符: 对字面量或者变量进行操作的符号 表达式: 用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式 不同运算符连接的表达式体现的是不同类型的表达式 一 .算数运算符 实践一下 加 减 乘 运行结果: 除 取模 运行结果 练习: 数值拆分 需求…