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

Versal - ChipScoPy + XSDB + Python CLI

目录

1. 简介

1.1 ChipScoPy

1.2 XSDB

1.3 Python CLI

2. 安装 ChipScoPy

2.1 Python 环境

2.2 设置虚拟环境

2.3 安装 ChipScoPy

2.4 安装依赖

2.5 安装示例

2.6 打开 JupyterLab

2.7 启动 hw/cs 服务

2.8 更新 ChipScoPy

2.9 参考资料

3. ChipScoPy 示例

3.1 Programming

3.2 Memory 读写

3.2.1 通用内容

3.2.2 清空设备

3.2.3 简单读写示例

3.2.4 指定字大小

3.2.5 在循环中读写

4. XSDB 示例

4.1 Basic

4.1.1 参考资料

4.1.2 进入 XSDB

 4.1.3 帮助信息

4.1.4 基本操作

4.2 控制 AXI GPIO

4.2.1 Bock Desgin

4.2.2 Address Editor

4.2.3 操作寄存器

4.2.4 报错提示

5. Python CLI

5.1 参考资料

5.2 基本命令

5.2.1 启动方式

5.2.2 导入 xsdb 包

5.2.3 建立对话和连接

5.2.4 选择 target

5.2.5 下载 PDI

5.2.6 设置存储器映射

5.2.7 Momory 读写

5.3 控制 AXI GPIO

5.3.1 Block Design

5.3.2 主要代码

6. 总结


1. 简介

1.1 ChipScoPy

Target Communication Framework 

ChipScoPy 是一个开源 Python 项目,用于与 Xilinx Versal 硬件调试解决方案进行通信和控制。客户端 Python 脚本可以访问丰富的硬件交互 API。ChipScoPy 包的主要功能包括:

  •   Device detection, programming, and status
  • Memory subsystems support
  • Fabric Debug Core support
    •  Integrated Logic Analyzer (ILA)
    • Virtual Input Output (VIO) 
  • Hardened Core support
    •  DDR Memory Controller (DDRMC)
    • Integrated Bit Error Ratio Tester (IBERT)
    • System Monitor (SysMon)
    • Network on Chip Performance Monitor (NoC PerfMon)
    • PCI Express (PCIe)  

1.2 XSDB

XSDB(Xilinx System Debugger,系统调试器)使用 HW Server 作为底层调试引擎,提供了一种通过 JTAG 接口与 Xilinx 硬件系统进行交互的命令行调试工具。可以将用户界面操作转换为一系列目标通信框架 (TCF) 命令。

关于 XSCT:

XSCT (Xilinx Software Command-Line Tool) 是一个更高级的命令行工具,它包含了 XSDB 的所有功能,并且还提供了一些额外的功能,例如工程管理、构建和下载等。

如果在 bash 中启动 xsct,会出现如下提示:

Warning: XSCT is deprecated and will be removed in future releases.

We recommend using the new Python command-line tool for project management and debugging:
- Run "vitis -i" for interactive mode.
- Run "vitis -s <script>" for script mode.

XSCT 已经被标记为 “deprecated”(不推荐使用),并且在未来的版本中会被移除。

1.3 Python CLI

Python CLI 实际上指的是在新的 Vitis 命令行工具中使用 Python 脚本来执行以前通过 XSCT 和 XSDB 完成的调试任务。由于 XSCT 正在被弃用,Xilinx 转向了基于 Python 的方法。

核心概念:

  • Vitis 命令行工具: 这是取代 XSCT 的新工具,使用 vitis 命令启动。
  • Python API: Vitis 命令行工具基于 Python API 构建,也就是需要使用 Python 语法来编写脚本,而不是之前的 Tcl。
  • xsdb 模块: 在 Vitis Python API 中,有一个 xsdb 模块,它提供了与 XSDB 功能相对应的 Python 函数。这个模块让你能够通过 Python 脚本执行各种调试操作。

