An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考:
👉 1️⃣ 原始工程
👉 2️⃣ 原始工程复现教程
👉 3️⃣ RISCV工具链安装教程

1.准备工作

👇下面以LOCATION代表本地源存储库的安装目录,以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗

  • 下载Vivado2017.4
      由于最初的源工程是利用Vivado2017.4来创建的,可能也有一些方法可以在其他版本打开,但没有原始工程的xpr文件,所以下载了一个Vivado2017.4,网上的安装教程很多。

  • 下载两个源存储库:

git clone https://github.com/drichmond/RISC-V-On-PYNQ

  其中,RISC-V-On-PYNQ中的Picrov32是以子模块的形式链接在仓库中,需要通过下面的链接下载后再传入RISC-V-On-PYNQ中相应的位置。

https://github.com/YosysHQ/picorv32/tree/9b6ea045f9b539b0f708d71962716e5dde865181

  或者可以通过下面的命令直接递归下载子文件夹👇

git clone --recursive https://github.com/drichmond/RISC-V-On-PYNQ

  最后RISC-V-On-PYNQ中的目录结构应如下图所示

git clone --recursive https://github.com/riscv/riscv-gnu-toolchain \home\xilinx\riscv-gnu-toolchain

  此为RISC-V工具链,在下载过程中可能会遇到以下报错:

  单纯的网络连接不稳定,可以网页开个github试下,什么时候能打开了,这边也就通了。
  若报错Git 客户端无法验证服务器证书的有效性,因此无法建立与服务器的安全连接,可以使用以下命令来配置 Git 客户端:

git config --global http.sslVerify false
git config --global https.sslVerify false

  以及如果网络一直不太好的话,据说有这个方法可以通过增加缓存大小来提速(因为没有对比测试过,所以我也不太确定这个有没有大用つ﹏⊂

git config --global http.postBuffer 524288000

  再如果说,一直出现各种报错的话,可以将本工程文件中主目录下的makefile文件通过WinSCP传入PYNQ-Z2,并在相应目录下执行👇

make download-tools

  此为自动下载的脚本,来源于Picorv32工程,可以判断目录下的递归文件夹是否安装,但也会由于网络连接问题重开,如果说网络问题是在无法解决,gitee上据说有相应的库,可能会好一些。

2.生成RISC-V处理器比特流
  • 将Picrov32封装成为Vivado IP:

  使用Vivado 2017.4创建一个工程:

Project name: picorv32_prj
Project location: LOCATION/RISC-V-On-PYNQ/ip/
Project Type: RTL Project
Source files: picorv32.v LOCATION/RISC-V-On-PYNQ/picorv32
Constraint files: None
parts: xc7z020clg400-1

  将自定义接口IP添加到Vivado工程:Flow Navigator->PROJECT MANAGER->Settings

  将该工程封装为IP核:Tools -> Create and Package New IP…

Packaging Options: Package your current project
IP location: LOCATION/RISC-V-On-PYNQ/ip/picorv32_tut

  Identification:

Vendor: cliffordwolf
Library: ip
Name: picorv32_tut
Display name: PicoRV32 Processor with AXI Interface(Tutorial Version)
Vendor display name: PicoRV32 Processor with AXI Interface(Tutorial Version)

  Customization Parameters:
  就所有参数值的格式均改为bool,并按照图中所示的值对参数值进行修改

  Ports and Interfaces:
  右键mem_axi->Edit Interface

**General:**Interface Definition: aximm_rtl
**Port Mapping:**AWADDR - mem_axi_awaddrAWPROT - mem_axi_awprotAWVALID - mem_axi_awvalidAWREADY - mem_axi_awreadyWDATA - mem_axi_wdataWSTRB - mem_axi_wstrbWVALID - mem_axi_wvalidWREADY - mem_axi_wreadyBVALID - mem_axi_bvalidBREADY - mem_axi_breadyARADDR - mem_axi_araddrARPROT - mem_axi_arprotARVALID - mem_axi_arvalidARREADY - mem_axi_arreadyRDATA - mem_axi_rdataRVALID - mem_axi_rvalidRREADY - mem_axi_rready

  Addressing and Memory:
  运行Addressing and Memory Map Wizard,选择mem_axi,相关设置如下图所示👇

  Review and Package:
  点击Package IP即可。

  • 为PYNQ-Z2创建RISC-V比特流:

  将LOCATION/RISC-V-On-PYNQ/riscvonpynq/目录下的PYNQ-Z1.xdc文件的72,73行改为如下:

set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports arduino_iic_scl_io]
set_property -dict {PACKAGE_PIN P16 IOSTANDARD LVCMOS33} [get_ports arduino_iic_sda_io]

  在目录LOCATION/RISC-V-On-PYNQ下右键打开MobaXterm,执行以下命令:

make synth
vivado  tutorial/tutorial.xpr

  若报错没有make命令,则可 a p t − g e t apt-get aptget m a k e make make进行安装;
  若报错没有vivado命令,则是由于未将Vivado添加到环境变量中,找到Vivado的安装目录下的bin目录,按下图所示添加到环境变量中,

  Win+R打开cmd,输入 v i v a d o vivado vivado − v e r s i o n -version version检查环境变量是否配置成功,成功则有如下显示👇

  执行上面的第一条命令,vivado将进行创建工程并综合,综合结果如下👇,即可输入第二条命令打开工程

  执行命令完成后将打开tutorial.xpr工程,打开其中的tutorial.bd文件

  双击tutorialProcessor

   点击+号 , 将PicoRV32 Processor with AXI Interface (Tutorial Version) IP添加进去:

  双击端口mem_axi,修改其频率为50000000

  并按照下图连线:

  进入Address Editor窗口,分配地址映射:

  右击tutorialProcessor/riscvBramController->Assign Address

Offset Address: 0x0000_0000
High Address: 0x0000_FFFF

  运行Tools-Validate Design,提示有warning直接跳过

  点击Generate Bitstream生成比特流文件,文件位置为: / t u t / t u t o r i a l / t u t o r i a l . r u n s / i m p l _ 1 /tut/tutorial/tutorial.runs/impl\_1 /tut/tutorial/tutorial.runs/impl_1,将tutorial_wrapper.bit文件转移到tut目录下,并改名为tutorial.bit

  点击File->Exports…->Export Block Design,导出设计到tcl文件中并覆盖之前的文件,同时需确保Automatically create top design没有被勾选

  将操作完成的整个工程放到PYNQ-Z2的home/xilinx目录下

3.在PYNQ-Z2上编译RISC-V GCC工具链
  • 工具链的下载:

  在按照官方例程进行下载时,出现了很多的报错问题,反复尝试了很多次都未能解决,而且经常由于网络连接问题而重开。
  最终在上面的参考博客中找到了整个工具链的自动安装脚本,即工程主目录下的Makefile文件
  在目标安装目录下执行命令👇

make download-tools

  便开始了漫长的下载过程,期间在安装完一个子模块后可能会卡住然后报错,这种情况绝大多数是因为网络原因造成的,如果失败了可以再执行一次上述的命令,当一个子模块安装好,重新执行命令时会自动跳过安装好的模块,继续下一个模块的安装。
  在安装完所有的模块后,执行如下命令👇,便可以构建一个纯RV32IM CPU的完整工具链了

make -j$(nproc) build-riscv32im-tools

  回车后在命令行输入YES即可执行。
  该步骤会等待的时间较长,去问了相关的博主,他们的编译时间大概在1h左右,猜测可能是由于我是通过PYNQ联网的原因,我的执行时间大概在四五个小时左右,过程中最好别碰,一断网那种心碎💔

  编译成功后的界面如下👇

  执行下面语句将编译生成的 o p t / r i s c v 32 i m / b i n opt/riscv32im/bin opt/riscv32im/bin配置到环境变量中,在JupyterNotebook中执行如下代码👇

