FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践

FPGA技术江湖 2026-09-10 08:09

通过自定义 FPGA 接口,直接在 LabVIEW 中读取 FPGA XADC 的模拟信号,实现实时数据采集。

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图1

序论

本项目演示了如何从 A7 FPGA(Digilent Arty Z7 FPGA 开发板)的 XADC 获取模拟数据,并将其显示在运行于 Windows PC 上的 LabVIEW 中。FPGA 与 LabVIEW 之间的通信通过自定义硬件接口实现,从而能够实时可视化模拟输入信号。

与需要嵌入式软件或 Jupyter notebook 的传统 FPGA 开发不同,本项目专注于 LabVIEW 和 FPGA 之间的直接通信,使其适用于实验室仪器和教育环境。

这项工作探索了 Python + LabVIEW + FPGA 的组合方案,用于构建更加直观的 FPGA 数据采集和控制系统。Python 负责与 FPGA 硬件通信、控制和自动化,LabVIEW 则提供图形化界面,实现数据实时显示、参数配置和仪器控制,从而降低 FPGA 数据采集系统的使用门槛。

项目由费米实验室围绕 DUNE 深地中微子实验相关技术开发展开,使用 Xilinx Zynq-7000 系列 FPGA 研究科学仪器和数据采集系统的软件接口。虽然示例采用 Digilent Arty Z7,并通过单个 XADC 通道完成数据采集,但其设计思路可以进一步扩展到多通道采集、DMA 高速数据传输、数字信号处理以及自定义 FPGA 外设。

整体来看,该项目的重点并不是单纯实现一次 XADC 数据读取,而是探索一种降低 FPGA 数据采集系统使用门槛的软硬件架构:利用 FPGA 提供高速、灵活的数据处理能力,Python 负责硬件控制和自动化,LabVIEW 则提供面向工程师和研究人员的可视化操作界面,为后续构建完整的 FPGA 虚拟仪器和科学数据采集平台提供基础。

项目文件

重现此项目所需的所有文件,包括 Vivado 设计、Python 脚本和 LabVIEW 文件,都可以在项目的 GitHub 存储库中找到。

https://github.com/jolobotero/XADCLabVIEW

VIVADO 中的 XADC 实现

XADC 的实现和配置使用了 Vivado 中提供的 XADC Wizard IP。本项目仅使用了一个模拟输入通道,从而简化硬件架构,同时提供了一个完整的基于 FPGA 的模拟数据采集示例。

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图2

XADC 负责对选定的模拟输入通道进行数字化采样,并通过 AXI4-Lite 提供寄存器访问接口。处理器或上位机可以通过内存映射方式读取 XADC 转换后的数字数据。

这种架构不需要复杂的高速数据流通道,适合当前以模拟数据采集、读取和可视化为主的应用。采集到的 XADC 数据可以进一步传递给 LabVIEW,实现实时波形显示、数据监测以及仪器控制,为后续扩展多通道采集和更复杂的数据处理提供基础。

创建 Vivado Block 设计

打开Vivado ,为 Arty Z7 开发板创建一个新项目。项目创建完成后,打开Block Design环境,创建一个新的Block Design。

在“Block Design”窗口中,选择“添加 IP” ,然后搜索“XADC Wizard” 。双击该 IP 将其添加到设计中。

对于本项目,XADC Wizard配置如下。

  • Basic配置:在Basic配置中,选择AXI4-Lite作为接口,并将 XADC 配置为连续模式。DCLK 频率设置为104 MHz 。
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图3
  • ADC 设置:ADC 设置中,通道平均功能已禁用。采集到的样本不会进行任何额外的平均或滤波处理。其余 ADC 设置选项也保持禁用状态。此配置允许 XADC 连续采集样本而不进行硬件平均,从而使采集到的数据可供主机应用程序处理。
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图4
  • 本项目未启用 XADC 报警功能。由于项目目标仅为采集和可视化模拟输入,因此无需报警功能。
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图5
  • Single Channel 配置:该设计采用单个辅助模拟输入。Vaux1 (A0 通道)被选为该通道的正负输入。该通道配置为单极性输入,因此双极性操作被禁用。
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图6