2. 安装 ChipScoPy

2.1 Python 环境

官方建议使用的版本 Python 3.8、3.9、3.10、3.11、3.12。

有多种方法可以配置使用 ChipScoPy API。

本文分享使用 conda 来管理虚拟环境,并使用ChipScPy。

conda 安装方法见此博文:Vivado 编译(单核性能对比+高性能迷你主机+Ubuntu20.04/22.04安装与区别+20.04使用远程命令)_ubuntu vivado-CSDN博客文章浏览阅读834次,点赞11次,收藏28次。选购一款专用于 Vitis 和 Vivado 开发的主机,Vivado 的编译速度很大程度上取决于 CPU 的单核性能,尤其是在布线和综合阶段,最终选择一款迷你主机,不考虑使用独显,核性数一般即可。按照 Single Thread Performance 对比即可,挑选一款最佳性价比产品。对比 Ubuntu 22.04 和 Ubuntu 20.04 运行 Vivado 的兼容性。_ubuntu vivadohttps://blog.csdn.net/DongDong314/article/details/144565249https://blog.csdn.net/DongDong314/article/details/144565249

启用 conda:

>> cd /opt/anaconda3/bin/
>> ./conda init bash

(base)>> conda --version # 确认已启用conda,并查看conda版本
(base)>> python --version # 查看python版本

区分,在 conda 与 shell 中查看 python 版本并不一致:

>> python3 --version

2.2 设置虚拟环境

1)创建 scopy 虚拟环境:

conda deactivate # 激活 base 环境(如果需要)

conda create -n scopy python=3.12.7 # 创建虚拟环境 scopy

conda activate scopy # 激活虚拟环境 scopy

创建虚拟环境 scopy 时,需要指定 python 版本(当前conda的base环境python=3.12.7),不指定的话,conda 会直接使用最新版本(下载新的python=3.13.1)。

2)查看所有已创建的虚拟环境

conda env list
conda info --envs

conda create -n new_env --clone old_env # 克隆旧环境

2)删除 scopy 虚拟环境,并清除与其关联的所有包:

conda remove --name scopy --all

2.3 安装 ChipScoPy

1)激活 scopy 虚拟环境

(base)>> conda activate scopy
---
(scopy)>>

2)安装 ChipScoPy 包

由于 conda 仓库中并没有 ChipScoPy 包,需要使用 python pip 来安装

(scopy)>> python -m pip install --upgrade pip # 更新 pip

(scopy)>> python -m pip install 'chipscopy==2024.2.*' # 安装指定版本的chipscopy

---
Successfully installed Click-8.1.8 antlr4-python3-runtime-4.13.1 certifi-2024.12.14 charset-normalizer-3.4.1 chipscopy-2024.2.1733027508 idna-3.10 importlib_metadata-6.11.0 loguru-0.7.3 markdown-it-py-3.0.0 mdurl-0.1.2 more-itertools-10.5.0 pygments-2.19.1 requests-2.32.3 rich-13.9.4 typing_extensions-4.12.2 urllib3-2.3.0 zipp-3.21.0

2.4 安装依赖

运行以下命令来安装附加支持包:

(scopy)>> python -m pip install chipscopy[core-addons]
(scopy)>> python -m pip install chipscopy[jupyter]