import os
path = os.environ['PATH'].split()
riscv_path = '/opt/riscv32im/bin'
if(riscv_path not in path):print('Updating /etc/environment file... ',end="")!sed -i 's/PATH=\"\(.*\)\"/PATH=\"\/opt\/riscv32im\/bin:\1\"/' /etc/environmentprint('done')
else:print("/etc/environment file already updated")

  显示 Updating /etc/environment file… done即配置完成。

  重启PYNQ-Z2:

shutdown -r now #如在JupyterNotebook中,前面需要加感叹号!

  重启后确认RISC-V工具链已成功安装

riscv32-unknown=elf-gcc --version

  显示版本号即成功安装

4.测试

  在 h o m e / x i l i n x / R I S C − V − O n − P Y N Q / r i s c v o n p y n q / p i c o r v 32 / t u t / home/xilinx/RISC-V-On-PYNQ/riscvonpynq/picorv32/tut/ home/xilinx/RISCVOnPYNQ/riscvonpynq/picorv32/tut/目录下创建tutorial.py文件,文件内容如下👇

from pynq import Overlay, GPIO, Register
import os
import inspect
from riscvonpynq.Processor import BramProcessor
#--------
class TutorialOverlay(Overlay):"""Overlay driver for the PicoRV32 bram OverlayNote----This class definition must be co-located with the .tcl and .bitfile for the overlay for the search path modifications inriscvonpynq.Overlay to work. __init__ in riscvonpynq.Overlay usesthe path of this file to search for the .bit file using theinspect package."""passclass TutorialProcessor(BramProcessor):"""Hierarchy driver for the PicoRV32 BRAM ProcessorNote----In order to be recognized as a RISC-V Processor hierarchy, threeconditions must be met: First, there must be a PS-Memory-MappedBlock RAM Controller where the name matches the variable_bram. Second, the hierarchy name (fullpath) must equal thevariable _name. Finally, there must be a GPIO port with the name_reset_name.Subclasses of this module are responsible for setting _name (Thename of the Hierarchy), _bits (Processor bit-width), _proc(Processor Type Name)This class must be placed in a known location relative to thebuild files for this processor. The relative path can be modifiedin __get_path."""_name = 'tutorialProcessor'_proc = 'picorv32'_bits = 32@classmethoddef checkhierarchy(cls, description):return super().checkhierarchy(description)def __get_path(self):"""Get the directory path of this file, or the directory path of theclass that inherits from this class."""# Get file path of the current class (i.e. /opt/python3.6/<...>/stream.py)file_path = os.path.abspath(inspect.getfile(inspect.getmodule(self)))# Get directory path of the current class (i.e. /opt/python3.6/<...>/stream/)return os.path.dirname(file_path)def __init__(self, description, *args):"""Return a new Processor object. Parameters----------description : dictDictionary describing this processor."""build_path = os.path.join(self.__get_path(), "build")reset_value = 0super().__init__(build_path, reset_value, description, *args)

  在 h o m e / x i l i n x / R I S C − V − O n − P Y N Q / r i s c v o n p y n q / p i c o r v 32 / t u t / {home/xilinx/RISC-V-On-PYNQ/riscvonpynq/picorv32/tut/} home/xilinx/RISCVOnPYNQ/riscvonpynq/picorv32/tut/目录下创建__init__.py文件,文件内容如下👇

from . import tutorial
from . import build

  将…/bram/build拷贝到…/tut/build中
  在JupyterNotebook中执行以下代码设置当前工作路径为 h o m e / x i l i n x / R I S C − V − O n − P Y N Q home/xilinx/RISC-V-On-PYNQ home/xilinx/RISCVOnPYNQ

import os
os.chdir("/home/xilinx/RISC-V-On-PYNQ/")
print(os.getcwd())

  执行下面代码导入Overlay👇

import sys
sys.path.insert(0, '/home/xilinx/RISC-V-On-PYNQ/riscvonpynq/picorv32/')from tut.tutorial import TutorialOverlayoverlay = TutorialOverlay("/home/xilinx/RISC-V-On-PYNQ/riscvonpynq/picorv32/tut/tutorial.bit")

  若没有报错执行以下代码,进行移植的测试👇