连接 XADC 和 Zynq 处理系统

XADC配置完成后,需要在BD中将模拟输入暴露为外部端口。在xadc_wiz_0模块中,右键单击VauxP1和VauxN1输入连接,然后选择“Make External”。Vivado将为选定的XADC输入创建外部端口。建议保留Vivado生成的端口名称。通过保留默认的XADC端口名称,可以利用电路板现有的约束来处理物理引脚分配,因此无需为这些XADC连接创建额外的约束文件。

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图7

接下来,从 IP 目录中添加ZYNQ7 处理系统IP。该模块提供集成到 Zynq-7000 器件中的处理系统,并允许通过 AXI4-Lite 接口访问 XADC 外设。

添加 Zynq 处理系统后,运行模块自动化来配置处理器并应用所选电路板的推荐连接。然后运行连接自动化,自动连接 Zynq 处理系统和 XADC IP 之间的 AXI 接口和其他所需信号。

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图8
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图9

验证模块设计后,生成 HDL 封装器并运行“生成比特流”命令。生成的 .bit 文件包含 FPGA 硬件配置,将在下一阶段用于建立 Arty Z7 和 LabVIEW 应用程序之间的通信。

内存映射寄存器

在进行软件实现之前,必须先确定与FPGA外设关联的内存地址。这些地址稍后将用于从主机应用程序访问XADC寄存器。

在这个项目中,我们只需要访问与 xadc_wiz_0 外设相关的寄存器。地址信息可以在 Vivado 的地址编辑器中的“地址映射”部分找到。

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图10
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图11

在当前设计中,XADC 外设映射到以下地址范围:

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图12

基地址0x43C00000 是分配给 XADC 的内存映射区域的起始点。各个 XADC 寄存器位于该 64 KB 地址空间内的特定偏移量处。

这些地址对于项目的下一阶段尤为重要,因为它们提供了 FPGA 硬件与 PC 上运行的软件之间的连接。

FPGA 编程

Vivado 设计完成后,比特流生成后,下一步是准备 FPGA 配置文件,以便对 Arty Z7 进行编程。然后,根据所使用的编程方法,可以从 Linux 环境或直接从 Windows 命令提示符 (CMD) 对 FPGA 进行编程。

创建 .bin 文件

虽然 Vivado 可以直接生成 .bin 文件,但当 FPGA 系统上安装了不同版本的 Linux 或 PetaLinux 系统,并且 Vivado 版本也不同时,可能会出现兼容性问题。因此,更安全的做法是使用Windows 命令提示符 (CMD)手动生成 .bin 文件。

在 Vivado 比特流 (.bit) 文件生成的文件夹中打开CMD 。在同一文件夹中,创建一个名为download.bif 的文本文件,用文本编辑器打开它,并添加以下内容:

</> cmd
all: 
{
     your_bitstream.bit 
}

your_bitstream.bit 是 Vivado 生成的文件。

检查 Bootgen 是否可用

在生成 .bin 文件之前,需要验证Windows 环境中是否安装了Bootgen工具。

打开命令提示符(CMD)并执行:

</> cmd
bootgen -help

或者:

</> cmd
bootgen -version

如果 Windows 返回类似如下的消息:

</> cmd
'bootgen' is not recognized as an internal or external command,
operable program or batch file.

这并不一定意味着 Bootgen 没有安装。大多数情况下,只是当前命令提示符会话中尚未加载 AMD/Xilinx 开发环境。要解决此问题,请打开与 Vivado/Vitis 安装关联的AMD/Xilinx 命令提示符,或者通过执行settings64.bat文件手动加载 AMD/Xilinx 环境。例如:

</> cmd
C:\Xilinx\Vitis\2022.2\settings64.bat

安装路径可能因 Vivado/Vitis 版本和安装目录而异。加载环境后,请再次检查 Bootgen:

</> cmd
bootgen -help

如果环境已正确加载,Windows 现在应该能够识别 bootgen 命令。

运行Bootgen

在包含 .bit 文件和之前创建的 download.bif 文件的文件夹中打开CMD 窗口。然后执行以下命令:

</> cmd
bootgen -image download.bif -arch zynq -process_bitstream bin -w -o filename.bin
****** Xilinx Bootgen v2022.2.0
**** Build date : Oct 13 2022-12:22:51
** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
[INFO] : Bootimage generated successfully

现在,文件夹中已创建了一个名为filename.bit.bin的新文件。

重命名文件

</>  cmd
ren filename.bit.bin new_filename.bin

FPGA的传输和编程

在 Windows CMD中,使用 scp 命令将 .bin 文件复制到 Arty Z7:

</> cmd
scp filename.bin xilinx@ARTY_IP_ADDRESS:/home/xilinx/

从 Windows CMD连接到 Arty Z7 ,建立与 FPGA 的 SSH 连接:

</> cmd
ssh xilinx@ARTY_IP_ADDRESS

当系统提示输入密码时,请输入:

</> cmd
xilinx

连接到 Arty Z7 后,将二进制文件复制到 FPGA 固件目录:

</> Bash (ARTY)
sudo cp /home/xilinx/filename.bin /lib/firmware/

现在可以使用 Linux FPGA 管理器界面对 FPGA 进行编程:

</> Bash (ARTY)
echo filename.bin | sudo tee /sys/class/fpga_manager/fpga0/firmware

要检查FPGA是否编程成功,首先检查最新的内核消息:

</> Bash (ARTY)
dmesg | tail -20

然后检查当前FPGA管理器状态:

</> Bash (ARTY) 
cat /sys/class/fpga_manager/fpga0/state

如果编程成功,预期结果是:

</> Bash (ARTY)
operating

这表明 FPGA 已成功配置为使用生成的比特流。

LabVIEW 和 Python

LabVIEW 可以执行 Python 脚本,但并非所有 LabVIEW 版本都与所有 Python 版本兼容。Python 版本必须与所使用的 LabVIEW 版本兼容。下表总结了不同 LabVIEW 版本支持的 Python 版本:

| LabVIEW Versino                    | Compatible Python Versions      |
| LabVIEW 2018                       | Python 2.7, 3.6                 |
| LabVIEW 2019                       | Python 2.7, 3.6, 3.7            |
| LabVIEW 2020                       | Python 3.6, 3.7, 3.8            |
| LabVIEW 2021                       | Python 3.6, 3.7, 3.9            |
| LabVIEW 2022  Q1                   | Python 3.8, 3.9                 |
| LabVIEW 2022  Q3                   | Python 3.9                      |
| LabVIEW 2023  Q1                   | Python 3.9, 3,10                |
| LabVIEW 2023  Q3                   | Python 3.9, 3.10, 3.11          |
| LabVIEW 2024                       | Python 3.10, 3.11               |
| LabVIEW 2025                       | Python 3.11 and later versions  |

除了 Python 版本之外,系统架构也必须匹配。LabVIEW 和 Python 必须使用相同的架构:要么是32 位,要么是64 位。

Python

在安装所需软件包之前,最好先检查系统上已安装的 Python 版本。打开Windows 命令提示符 (CMD)并运行:

</> cmd
py --list

此命令显示计算机上已安装的 Python 版本。

如有必要,请从Python 官方网站下载与 LabVIEW 安装兼容的 Python 版本。请务必根据所使用的 LabVIEW 版本选择合适的架构,即32 位或 64 位。

安装所需的 Python 包

本项目使用Paramiko在 Python 和 Arty Z7 之间建立 SSH 连接。安装 Paramiko 之前,建议先更新到pip与将要使用的 Python 版本相匹配的版本。本项目选用的 Python 版本为3.9,32 位。

</> cmd
py -3.9-32 -m pip install --upgrade pip

由于同一台计算机上可能同时存在多个 Python 版本,因此在安装软件包时务必明确指定 Python 版本。这样可以防止软件包被安装到不同的 Python 环境中。

安装Cryptography

根据所使用的 Python 版本,安装 Paramiko 可能会导致与其依赖项的兼容性问题。特别是,Paramiko 需要cryptography包。对于较旧的 Python 版本,可能需要安装兼容版本的 cryptography 包。

本项目使用 Python 3.9 32 位版本:

</> cmd
py -3.9-32 -m pip install "cryptography==41.0.7"

安装 Paramiko

安装完cryptography兼容版本后,安装 Paramiko:

</> cmd
py -3.9-32 -m pip install "paramiko==3.4.0"

上述特定版本对应于本项目中使用的 Python 3.9 32 位环境。如果选择不同的 Python 版本,则所需的 Paramiko 和 Cryptography 版本可能有所不同。

Python脚本

Python 脚本将提供 LabVIEW 和 Arty Z7 之间的通信层。LabVIEW 将调用此脚本中的特定函数来建立 SSH 连接并与 FPGA 进行交互。

shebang

shebang用于指示应该使用哪个解释器来执行脚本。在本例中,它指定了 Python 3 解释器:

</> Python
#!/usr/bin/env python3

这样就可以在 Linux 系统中直接执行该脚本:

</> Bash
./filename.py

导入Paramiko

Paramiko是本项目中用于实现与 Arty Z7进行SSH 通信的 Python 库。

</> Python
import paramiko

定义登录凭据。用于访问 Arty Z7 的默认登录凭据定义为全局变量:

</> Python
USUARIO = "xilinx"
PASSWORD = "xilinx"

该USUARIO变量包含用户名和PASSWORD对应的密码。

创建 SSH 对象

变量 ssh 将包含表示与 FPGA 的 SSH 连接的对象。程序开始时,没有活动连接,因此将其初始化为 None:

</> Python
ssh = None

连接(主机) 函数

LabVIEW 通过函数访问 Python 脚本。因此,该脚本由一系列函数组成,每个函数执行特定任务,并可选择性地返回一个值。第一个函数是 get_task() connect(host)。它接收一个参数 ip,host该参数是一个字符串,包含Arty Z7 的 IP 地址。

</> Python
def connect(host):     
   global ssh 
   try:
         ssh = paramiko.SSHClient()
         ssh.set_missing_host_key_policy(
              paramiko.AutoAddPolicy()         
         )          
         ssh.connect(
              hostname=host,
              username=USUARIO,
              password=PASSWORD,
              timeout=10        
         )          
         return "FPGA connected" 
    except Exception as e:         
         return str(e)

该global ssh语句表明该函数将使用ssh先前定义的全局变量。该变量维护 SSH 连接对象,其中包含与 FPGA 的活动连接相关的信息。

</> Python
ssh = paramiko.SSHCliet()

这将创建一个SSHClientParamiko 提供的类的对象。此时,对象已创建,但尚未建立与 FPGA 的连接。

</> Python
ssh.set_missing_host_key_policy(  
     paramiko.AutoAddPolicy() 
)

SSH 使用加密主机密钥来识别远程计算机。首次连接到服务器时,标准 SSH 客户端可能会显示类似如下的消息:

The authenticity of host '...' can't be established.
Are you sure you want to continue connecting (yes/no)?

通常情况下,用户必须响应yes以接受主机密钥。aramiko.AutoAddPolicy()当主机密钥未知时,p 会自动执行相应的操作。这对于本项目来说非常方便,因为连接是通过 LabVIEW 和 Python 以编程方式建立的。

SSH 连接

</> Python
ssh.connect(
    hostname=host,
    username=USUARIO,
    password=PASSWORD,
    timeout=10
)

此指令用于建立与 FPGA 的 SSH 连接。原则上,它等同于从终端手动执行以下命令:

</> Bash
ssh xilinx@IP_ADDRESS

该host参数包含 Arty Z7 的 IP 地址。然后,该函数使用先前定义的用户名和密码对连接进行身份验证。该timeout=10参数指定连接尝试的最大等待时间为 10 秒。如果连接成功建立,该函数将返回以下字符串:

FPGA conectada

disconnect函数

该disconnect()函数关闭与 Arty Z7 的 SSH 连接,并返回一条消息,表明 FPGA 已断开连接。

</> Python
def disconnect():
    global ssh
    if ssh is not None:
        ssh.close()
        ssh = None
    return "FPGA disconnected"

execute(命令)函数

execute函数允许 LabVIEW通过 SSH 连接在 Arty Z7 上(command)执行Linux 命令。