有如下报错:

  × Preparing metadata (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [6 lines of output]

      Cargo, the Rust package manager, is not installed or is not on PATH.
      This package requires Rust and Cargo to compile extensions. Install it through
      the system's package manager or via https://rustup.rs/

      Checking for Rust toolchain....
      [end of output]

解决办法,安装 rust: 

(scopy)>> curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

直接按 Enter 键接受默认选项即可。

(scopy)>> source ~/.cargo/env

验证 Rust 和 Cargo 是否安装成功:

(scopy)>> rustc --version
(scopy)>> cargo --version

然后再次执行安装:

(scopy)>> python -m pip install chipscopy[jupyter]

2.5 安装示例

有一个脚本可将示例安装到用户选择的特定目录中。

(scopy)>> chipscopy-get-examples
---
 chipscopy-get-examples
No examples available locally, they will be downloaded from Github.
Do you want to proceed? [Y/n] y
Downloading examples from https://github.com/Xilinx/chipscopy/releases/download/2024.2.1733027508/chipscopy_examples_2024.2.1733027508.zip...

示例将被安装到如下目录:

Installed examples to ~/chipscopy-examples.

2.6 打开 JupyterLab

cd ~/chipscopy-examples

jupyter lab --no-browser --port 8888 --ip 192.168.1.23
 
jupyter lab --no-browser --port 8888 --ip 192.168.137.3

---
To access the server, open this file in a browser:
        file:///home/user/.local/share/jupyter/runtime/jpserver-216584-open.html
    Or copy and paste one of these URLs:
        http://192.168.137.3:8888/lab?token=6841b82a2700442ca7c9d439fa6e9b73ba8b5b30b33256c9
        http://127.0.0.1:8888/lab?token=6841b82a2700442ca7c9d439fa6e9b73ba8b5b30b33256c9

可能出现 nodejs 报错:

Could not determine jupyterlab build status without nodejs

在 conda 环境中,安装 nodejs 即可:

(scopy)>> conda install -c conda-forge nodejs

2.7 启动 hw/cs 服务

(scopy)>> hw_server # 启动硬件服务器

(scopy)>> cs_server # 启动chipscopy服务器

2.8 更新 ChipScoPy

开发团队会推出修复和功能,获取最新软件版本:

(scopy)>> python -m pip install --upgrade chipscopy # 更新软件本身
(scopy)>> chipscopy-get-examples # 更新示例

2.9 参考资料

1)视频培训资料

ChipScoPy 培训系列:安装https://china.xilinx.com/video/hardware/chipscopy-installation-overview.htmlhttps://china.xilinx.com/video/hardware/chipscopy-installation-overview.html

包含以下视频:

  • ChipScoPy 培训系列:概述
  • ChipScoPy 培训系列:硬件设置
  • ChipScoPy 培训系列:内存访问示例 
  • ChipScoPy 培训系列:IBERT 范例 
  • ChipScoPy 培训系列:PL 架构调试示例 

2)ChipScoPy Github IO

ChipScoPy Github IOhttps://xilinx.github.io/chipscopy/2024.2/overview.htmlhttps://xilinx.github.io/chipscopy/2024.2/overview.html

包含以下内容:

  • Introduction
    • ChipScoPy Overview
    • System Requirements
    • ChipScoPy Installation
    • Developer Installation
  • ChipScoPy Debug Core API Classes
    • IBERT
    • ILA
      Memory
    • NocPerfmon
    • PCIe
    • SysMon
    • VIO
  • Misc Classes & Utility Functions
    • Containers
    • Device
    • Report
    • Session

3. ChipScoPy 示例

3.1 Programming

1)确保 hw_server 已启动

./opt/Xilinx/Vivado/2024.2/bin/hw_server

2)导入必要的包

import os
from chipscopy import get_design_files
from chipscopy import create_session, report_versions, delete_session

3)获取 HW_URL

HW_URL = os.getenv("HW_SERVER_URL", "TCP:localhost:3121")
PROGRAMMING_FILE = get_design_files("<prj_path>/tt2.runs/impl_1/").programming_file

---
HW_URL: TCP:localhost:3121
PROGRAMMING_FILE: <prj_path>/tt2.runs/impl_1//design_1_wrapper.pdi
  • 尝试从操作系统的环境变量中获取名为 HW_SERVER_URL 的变量的值。
  • 如果找到了这个环境变量,就将它的值赋给变量 HW_URL。
  • 如果没有找到这个环境变量,就将默认值 "TCP:localhost:3121" 赋给变量 HW_URL。

