news 2026/9/15 21:43:26

虚拟机中zynq下BRAM读写和网口测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
虚拟机中zynq下BRAM读写和网口测试

文章目录

  • 一、内容介绍
  • 二、实现步骤
    • 2.1 petalinux和vivado配置步骤
      • 2.1.1 vivado配置
      • 2.1.2 petalinux配置
      • 2.2 linux系统(串口)
        • 2.2.1 u-boot系统
        • 2.2.2 linux系统
    • 2.3 petalinux和vivado相关
      • 2.3.1 TCP服务器程序
    • 2.3.2 BRAM读写

一、内容介绍

ZYNQ的PL端读写BRAM,PS端网口通信相关内容

二、实现步骤

2.1 petalinux和vivado配置步骤

2.1.1 vivado配置

zynq:串口uart14-15
网口ENET 0
SD(使用SD卡启动要打开)
AXI BRAM Controller
Block Memory Genrator
自定义的PL端读取BRAM数据的IP核

生成.xsa文件用在petalinux配置中。

2.1.2 petalinux配置

petalinux-config --get-hw-description /mnt/hgfs/Share/7020_hdf/dds_signal_sd/
创建文件夹-基于.xsa配置-
file:///mnt/hgfs/Share/downloads
/mnt/hgfs/Share/sstate_arm/arm

sptl-petalinux-build

  1. 修改设备树
    /home/zynqxue/workspace/Embedded_vitis/linux_dds/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
    修改完成之后重新编译设备树
    petalinux-build -c device-tree
    编译整体:
    petalinux-build
