当前位置: 首页 > news >正文

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, a0ADD a0, a0, a0ADD a0, a0, a0HLT              # Stop execution

使用逻辑移位

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

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

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

eight_times:SLLI a0,   a0, 3JALR zero, ra, 0HTL                # 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 largerJAL 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, zeroADDI a1, a1, -1
accumulate:ADD  t0, t0, a0ADDI a1, a1, -1BGE  a1, zero, accumulateADD  a0, zero, t0HLT

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

multiply:LI   t0, 0         # set t0 to 0
accumulate:ADD  t0, t0, a0ADDI a1, a1, -1      # decrement a1BGT  a1, zero, accumulateMV  a0, t0           # copy t0 value to a0RET                  # return to calling function

快速乘法

当乘法在软件中实现时,我们上面使用的方法没有被使用,因为这太慢了。相反,使用了添加和移位的组合。比如执行 42 × 20,只需两次加法,而不是二十次加法。您可以使用左移 SLL 或 SLLI 以及右移 SRA 和 SRAI。

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

相关文章:

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

&#x1f3af;要点 &#x1f3af;使用单板计算机 Visionfive 2 或模拟器测试RISC-V汇编&#x1f3af;RISC-V汇编加载和算术。&#x1f3af;使用GNU MAKE汇编RISC-V指令&#xff0c;ESP32使用CMake编译执行指令。&#x1f3af;RISC-V汇编功能和使用释义&#xff1a;控制指令&am…...

Mojo编程语言案例及介绍

Mojo是一种新兴的编程语言&#xff0c;它结合了现代编程范式与简洁易读的语法&#xff0c;为开发者提供了一个强大且高效的开发工具。以下将详细介绍Mojo编程语言的特性&#xff0c;并通过一个实际案例来展示Mojo的应用。 一、Mojo编程语言介绍 Mojo编程语言的设计理念是“简单…...

【Python面试题收录】Python中有哪些方法交换两个变量的值?至少给出三种方法。

一、使用临时变量 # 定义原始变量 a 10 b 20# 直接交换&#xff0c;Python会一次性执行两个赋值操作 a, b b, a# 无需额外变量&#xff0c;a 和 b 的值已经交换 print(a) # 输出: 20 print(b) # 输出: 10 二、利用元组解包特性&#xff08;不使用临时变量&#xff0c;推荐…...

MySQL核心命令详解与实战,一文掌握MySQL使用

文章目录 文章简介演示库表创建数据库表选择数据库删除数据库创建表删除表向表中插入数据更新数据删除数据查询数据WHERE 操作符聚合函数LIKE 子句分组 GROUP BY HAVINGORDER BY(排序) 语句LIMIT 操作符 分页查询多表查询-联合查询 UNION 操作符多表查询-连接的使用-JOIN语句编…...

基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; 管理员信息属性 &#x1f4ac; 学生信息实体属性 &#x1f4ac; 宿舍安排信息实体属性 &#x1f4ac; 卫生检查信息实体属性 &…...

vulnhub pWnOS v2.0通关

知识点总结&#xff1a; 1.通过模块来寻找漏洞 2.msf查找漏洞 3.通过网站源代码&#xff0c;查看模块信息 环境准备 攻击机&#xff1a;kali2023 靶机&#xff1a;pWnOS v2.0 安装地址&#xff1a;pWnOS: 2.0 (Pre-Release) ~ VulnHub 在安装网址中看到&#xff0c;该靶…...

leetcode热题100.数据流的中位数

作者&#xff1a;晓宜 &#x1f308;&#x1f308;&#x1f308; 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 ❤️❤️❤️ 你的关注是我前进的动力&#x1f60a; Problem: 295. 数据流的中位数…...

C 从函数返回指针

我们已经了解了 C 语言中如何从函数返回数组&#xff0c;类似地&#xff0c;C 允许您从函数返回指针。为了做到这点&#xff0c;您必须声明一个返回指针的函数&#xff0c;如下所示&#xff1a; int * myFunction() { . . . }另外&#xff0c;C 语言不支持在调用函数时返回局部…...

(文章复现)考虑分布式电源不确定性的配电网鲁棒动态重构