4)创建一个会话并连接到 hw_server

session = create_session(hw_server_url=HW_URL)
report_versions(session)
---
                      ChipScoPy Version Information                      
┌────────────────────────────┬──────────────────────────────────────────┐
│                     Entity │ Version                                  │
├────────────────────────────┼──────────────────────────────────────────┤
│                  ChipScoPy │ ┌───────────┬──────────────────────┐     │
│                            │ │ Attribute │ Value                │     │
│                            │ ├───────────┼──────────────────────┤     │
│                            │ │     Build │ 2024.2.1733027508    │     │
│                            │ │ Timestamp │ Dec 01 2024-12:31:48 │     │
│                            │ └───────────┴──────────────────────┘     │
│                            │                                          │
│ hw_server @ localhost:3121 │ ┌───────────┬──────────────────────────┐ │
│                            │ │ Attribute │ Value                    │ │
│                            │ ├───────────┼──────────────────────────┤ │
│                            │ │    Status │ Connected                │ │
│                            │ │     Build │ 1730218498               │ │
│                            │ │   Version │ 2024.2                   │ │
│                            │ │ Timestamp │ Tue Oct 29 10:14:58 2024 │ │
│                            │ └───────────┴──────────────────────────┘ │
└────────────────────────────┴──────────────────────────────────────────┘

5)执行烧写

device = session.devices.filter_by(family="versal").get()
device.program(PROGRAMMING_FILE)

---
--> INFO: Programming device with: 
<prj_path>/tt2.runs/impl_1/design_1_wrapper.pdi
    
Device program progress ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% Done
## When done with testing, close the connection
delete_session(session)

3.2 Memory 读写

3.2.1 通用内容

import os
from chipscopy import get_design_files
from chipscopy import create_session, report_versions, delete_session

HW_URL = "TCP:localhost:3121"

session = create_session(hw_server_url=HW_URL)
report_versions(session)

versal_device = session.devices.filter_by(family="versal").get()
print(versal_device)

3.2.2 清空设备

Reset the device to a non-programmed state.

versal_device.reset()
print("Reset complete.")

print("\nMemory Targets: ", versal_device.memory_target_names)
---
Memory Targets:  ['DPC', 'Versal xcve2302', 'PSM', 'PPU', 'MicroBlaze PPU', 'APU', 'Cortex-A72 #1', 'Cortex-A72 #0', 'RPU', 'Cortex-R5 #1', 'Cortex-R5 #0']

其中,DPC 表示 Debug Packet Controller,调试数据包控制器。

参见:《Versal Adaptive SoC Technical Reference Manual (AM011)》

3.2.3 简单读写示例

  • 写函数 Device.memory_write(addr, values_to_write)
  • 读函数 Val = Device.memory_read(address=addr, num=length)
addr = 0xF2010000
values_to_write = [0x10111213, 0x14151617]
print("\nWriting [{}]".format(", ".join(hex(x) for x in values_to_write)), "to address:", hex(addr))

# Write to the DPC default target
versal_device.memory_write(addr, values_to_write)

print(f"Reading {len(values_to_write)} values from address: hex(addr)")
read_values = versal_device.memory_read(address=addr, num=len(values_to_write))
print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))

assert read_values == values_to_write # 读写校验

查看源代码,默认会使用第一个 node 进行操作(即 DPC)。 

def memory_read(self, address: int, num: int = 1, *, size="w", target=None) -> List[int]:
    ...
    node = self._device_spec.search_memory_node_deep(target, default_target=self.default_target)
    ...
    retval = node.memory_read(address=address, num=num, size=size)
    return retval

也可以在 JupyterLab 中验证:

print(versal_device.default_target)
---
DPC

3.2.4 指定字大小

addr = 0xF2010000
values_to_write = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17]
print("\nWriting [{}]".format(", ".join(hex(x) for x in values_to_write)), "to address:", hex(addr))

versal_device.memory_write(addr, values_to_write, size="b") # 按 byte 写入

