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

news2025/1/12 22:47:48

本文参考:
👉 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_awaddr
 AWPROT - mem_axi_awprot
 AWVALID - mem_axi_awvalid
 AWREADY - mem_axi_awready
 WDATA - mem_axi_wdata
 WSTRB - mem_axi_wstrb
 WVALID - mem_axi_wvalid
 WREADY - mem_axi_wready
 BVALID - mem_axi_bvalid
 BREADY - mem_axi_bready
 ARADDR - mem_axi_araddr
 ARPROT - mem_axi_arprot
 ARVALID - mem_axi_arvalid
 ARREADY - mem_axi_arready
 RDATA - mem_axi_rdata
 RVALID - mem_axi_rvalid
 RREADY - 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/environment
    print('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 Overlay

    Note
    ----
    This class definition must be co-located with the .tcl and .bit
    file for the overlay for the search path modifications in
    riscvonpynq.Overlay to work. __init__ in riscvonpynq.Overlay uses
    the path of this file to search for the .bit file using the
    inspect package.

    """
    pass

class TutorialProcessor(BramProcessor):
    """Hierarchy driver for the PicoRV32 BRAM Processor

    Note
    ----
    In order to be recognized as a RISC-V Processor hierarchy, three
    conditions must be met: First, there must be a PS-Memory-Mapped
    Block RAM Controller where the name matches the variable
    _bram. Second, the hierarchy name (fullpath) must equal the
    variable _name. Finally, there must be a GPIO port with the name
    _reset_name.

    Subclasses of this module are responsible for setting _name (The
    name of the Hierarchy), _bits (Processor bit-width), _proc
    (Processor Type Name)

    This class must be placed in a known location relative to the
    build files for this processor. The relative path can be modified
    in __get_path.

    """
    _name = 'tutorialProcessor'
    _proc = 'picorv32'
    _bits = 32

    @classmethod
    def checkhierarchy(cls, description):
        return super().checkhierarchy(description)

    def __get_path(self):
        """Get the directory path of this file, or the directory path of the
        class 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 : dict
            Dictionary describing this processor.

        """
        build_path = os.path.join(self.__get_path(), "build")
        reset_value = 0
        super().__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 TutorialOverlay

overlay = TutorialOverlay("/home/xilinx/RISC-V-On-PYNQ/riscvonpynq/picorv32/tut/tutorial.bit")

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

%%riscvc test overlay.tutorialProcessor

int 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.coloradmin.cn/o/2275685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片&#xff0c;从而节省时间和精力&#xff0c;提高工作效率。批处理功能特别适用于需要批量处理的任务&#xff0c;如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…

nvim 打造成可用的IDE(2)

上一个 文章写的太长了&#xff0c; 后来再写东西 就一卡一卡的&#xff0c;所以新开一个。 主要是关于 bufferline的。 之前我的界面是这样的。 这个图标很不舒服有。 后来发现是在这里进行配置。 我也不知道&#xff0c;这个配置 我是从哪 抄过来的。 测试结果&#xff1…

drawDB docker部属

docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问&#xff1a;http://192.168.31.135:3000/

Redis--20--大Key问题解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key&#xff1f;在 Redis 中&#xff0c;大 Key 是指单个键值对的数据量非常大&#xff0c;可能包含大量数据。 2. Redis大Key的危害3.…

自动驾驶---E2E架构演进

1 背景 模型最早应用的自动驾驶模块就是感知层面&#xff0c;随着技术的发展&#xff0c;逐渐开始应用到决策规划等其它模块。端到端自动驾驶架构是一种基于深层神经网络模型和方法的自动驾驶技术模式。目前一段式端到端系统只有在英伟达早期所做的demo中实现&#xff0c;再者就…

如何优雅地绘制时序图

说到时序图&#xff0c;相信所有从事嵌入式开发的伙伴都非常熟悉&#xff0c;在各种元器件手册以及处理器说明书中&#xff0c;但凡涉及到通信、接口、交互等内容&#xff0c;都会涉及到时序图。时序图可以非常详细且明确地描述硬件及软件接口中各个信号的时序关系&#xff0c;…

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现&#xff0c;并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架&#xff0c;帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …

WebGIS在应急灾害中对村庄、风景区、机场的影响范围应用-以日喀则市定日县地震为例

目录 前言 一、关于影响范围 1、震中距离5公里 2、震中20公里范围 3、20到80公里范围 二、空间查询知识 1、相关数据介绍 2、空间数据查询 三、前后端数据查询以及web可视化实现 1、后台API实现 2、WebGIS前端实现 四、Web成果展示 1、空间位置分析 2、包含风景区…

使用网页版Jupyter Notebook和VScode打开.ipynb文件

目录 正文 1、网页版Jupyter Notebook查看 2、VScode查看 因为总是忘记查看文件的网址&#xff0c;收藏了但分类众多每次都找不到……当个记录吧&#xff08;/捂脸哭&#xff09;&#xff01; 正文 此处以gitub中的某个仓库为例&#xff1a; https://github.com/INM-6/mu…

景联文科技提供高质量多模态数据处理服务,驱动AI新时代

在当今快速发展的AI时代&#xff0c;多模态数据标注成为推动人工智能技术进步的关键环节。景联文科技作为行业领先的AI数据服务提供商&#xff0c;专注于为客户提供高质量、高精度的多模态数据标注服务&#xff0c;涵盖图像、语音、文本、视频及3D点云等多种类型的数据。通过专…

Python在Excel工作表中创建数据透视表

在数据处理和分析工作中&#xff0c;Excel作为一个广泛使用的工具&#xff0c;提供了强大的功能来管理和解析数据。当面对大量复杂的数据集时&#xff0c;为了更高效地总结、分析和展示数据&#xff0c;创建数据透视表成为一种不可或缺的方法。通过使用Python这样的编程语言与E…

django基于Python的电影推荐系统

Django 基于 Python 的电影推荐系统 一、系统概述 Django 基于 Python 的电影推荐系统是一款利用 Django 框架开发的智能化应用程序&#xff0c;旨在为电影爱好者提供个性化的电影推荐服务。该系统通过收集和分析用户的观影历史、评分数据、电影的属性信息&#xff08;如类型…

GPT-SoVITS学习01

1.什么是TTS TTS&#xff08;Text-To-Speech&#xff09;这是一种文字转语音的语音合成。类似的还有SVC&#xff08;歌声转换&#xff09;、SVS&#xff08;歌声合成&#xff09;等。 2.配置要求 GPT-SoVITS对电脑配置有较高的要求。 训练&#xff1a;对于Windows电脑&#…

计算机网络 (36)TCP可靠传输的实现

前言 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过多种机制实现可靠传输&#xff0c;这些机制主要包括连接管理、序列号和确认应答机制、重传机制、流量控制、拥塞控制等。 一、连接管理 TCP使用三次握手&#xff0…

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

make工程管理器与Makefile

目录 一、介绍 1、make工程管理器 2、Makefile 二、Makefile语法规则 1、Makefile语法格式 2、Makefile中特殊处理与伪目标 3、变量、规则与函数 (1)自定义变量使用示例 (2)自动变量使用示例 一、介绍 1、make工程管理器 定义&#xff1a; make是一个命令工具&…

【git】-2 分支管理

目录 一、分支的概念 二、查看、创建、切换分支 1、查看分支-git branch 2、创建分支- git branch 分支名 3、切换分支- git checkout 分支名 三、git指针 -实现分支和版本间的切换 四、普通合并分支 git merge 文件名 五、冲突分支合并 ​​​​​​【git】-初始gi…

3DGabor滤波器实现人脸特征提取

import cv2 import numpy as np# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # 相位偏移# 生成 Gabor 滤…

接口项目架构流程图-thinkphp6-rabbitmq

一、整个系统流程 第一步&#xff1a;平台在创建好后开启消息队列&#xff1b; 第二步&#xff1a;平台为需要服务的客户开好账号并传输对应的公私钥文件&#xff1b; 第三步&#xff1a;客户通过平台分享的接口连接地址采用开户时的手机号查看&#xff1b; 第四步&#xff1a;…