参考文献&#xff1a; [1]徐俊俊,吴在军,周力,等.考虑分布式电源不确定性的配电网鲁棒动态重构[J].中国电机工程学报,2018,38(16):4715-47254976. 1.摘要 间歇性分布式电源并网使得配电网网络重构过程需要考虑更多的不确定因素。在利用仿射数对分布式电源出力的不确定性进行合…...

蓝桥杯第八届c++大学B组详解

目录 1.购物单 2.等差素数列 3.承压计算 4.方格分割 5.日期问题 6.包子凑数 7.全球变暖 8.k倍区间 1.购物单 题目解析&#xff1a;就是将折扣字符串转化为数字&#xff0c;进行相加求和。 #include<iostream> #include<string> #include<cmath> usin…...

小于n的最大数 Leetcode 902 Numbers At Most N Given Digit Set

这两个问题的本质就是一个棵树&#xff0c;然后根据n对树做剪枝。难点在于剪的时候边界条件有些坑&#xff0c;get_lower_largest_digit_dic是这两个题目的共同点 题目一&#xff1a; 小于n的最大数 算法题目&#xff1a;小于n的最大数 问题描述&#xff1a;给一个数组nums[5…...

Leetcode刷题-数组(二分法、双指针法、窗口滑动)

数组 1、二分法 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 需要注意区间的问题。首先在最外面的循环判断条件是left<right。那就说明我们区间规定的范围就是【left,right】 属于是左闭右闭&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…...

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)

继续上篇博文&#xff1a;STM32学习和实践笔记&#xff08;4&#xff09;: 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-CSDN博客 往下写&#xff0c; 为什么&#xff1a;当GPIO_InitStructure.GPIO_PinGPIO_Pin_0 ; 时&#xff0c;其实就是将对应的该引脚的寄存器地…...

数据仓库——事实表

数据仓库基础笔记思维导图已经整理完毕&#xff0c;完整连接为&#xff1a; 数据仓库基础知识笔记思维导图 事实表 事务事实表 事务事实表用于跟踪事件&#xff0c;通过存储事实和与之关联的维度细节&#xff0c;允许单独或聚集地研究行为。粒度稀疏性包含可加事实 无事实的…...

人工智能常用的编程语言有哪些?

人工智能常用的编程语言包括Python、Java、C、R、Lisp和Prolog等。具体选择取决于项目需求、技术背景和性能要求。 Python是AI领域的明星语言&#xff0c;由于其简洁易懂的语法、丰富的库支持以及庞大的社区资源&#xff0c;适用于机器学习、深度学习和自然语言处理等领域。 …...

【Leetcode每日一题】模拟 - 提莫攻击(难度⭐)(45)

1. 题目解析 题目链接&#xff1a;495. 提莫攻击 2.算法原理 一、分情况讨论 要计算中毒的总时长&#xff0c;我们需要考虑时间点之间的差值&#xff0c;并根据这些差值来确定中毒的实际持续时间。 情况一&#xff1a;差值大于等于中毒时间 假设你的角色在时间点A中毒&#…...

OPPO云VPC网络实践

1 OPPO 云网络现状 随着OPPO业务的快速发展&#xff0c;OPPO云规模增长迅速。大规模虚拟实例的弹性伸缩、低延时需求对网络提出了诸多挑战。原有基于VLAN搭建的私有网络无法解决这些问题&#xff0c;给网络运维和业务的快速上线带来了挑战。 梳理存在的主要问题如下&#xf…...

力扣(数组)找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输出&#xff1a;[5,6]示例 2&am…...

每日面经分享(Spring Boot: part3 Service层)

SpringBoot Service层的作用 a. 封装业务逻辑&#xff1a;Service层负责封装应用程序的业务逻辑。Service层是控制器&#xff08;Controller&#xff09;和数据访问对象&#xff08;DAO&#xff09;之间的中间层&#xff0c;负责处理业务规则和业务流程。通过将业务逻辑封装在S…...

k8s的pod访问service的方式

背景 在k8s中容器访问某个service服务时有两种方式&#xff0c;一种是把每个要访问的service的ip注入到客户端pod的环境变量中&#xff0c;另一种是客户端pod先通过DNS服务器查找对应service的ip地址&#xff0c;然后在通过这个service ip地址访问对应的service服务 pod客户端…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

使用python进行图像处理—图像滤波(5)

图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值&#xff0c;以达到平滑&#xff08;去噪&#xff09;、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算&#xff0c;…...