%%riscvc test overlay.tutorialProcessorint main(int argc, char ** argv){unsigned int * arr = (unsigned int *)argv[1];return arr[2];
}

  但在这里我一直遇到下图的报错

  后来尝试将tut目录下的.hwh文件删除,则可以正确运行。结果如下👇つ﹏⊂猜测原因可能是由于原始工程是基于PYNQ-Z1设计,相应的.hwh文件并没有被正确地使用或者被修改导致与实际连接的硬件不一致。在这种情况下,Vivado可能会默认使用一个标准的接口配置,而不是自定义的接口。

  结果表示编译成功,被编译的是test.c文件,编译结果为.o文件。

  接着运行编译出的文件,在JupyterNotebook中执行以下代码👇

import numpy as np
arg1 = np.array([4,2,3], np.uint32)retval = overlay.tutorialProcessor.run(test, arg1)if(retval != arg1[2]):print("Test failed!")
else:print("Test passed!")

  执行结果如下图所示👇

  测试成功后,为了安装资源到板子上,需运行以下代码

!pip3 install --upgrade /home/xilinx/RISC-V-On-PYNQ/

  安装成功后的结果如下图所示

  至此则完成了整个工程的移植,在后续的工作中可以直接在JupyterNotebook中进行编译运行。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI智能体实战|使用扣子Coze搭建AI智能体,看这一篇就够了(新手必读)

有朋友看到我使用Coze搭建的AI智能体蛮实用的&#xff0c;也想自己尝试一下。那今天我就分享一下如何使用Coze&#xff08;扣子&#xff09;搭建AI智能体&#xff0c;手把手教学&#xff0c;流程超级详细&#xff0c;学会了的话&#xff0c;欢迎分享转发&#xff01; 一、搭建A…

.NET8.0多线程编码结合异步编码示例

1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序&#xff0c;可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时&#xff0c;它们的具体执行顺序是不确定的&#xff0c;除非我们使用同步机制&#xff08;如 lock、信号量等&am…

nginx 实现 正向代理、反向代理 、SSL(证书配置)、负载均衡 、虚拟域名 ,使用其他中间件监控

我们可以详细地配置 Nginx 来实现正向代理、反向代理、SSL、负载均衡和虚拟域名。同时&#xff0c;我会介绍如何使用一些中间件来监控 Nginx 的状态和性能。 1. 安装 Nginx 如果你还没有安装 Nginx&#xff0c;可以通过以下命令进行安装&#xff08;以 Ubuntu 为例&#xff0…

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…

Linux之进程

Linux之进程 一.进程进程之形ps命令进程状态特殊进程孤儿进程守护进程 进程创建之创建子进程进程特性优先级进程切换&#xff08;分时操作系统&#xff09; 二.环境变量三.进程地址空间四.进程终止&进程等待五.进程替换六.自定义shell 本篇博客希望简略的介绍进程&#xff…

漫话架构师|什么是系统架构设计师(开篇)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 关注犬余&#xff0c;共同进步 技术从此不孤单

在AI智能中有几种重要的神经网络类型?6种重要的神经网络类型分享!

神经网络今天已经变得非常流行&#xff0c;但仍然缺乏对它们的了解。一方面&#xff0c;我们已经看到很多人无法识别各种类型的神经网络及其解决的问题&#xff0c;更不用说区分它们中的每一个了。其次&#xff0c;在某种程度上更糟糕的是&#xff0c;当人们在谈论任何神经网络…

业务幂等性技术架构体系之消息幂等深入剖析

在系统中当使用消息队列时&#xff0c;无论做哪种技术选型&#xff0c;有很多问题是无论如何也不能忽视的&#xff0c;如&#xff1a;消息必达、消息幂等等。本文以典型的RabbitMQ为例&#xff0c;讲解如何保证消息幂等的可实施解决方案&#xff0c;其他MQ选型均可参考。 一、…