print("Reading from address: ", hex(addr))
read_values = versal_device.memory_read(address=addr, size="b", num=len(values_to_write))
print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))
assert read_values == values_to_write # 读写校验

values_to_write = [0x1000, 0x1234, 0x4321, 0x1313, 0x1414, 0x1515, 0x1616, 0x1717]
print("\nWriting [{}]".format(", ".join(hex(x) for x in values_to_write)), "to address:", hex(addr))

versal_device.memory_write(addr, values_to_write, size="h") # 按 2*byte 写入

print("Reading from address: ", hex(addr))
read_values = versal_device.memory_read(address=addr, size="h", num=len(values_to_write))
print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))
assert read_values == values_to_write  # 读写校验

3.2.5 在循环中读写

通过 3.2.4 方法操作内存,速度较慢,因为它每次都需在目标树中查找内存上下文。如果需要执行大量内存操作,应先获取内存上下文,然后批量执行所有操作。

addr = 0xF2010000
dpc = versal_device.memory.get(name="DPC")
apu = versal_device.memory.get(name="APU")
for i in range(10):
    values_to_write = [0x12345678 + i, 0xFEDCBA98 - i]
    print(
        "\nDPC: Writing [{}]".format(", ".join(hex(x) for x in values_to_write)),
        "to address:",
        hex(addr),
    )
    dpc.memory_write(addr, values_to_write) # write
    print("APU: Reading from address: ", hex(addr))
    read_values = apu.memory_read(address=addr, num=len(values_to_write)) # read
    print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))
    assert read_values == values_to_write

4. XSDB 示例

4.1 Basic

4.1.1 参考资料

《Versal Adaptive SoC System Integration and Validation Methodology Guide (UG1388)》

UG1388 - DPC

4.1.2 进入 XSDB

>> source /opt/Xilinx/Vivado/2024.2/settings64.sh
>> hw_server
>> xsdb
xsdb% # 启动成功

 4.1.3 帮助信息

xsdb% help

Available Help Categories

breakpoints   - Target Breakpoints/Watchpoints.
connections   - Target Connection Management.
device        - Device Configuration System.
download      - Target Download FPGA/BINARY.
ipi           - IPI commands to Versal PMC.
jtag          - JTAG Access.
memory        - Target Memory.
miscellaneous - Miscellaneous.
registers     - Target Registers.
reset         - Target Reset.
running       - Program Execution.
sdk           -
stapl         - STAPL Operations.
streams       - Jtag UART.
svf           - SVF Operations.
tfile         - Target File System.

4.1.4 基本操作

1)建立连接

xsdb% connect -host localhost -port 3121
or
xsdb% connect

---
tcfchan#0

表示成功建立连接。

2)显示所有目标

xsdb% targets
or
xsdb% ta

---
  1  Versal xcve2302
     2  RPU (Reset)
        3  Cortex-R5 #0 (RPU Reset)
        4  Cortex-R5 #1 (RPU Reset)
     5  APU (L2 Cache Reset)
        6  Cortex-A72 #0 (APU Reset)
        7  Cortex-A72 #1 (APU Reset)
     8  PPU
        9  MicroBlaze PPU (Sleeping)
    10  PSM
       11  MicroBlaze PSM (Sleeping)
    12  PMC
    13  PL
 14  DPC

3)选择特定目标

比如选择 DPC 进行通讯:

xsdb% target 14
or
xsdb% ta 14

选择成功后,通过 targets 看到 14 中间有个 * 号。

xsdb% ta
  1  Versal xcve2302
    ...
    13  PL
 14* DPC

4)Memory 读写

xsdb% mwr 0x0 0x2 # Memory 写入

xsdb% mrd 0x0  # Memory 读取
       0:   00000002

5)清空命令区内容

xsdb% clear

4.2 控制 AXI GPIO

4.2.1 Bock Desgin

其中 led 管脚绑定为: 