</> Python
def execute(command):
    global ssh
    if ssh is None:
        return "No connection exists."
    stdin, stdout, stderr = ssh.exec_command(command)
    salida = stdout.read().decode()
    error = stderr.read().decode()
    if error != "":
        return error
    return salida

该函数接收一个参数,command其中包含要在 FPGA 上执行的 Linux 命令。首先,它会验证 SSH 连接是否存在:

</> Python
if ssh is None:
        return "No connection exists."

如果没有活动连接,该函数会立即返回错误消息。该命令使用 Paramiko 远程执行:

</> Python
stdin, stdout, stderr = ssh.exec_command(comando)

返回的三个对象分别对应于远程 Linux 进程的标准输入、标准输出和标准错误流。然后读取标准输出并将其从字节转换为 Python 字符串:

</> Python
salida = stdout.read().decode()

同样,Linux 命令产生的任何错误都会从标准错误流中读取:

</> Python
error = stderr.read().decode()

如果存在错误信息,该函数将返回该信息:

</> Python
if error != "":
    return error

否则,它返回命令输出:

</> Python
return salida

此功能对于 LabVIEW 接口尤其有用,因为它允许 LabVIEW 在 FPGA 上执行 Linux 命令,而无需用户手动打开 SSH 终端。

_execute_python(code) 函数

此功能允许 LabVIEW 以管理员权限(root)直接在 FPGA 的 Linux 系统上执行 Python 代码。这尤其有用,因为它允许 Python 代码访问诸如 FPGA 系统资源/dev/mem之类的资源,从而直接与 FPGA 设计中实现的硬件外设通信。

该code参数包含将发送到 Arty Z7 并在上面执行的 Python 代码。

</> Python
def _execute_python(code):
    global ssh
    if ssh is None:
        raise Exception("No connection to the FPGA.")
    stdin, stdout, stderr = ssh.exec_command(
        "sudo -S python3 -"
    )
    # Send password
    stdin.write(PASSWORD + "\n")
    # Send Python code
    stdin.write(code)
    stdin.flush()
    stdin.channel.shutdown_write()
    output = stdout.read().decode()
    error = stderr.read().decode()
    if error != "":
        # sudo normally prints the password prompt
        error = error.replace(
            "[sudo] password for xilinx:",
            ""
        ).strip()

        if error != "":
            raise Exception(error)
    return output

检查 SSH 连接

</> Python
global ssh

if ssh is None:
    raise Exception("No connection to the FPGA.")

这些代码行用于验证与 FPGA 之间是否存在有效的 SSH 连接。如果没有连接,该函数将停止并抛出异常。

以管理员权限执行 Python

</> Python
stdin, stdout, stderr = ssh.exec_command(
    "sudo -S python3 -"
)

这会将以下命令发送到运行在 Arty Z7 上的 Linux 系统:

sudo -S python3 -

sudo 命令用于以管理员权限运行 Python 解释器。-S 选项告诉 sudo 从标准输入(stdin)而不是键盘读取密码。这一点很重要,因为整个过程是由 LabVIEW 通过 Python 以编程方式控制的。

最后一条指令告诉 Python 从标准输入而不是文件.py中-读取程序。因此,Python 程序可以直接通过 SSH 连接发送。

发送密码

</> Python
stdin.write(PASSWORD + "\n")

发送 Python 代码

</> Python
stdin.write(code)

参数内容code随后被发送到运行在FPGA上的Python解释器。这意味着LabVIEW可以动态构建Python程序并将其直接发送到Arty Z7执行。此外,还可以创建完整的Python脚本,将其保存到FPGA上,然后使用相同的SSH机制从LabVIEW执行该脚本。

读取输出和错误信息

</> Python
output = stdout.read().decode()
error = stderr.read().decode()

定义readRegister(base, offset)函数

</> Python