#include<dt-bindings/gpio/gpio.h>#include<dt-bindings/input/input.h>#include<dt-bindings/media/xilinx-vip.h>#include<dt-bindings/phy/phy.h>/{model="Alientek Navigator Zynq Development Board";compatible="xlnx,zynq-zc702","xlnx,zynq-7000";leds{compatible="gpio-leds";gpio-led1{label="led2";gpios=<&gpio00GPIO_ACTIVE_HIGH>;default-state="on";};gpio-led2{label="led1";gpios=<&gpio054GPIO_ACTIVE_HIGH>;linux,default-trigger="heartbeat";};gpio-led3{label="ps_led0";gpios=<&gpio07GPIO_ACTIVE_HIGH>;default-state="on";};gpio-led4{label="ps_led1";gpios=<&gpio08GPIO_ACTIVE_HIGH>;linux,default-trigger="timer";};};
  1. 制作BOOT.BIN启动文件
    petalinux-package --boot --fsbl --fpga --u-boot --force

  2. 制作SD启动卡
    cp xxx /media/zynqxue/boot
    sync
    sudo umount /media/zynqxue/*

启动流程:
BootROM—>FSBL—>bitstream—>U-Boot—>ZImage—>RootFs
修改这部分"Image Packaging Configuration " 菜 单 下 的"Root filesystem
type(INITRAMFS)”子菜单下,BOOT.BIN的组成会不同。

(1) petalinux-config配置INITRD启动。
(a) boot块的内容:
BOOT.BIN 包含 zynq_fsbl.elf+u-boot.elf+system.dtb+system_wrapper.bit
image.ub 是打包后的 zImage + dtb + 根文件系统(推荐方式)
boot.scr 是启动脚本(非必须,看是否启用了)
把这三个文件放到sd卡的boot分区。

(b) rootfs无内容
(2) petalinux-config配置ext4(sd)启动。
(a) boot块的内容:
BOOT.BIN 包含 zynq_fsbl.elf+u-boot.elf
boot.scr
system.dtb
system_wrapper.bit
ZImage

(b) rootfs块的内容
解压bootfs.tar.gz的内容

2.2 linux系统(串口)

2.2.1 u-boot系统

查看SD卡的分区1中包含的文件,就是在ubuntu中写入的sd卡的启动文件。
ls mmc 0:1
启动linux内核
boot

2.2.2 linux系统
  1. 进入根目录
    cd /

  2. 查看根目录下的内容
    ls

  3. 查看设备的节点
    ls /proc/device-tree
    没有修改设备树,设备树是空的,节点情况:

    对应文件夹里面的节点内容(没有修改设备树,它也能正常识别?)

  4. petalinux自动识别xsa文件得到的设备树内容:
    这个路径下:
    /petalinux/Bdds-dds/components/plnx_workspace/device-tree/device-tree
    system-top.dts顶层设备树(包含 AXI 外设等)
    pl.dtsiPL部分,Vivado生成的(比如 axi_bram_ctrl@40000000 )
    psu.dtsi / zynq-7000.dtsiPS部分,标准片上系统外设,不能修改
    system-conf.dtsi默认基础配置文件(不能修改)
    pcw.dtsi描述 Vivado PS 外设启用状态
    system-user.dtsi可以自定义的额外内容(project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi)

2.3 petalinux和vivado相关

2.3.1 TCP服务器程序

编写应用程序:

设置交叉编译环境:
. /opt/petalinux/2020.2/environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi
生成可执行文件:
$CC tcp_server.c -o tcp_server
把应用程序的可执行文件放在SD卡的第二分区:
cp tcp_server /media/zynqxue/rootfs/appfile

在linux系统下的路径:
/media/sd-mmcblk0p2/appfile#
配置开发板IP(192.168.1.10):
ifconfig eth0 192.168.1.10 up

执行TCP服务器程序:
root@Bdds-dds:/media/sd-mmcblk0p2/appfile# ./tcp_server

使用网口调试工具进行连接

在ubuntu两个终端进行代码验证
打开终端 A,运行你写的服务器:
gcc tcp_server.c command_parser.c -o tcp_serve
./tcp_server
终端 A输出:
Received: :FREQ 5.1;:POW 12.5;:FREQ?;:POW?;:FOO


打开终端 B,运行客户端测试工具(如 nc):
nc 127.0.0.1 8080
在终端 B 输入:
:FREQ 5.1;:POW 12.5;:FREQ?;:POW?;:FOO
终端 B 输出
FREQ SET TO 5.100000 MHz
POWER SET TO 12.50 dBm
FREQ: 5.100000 MHz
POWER: 12.50 dBm
ERROR: Unknown Command

2.3.2 BRAM读写

/dev/mem 使用需要 root 权限(一般 rootfs 启动就是 root)

地址 0x40000000 和 0x43C00000 等应与你的设备树匹配(可用 cat /proc/iomem 验证)

如果你想做内核态驱动方案(推荐长期稳定),可以将这些 readl/writel 代码改为 platform_driver 驱动方式

bram_ptr = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, BRAM_BASEADDR);
从 mem_fd 打开的设备(如 /dev/mem)中,以读写权限、共享方式,将 BRAM_BASEADDR 开始的物理地址空间映射到用户进程虚拟地址空间中,映射大小为 MAP_SIZE 字节(例如 0x1000 = 4KB)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 21:42:39

WorkBuddy工作流实战:零代码构建确定性AI办公工序

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 21:40:32

跨境电商哪个平台好速查手册新手建站避坑指南

跨境电商哪个平台好速查手册新手建站避坑指南 别再盯着那些千篇一律的模板网站了,真的,太丑了,根本撑不起你的品牌,更别谈转化了。 很多刚入局的朋友问我,跨境电商哪个平台好?其实,平台只是货架,你的独立站才是门面。今天这份 速查手册 ,专门帮创业团队负责人把独立站从丑到美、从慢到快,彻底梳理清楚。…

作者头像 李华
网站建设 2026/9/15 21:38:43

ADRC自抗扰控制原理与STM32工程实践

简介&#xff1a;本资源是一个面向自动控制领域初学者与工程实践者的ADRC&#xff08;自抗扰控制&#xff09;技术学习包&#xff0c;聚焦于PID控制器在干扰抑制场景下的增强方案&#xff0c;适用于电力电子、运动控制、机电系统等需强鲁棒性调节的工程应用。压缩包共10个文件&…

作者头像 李华
网站建设 2026/9/15 21:37:30

嵌入式固件下载全解析:JTAG/SWD/OTA/UART/USB五维实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 21:37:11

C语言指针的本质:内存访问契约与所有权模型

1. 指针不是“变量的地址”&#xff0c;而是“内存访问的契约”很多人学指针&#xff0c;第一句话就被带偏了&#xff1a;“指针就是存储地址的变量”。这句话技术上没错&#xff0c;但致命地误导了初学者——它把指针降格为一个“装数字的盒子”&#xff0c;而忽略了它最核心的…

作者头像 李华