set_property PACKAGE_PIN E20     [get_ports {led_tri_io[0]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led_tri_io[0]}]

4.2.2 Address Editor

4.2.3 操作寄存器

xsdb% ta 1
xsdb% loadhw design_1.xsa

xsdb% ta 14
xsdb% mwr 0x20100000004 0 # 设置 AXI GPIO 为输出
xsdb% mwr 0x20100000000 1 # 设置 AXI GPIO 的状态(高)
xsdb% mwr 0x20100000000 0 # 设置 AXI GPIO 的状态(低)

可以观察到 LED 灯的亮灭。

更多例子,可以参考:

Vivado - JTAG to AXI Master (GPIO、HLS_IP、UART、IIC)-CSDN博客文章浏览阅读1.2k次,点赞11次,收藏30次。JTAG to AXI Master 功能简介;在 Vivado 中添加该 IP;基本 TCL 操作命令;三个示例(通过JTAG to AXI 控制 AXI GPIO;通过JTAG to AXI 控制 AXI IIC;通过JTAG to AXI 控制 HLS IP Core)_jtag to axi masterhttps://blog.csdn.net/DongDong314/article/details/142467837https://blog.csdn.net/DongDong314/article/details/142467837

4.2.4 报错提示

xsdb% mrd 0x20100000000
---
Memory read error at 0x20100000000. Blocked address 0x20100000000. Access can hang PS interconnect

解决方法一(强制 memory 操作):

xsdb% mwr -force 0x20100000004 0 # 设置 AXI GPIO 为输出
xsdb% mwr -force 0x20100000000 1 # 设置 AXI GPIO 的状态(高)
xsdb% mwr -force 0x20100000000 0 # 设置 AXI GPIO 的状态(低)

解决方法二(加载 PDI 和对应 XSA):

xsdb% ta 1
xsdb% loadhw design_1.xsa

xsdb% ta 14
xsdb% mwr 0x20100000004 0 # 设置 AXI GPIO 为输出
xsdb% mwr 0x20100000000 1 # 设置 AXI GPIO 的状态(高)
xsdb% mwr 0x20100000000 0 # 设置 AXI GPIO 的状态(低)

参见:

Memory Accesses in XSDB Fails

原因归纳:

HW Server 阻止对未知内存区域的事务。

xsdb% help loadhw

---

加载一个 Vivado 硬件设计,并为当前目标设置存储器映射。如果当前目标是一组处理器的父级,则为它的所有子处理器设置存储器映射。如果当前目标是一个处理器,则为其父级的所有子处理器设置存储器映射。此命令返回硬件设计对象。

5. Python CLI

5.1 参考资料

1)《Vitis Reference Guide (UG1702)》

Additional Information -> Python XSDB Commands

https://docs.amd.com/r/en-US/ug1702-vitis-accelerated-reference/Python-XSDB-Commandshttps://docs.amd.com/r/en-US/ug1702-vitis-accelerated-reference/Python-XSDB-Commandshttps://docs.amd.com/r/en-US/ug1702-vitis-accelerated-reference/Python-XSDB-Commands

2)Vitis Embedded Scripting Flows

Vitis-Tutorials/Embedded_Software/Feature_Tutorials /04-vitis_scripting_flows/https://github.com/Xilinx/Vitis-Tutorials/tree/2024.2/Embedded_Software/Feature_Tutorials/04-vitis_scripting_flowshttps://github.com/Xilinx/Vitis-Tutorials/tree/2024.2/Embedded_Software/Feature_Tutorials/04-vitis_scripting_flowsTable of Contents:

  • Component creation using the Vitis commands
  • Metadata extraction using HSI API
  • Deploy and Debug in XSDB from commandline

5.2 基本命令

5.2.1 启动方式

1)命令行交互

vitis -i

2)jupyter

vitis -j --no-browser --port 8888 --ip 192.168.137.3

5.2.2 导入 xsdb 包