def leerRegistro(base, offset):

    code = f"""
import os
import mmap
import struct

BASE = {base}
OFFSET = {offset}
SIZE = 0x10000

fd = os.open("
/dev/mem", os.O_RDWR | os.O_SYNC)

mem = mmap.mmap(
    fd,
    SIZE,
    mmap.MAP_SHARED,
    mmap.PROT_READ | mmap.PROT_WRITE,
    offset=BASE
)

mem.seek(OFFSET)

data = struct.unpack("
<I", mem.read(4))[0]

print(data)

mem.close()
os.close(fd)
"
""

    output = _execute_python(code)

    return int(output.strip())

该函数将 Python 程序构建为字符串,并使用_execute_python()前面描述的函数将其发送到 FPGA。

创建将要发送到 ARTY 的 Python 代码

</> Python
code = f"""
...
"
""

最终在 FPGA 上运行的 Python 代码负责访问与 FPGA 外设关联的物理内存。

导入所需库

</> Python (ARTY)

import os
import mmap
import struct

使用了三个Python库:

os提供对操作系统资源的访问,包括/dev/mem。

mmap允许将物理内存区域映射到 Python 进程中。

struct将从内存中读取的原始字节转换为 32 位整数。

定义内存参数

</> Python (ARTY)
BASE = {base}
OFFSET = {offset}
SIZE = 0x10000

这些变量定义了要访问的内存区域。BASE是分配给 FPGA 外设的基地址,而OFFSET标识该外设中的特定寄存器。因此,寄存器的物理地址为:

地址 = 基址 + 偏移量

SIZE = 0x10000定义了一个 64 KB 的内存映射窗口,对应于本项目中分配给 XADC 外设的地址空间。

打开 /dev/mem

</> Python (ARTY)
fd = os.open("/dev/mem", os.O_RDWR | os.O_SYNC)

/dev/mem提供对 Zynq 系统物理内存地址空间的访问权限。该os.open()函数以读/写权限打开此设备。返回值fd是一个文件描述符,将用于访问物理内存。该os.O_SYNC标志请求对设备的同步访问。

由于/dev/mem它提供了对物理内存的直接访问,因此 Python 代码必须以管理员权限执行。这就是前面的_execute_python()函数使用sudo的原因。

绘制物理内存图

</> Python (ARTY)
mem = mmap.mmap(
    fd,
    SIZE,
    mmap.MAP_SHARED,
    mmap.PROT_READ | mmap.PROT_WRITE,
    offset=BASE
)

这将创建一个与外设物理地址空间相对应的内存映射窗口。该mem变量表示此映射的内存区域。

映射从指定位置开始BASE,覆盖SIZE指定字节。映射完成后,即可将 FPGA 寄存器作为mem对象中的位置进行访问。

选择Register

</> Python (ARTY)
mem.seek(OFFSET)

这会将内存指针移动到映射区域内的目标寄存器。由于映射从 开始BASE,因此被访问的寄存器对应于:基址 + 偏移量。

Reading the Register

</> Python (ARTY)
data = struct.unpack("<I", mem.read(4))[0]

该mem.read(4)指令读取4 个字节,对应于一个 32 位 AXI 寄存器。该struct.unpack("<I", ...)函数将这 4 个字节转换为一个 32 位无符号整数。格式字符串<I指定:

<— 小端字节序。
I— 无符号 32 位整数。

struct.unpack()返回一个元组,因此[0]用于获取第一个元素:然后将结果值打印出来:

</> Python (ARTY)
print(data)

打印出的值将成为通过 SSH 连接返回的输出。

定义 writeRegister(base, offset, value) 函数

该writeRegister(base, offset, value)函数的工作原理与前面描述的函数类似readRegister()。主要区别在于,它不是读取寄存器,而是将一个 32 位值写入指定的内存地址。

</> Python (ARTY)
def escribirRegistro(base, offset, valor):

code = f"""
import os
import mmap
import struct

BASE = {base}
OFFSET = {offset}
VALUE = {valor}
SIZE = 0x10000

fd = os.open("
/dev/mem", os.O_RDWR | os.O_SYNC)

mem = mmap.mmap(
fd,
SIZE,
mmap.MAP_SHARED,
mmap.PROT_READ | mmap.PROT_WRITE,
offset=BASE
)

mem.seek(OFFSET)

mem.write(struct.pack("
<I", VALUE))

mem.close()
os.close(fd)

print("
OK")
"
""

output = _execute_python(code)

return output.strip()

执行写入操作的主要指令是:

</> Python (ARTY)
mem.write(struct.pack("<I", VALUE))

struct.pack("<I", VALUE)使用该值,以小端字节序将其转换为四个字节。然后将这四个字节写入位于以下地址的寄存器:BASE + OFFSET

定义takeData(samples)函数

该takeData(samples)函数与之前的寄存器访问函数类似,但它不是读取单个值,而是获取多个 ADC 样本并将其作为列表返回给 LabVIEW。

</> Python (ARTY)
def tomarDatos(muestras=50):

code = f"""
import os
import mmap
import struct

