当前位置: 首页 > 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客户端…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...