import xsdb

xsdb.help("functions") # 显示所有可用函数

5.2.3 建立对话和连接

session=xsdb.start_debug_session() # 创建对话

session.connect() # 连接 hw server
---
tcfchan#0

查看已建立的连接: 

session.connect("--list")

5.2.4 选择 target

1)查看所有 targets

session.targets()

2)选择一个 target

session.targets(1)
or
session.targets("--set", filter="name =~ *Versal*")

session.targets() # 再次查看 targets

可以看到 “1* Versal xcve2302”,中间有个星号,表示已经选中了 Versal。

5.2.5 下载 PDI

# Download PDI to Versal Device
PDI="<path>/design_1_wrapper.pdi"
session.targets("--set", filter="name =~ *Versal*")
session.rst()
session.device_program(PDI)

如果不执行复位,直接执行同样的下载,过程会很慢,而且最后也会失败。

5.2.6 设置存储器映射

session.targets("--set", filter="name =~ *Versal*")
XSA="<path>/design_1_wrapper.xsa"
session.loadhw(hw=XSA)

查看映射:

Targets              DesignFile
=======              ==========================
1                    <path>/deign_1_wrapper.xsa

映射的目的,就是把当前 Block Address Editor 内容告知 session,防止被 Block。

5.2.7 Momory 读写

session.targets("--set", filter="name =~ *DPC*")

session.mrd(0x201_0000_0000) # memory 读取

session.mrd(0x201_0000_0000, '-f') # 强制 memory 读取

session.mwr(address=0x201_0000_0004, words=0)

如果没有设置存储器映射,Memory 操作会失败,除非强制操作。 

5.3 控制 AXI GPIO

5.3.1 Block Design

Address Editor:

5.3.2 主要代码

import xsdb

PDI="<path>/design_1_wrapper.pdi"
XSA="<path>/design_1_wrapper.xsa"

session = xsdb.start_debug_session()
session.connect()

session.targets("--set", filter="name =~ *Versal*")
session.rst()
session.device_program(PDI)

session.targets("--set", filter="name =~ *Versal*")
session.loadhw(hw=XSA)

session.targets("--set", filter="name =~ *DPC*")

session.mwr(address=0x201_0000_0004, words=0)

session.mwr(address=0x201_0000_0000, words=1)
session.mwr(address=0x201_0000_0000, words=0)

6. 总结

本文介绍几款 xilinx 调试工具使用方法:

  • ChipScoPy 的安装和使用
  • XSDB
  • Python CLI


http://www.kler.cn/a/516048.html

相关文章:

  • 2024年度总结
  • IPhone16 Pro 设备详情
  • Linux应用编程(五)USB应用开发-libusb库
  • 【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制
  • STM32更新程序OTA
  • Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理
  • 栈和队列(C语言)
  • HarmonyOS相对布局
  • qml menuBar详解
  • 力扣动态规划-8【算法学习day.102】
  • leetcode 面试经典 150 题:有效的括号
  • Ollama 使用笔记
  • Linux C\C++编程-建立文件和内存映射
  • 【韩顺平Java笔记】第8章:面向对象编程(中级部分)【343-353】
  • salesforce apex测试类如果有多个httpmock,则只会返回一个,导致可能不符合预期
  • `std::make_shared` 无法直接用于单例模式,因为它需要访问构造函数,而构造函数通常是私有的
  • Linux - 五种常见I/O模型
  • Spring MVC:综合练习 - 深刻理解前后端交互过程
  • PaSa - 大型语言模型提供支持的高级论文搜索代理
  • 使用KNN实现对鸢尾花数据集或者自定义数据集的的预测
  • 基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)
  • FCA-FineReport试卷
  • 数据挖掘常用算法模型简介
  • 有关Android Studio的安装与配置并实现helloworld(有jdk的安装与配置)(保姆级教程)
  • 云计算和服务器
  • 软件工程的本质特征