BASE = 0x43C00000
REG = 0x244
SIZE = 0x10000

fd = os.open("
/dev/mem", os.O_RDWR | os.O_SYNC)

mem = mmap.mmap(
fd,
SIZE,
mmap.MAP_SHARED,
mmap.PROT_READ | mmap.PROT_WRITE,
offset=BASE
)

for i in range({muestras}):

mem.seek(REG)

data = struct.unpack("
<I", mem.read(4))[0]

adc = (data >> 4) & 0x0FFF

print(adc)

mem.close()

os.close(fd)
"
""

output = _execute_python(code)

data = []

for line in output.splitlines():

line = line.strip()

if line != "":
data.append(int(line))

return data

在此函数中,XADC 外设基地址为:0x43C00000,用于获取 ADC 测量值的寄存器偏移量为:0x0244。因此,所访问的物理地址为:0x43C00000 + 0x0244 = 0x43C00244

LabVIEW

LabVIEW 程序相对简单。它只需要访问前面章节中描述的 Python 脚本,并调用每个任务所需的函数。在 LabVIEW 程序框图中,右键单击打开“函数选板” ,然后转到“连接”→“Python” 。在这里,可以找到“打开 Python 会话” 、“Python 节点”和“关闭 Python 会话” ,它们分别用于初始化 Python、调用 Python 脚本中的函数以及关闭 Python 会话。

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图13

框图

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图14

LabVIEW 程序框图包含初始化 Python、与 FPGA 建立 SSH 连接、请求 ADC 采样以及显示采集的数据所需的元素。

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图15

参考

https://docs.amd.com/r/en-US/ug480_7Series_XADC

https://www.hackster.io/jolobotero/labview-xadc-reader-for-arty-z7-af10bf

代码

重现此项目所需的所有文件,包括 Vivado 设计文件、Python 脚本和 LabVIEW 文件,都可以在项目的 GitHub 存储库中找到。

https://github.com/jolobotero/XADCLabVIEW


- -THE END- -


往期精选 

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图16 
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图17 

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图18
FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图19

FPGA技术江湖广发江湖帖

无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。


FPGA技术江湖微信交流群

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图20

加群主微信,备注姓名+学校/公司+专业/岗位进群


FPGA技术江湖QQ交流群

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图21

备注姓名+学校/公司+专业/岗位进群

FPGA也能做虚拟仪器:FPGA与LabVIEW的数据采集实践图22

关于科技区角:国内科技展会垂直内容策划服务商,提供从论坛内容全案策划、会展市场化IP打造到精准专业观众一站式邀约服务,以产业内容吸引高质量B端人群,打通展会从议题设计、演讲嘉宾邀约、宣传预热、精准邀观到供需对接全链路。
声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。
FPGA 仪器
more
国外大学生都用FPGA做什么项目(二十)
AMD 嵌入式计算峰会--自适应SoC|FPGA|边缘 AI|NPU|DSP|x86 嵌入式 等
牛!FPGA + 双 AD9288,轻松玩转便携式示波器
IC Coder 正式支持调用安路 TangDynasty(TD),打通国产 FPGA 全流程 AI 研发
22nm+23K LUTs混合架构,高云半导体FPGA实现创新引领
基于FPGA的分布式视频处理平台
国外大学生都用FPGA做什么项目(十九)
诺瓦校招FPGA专题 | FPGA大神觉醒计划开启!
【今晚七点开播!】“5人60天 vs 2人3天”:当FPGA开发遇上AI智能体,效率革命真的来了!
FPGA开源示波器
Copyright © 2025-成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号