【C语言】线程----同步、互斥、条件变量

目录 3. 同步 3.1 概念 3.2 同步机制 3.3 函数接口 1. 同步 1.1 概念 同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情 1.2 同步机制 通过信号量实现线程间的同步 信号量&#xff1a;通过信号量实现同步操作&#xff1b;由信号量来决定…

Linux内核的启动

一、需求 Linux系统中内核处于硬件和应用层之间。整个系统启动和初始化的过程&#xff0c;Linux内核是在主处理器启动之后才会执行。不同的处理器启动流程并不相同&#xff0c;这就要求内核能支持各种处理器的初始化操作。Liux内核各个模块&#xff0c;大部分设计时做到了体系…

[手机Linux] ubuntu 错误解决

Ubuntu: 1,ttyname failed: Inappropriate ioctl for device 将 /root/.profile 文件中的 mesg n || true 改为如下内容。 vim /root/.profile tty -s && mesg n || true 2,Errors were encountered while processing: XXX XXXX sudo apt-get --purge remove xxx…

Docker的入门

一、安装Docker 本教程参考官网文档&#xff0c;链接如下: CentOS | Docker Docs 这个教程是基于你的虚拟机已经弄好了&#xff08;虚拟机用的CentOS&#xff09;&#xff0c;并且有SecureCRT或者MobaXterm等等任意一个工具 1.1 卸载旧版 如果系统中存在旧版本的Docker&a…

Onedrive精神分裂怎么办(有变更却不同步)

Onedrive有时候会分裂&#xff0c;你在本地删除文件&#xff0c;并没有同步到云端&#xff0c;但是本地却显示同步成功。 比如删掉了一个目录&#xff0c;在本地看已经删掉&#xff0c;onedrive显示已同步&#xff0c;但是别的电脑并不会同步到这个删除操作&#xff0c;在网页版…

机器学习06-正则化

机器学习06-正则化 文章目录 机器学习06-正则化0-核心逻辑脉络1-参考网址3-大模型训练中的正则化1.正则化的定义与作用2.常见的正则化方法及其应用场景2.1 L1正则化&#xff08;Lasso&#xff09;2.2 L2正则化&#xff08;Ridge&#xff09;2.3 弹性网络正则化&#xff08;Elas…

windows 极速安装 Linux (Ubuntu)-- 无需虚拟机

1. 安装 WSL 和 Ubuntu 打开命令行&#xff0c;执行 WSL --install -d ubuntu若报错&#xff0c;则先执行 WSL --update2. 重启电脑 因安装了子系统&#xff0c;需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示&#xff0c;输入账号&#xff0c;密…

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…

Qt/C++进程间通信:QSharedMemory 使用详解(附演示Demo)

在开发跨进程应用程序时&#xff0c;进程间通信&#xff08;IPC&#xff09;是一个关键问题。Qt 框架提供了多种 IPC 技术&#xff0c;其中 QSharedMemory 是一种高效的共享内存方式&#xff0c;可以实现多个进程之间快速交换数据。本文将详细讲解 QSharedMemory 的概念、用法及…

[UE4图文系列] 5.字符串转中文乱码问题说明

原文连接&#xff1a;[UE4图文系列] 5.字符串转中文乱码问题说明 - 哔哩哔哩 本例以原生C和UE4 C字符串传输中出现的中文乱码问题进行说明 一.乱码示例: 1.直接用中文字符串初始化FString,在蓝图中进行打印 FString GetStrWithChinese() {FString fstr"这是一句中文"…

人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用。近日&#xff0c;演员王星因接到一份看似来自知名公司的拍戏邀约&#xff0c;被骗至泰国并最终被带到缅甸。这一事件迅速引发了社会的广泛关注。该…

题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门&#xff1a; Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译&#xff1a; Iahub正在为国际信息学奥林匹克竞赛&#xff08;IOI&#xff09;做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢&#xff1f; 一排中有n个球…