Zynq学习笔记--AXI4-Stream 图像数据从仿真输出到图像文件
目录1. 简介2. 构建工程2.1 Vivado 工程2.2 TestBench 代码2.3 关键代码分析3. VPG Background Pattern ID (0x0020) Register4. 总结1. 简介使用 SystemVerilog 将 AXI4-Stream 图像数据从仿真输出到图像文件 (PPM)。用到的函数包括 $fopen、$fwrite 和 $fclose。PPM 格式PPM (Portable Pixmap Format) 是一种简单的图像文件格式用于存储彩色图像。PPM 格式很简单主要用于科研或某些需要图像处理但不需要复杂图像格式的场合。PPM 文件通常较大因为它们不使用压缩。一个 PPM 文件由一个文件头和图像数据体组成。文件头指定了图像的宽度、高度和最大颜色值而数据体则包含按顺序排列的像素颜色值每个像素颜色通常由红、绿、蓝三个颜色分量组成。2. 构建工程2.1 Vivado 工程2.2 TestBench 代码timescale 1ns / 1ps import axi_vip_pkg::*; import design_1_axi_vip_0_0_pkg::*; module tb_tpg(); bit aclk 0, aresetn 0; xil_axi_resp_t resp; bit tpg_tready 1, tpg_tuser, tpg_tvalid, tpg_tlast; bit [23:0] tpg_tdata; integer counter_width 0, counter_height 0; integer final_width 0, final_height 0; integer output_file; integer img_writing 1, img_start 0; parameter integer tpg_base_address 12h000; parameter integer TPG_CONTROL_REG tpg_base_address; parameter integer TPG_ACTIVE_H_REG tpg_base_address 8h10; parameter integer TPG_ACTIVE_W_REG tpg_base_address 8h18; parameter integer TPG_BG_PATTERN_REG tpg_base_address 8h20; integer height400, width640; integer pattern_id 8h09; always #10ns aclk ~aclk; design_1_wrapper UUT ( .aclk_50MHz (aclk ), .aresetn_0 (aresetn ), .tpg_tdata (tpg_tdata ), .tpg_tlast (tpg_tlast ), .tpg_tready (tpg_tready), .tpg_tuser (tpg_tuser ), .tpg_tvalid (tpg_tvalid)); initial begin #350ns aresetn 1; (posedge tpg_tuser); // Start of the first frame (posedge tpg_tuser); // Start of the second frame, stop the simulation wait (tpg_tuser 1b0); #20ns; if((final_height height)(final_height height)) $display(Resolution match, test succeeded); else $display(Resolution do not match, test failed); $finish; end design_1_axi_vip_0_0_mst_t master_agent; initial begin master_agent new(master vip agent,UUT.design_1_i.axi_vip_0.inst.IF); master_agent.start_master(); wait (aresetn 1b1); #200ns master_agent.AXI4LITE_WRITE_BURST(TPG_ACTIVE_H_REG, 0, height, resp); master_agent.AXI4LITE_WRITE_BURST(TPG_ACTIVE_W_REG, 0, width, resp); master_agent.AXI4LITE_WRITE_BURST(TPG_BG_PATTERN_REG, 0, pattern_id, resp); #200ns master_agent.AXI4LITE_WRITE_BURST(TPG_CONTROL_REG, 0, 8h81, resp); end always (posedge aclk) begin if((tpg_tvalid 1) (tpg_tready 1)) begin if(tpg_tlast 1) begin final_width counter_width 1; counter_width 0; end else counter_width counter_width 1; end end always (posedge aclk) begin if((tpg_tvalid 1) (tpg_tready 1)) begin if(tpg_tuser 1) begin final_height counter_height; counter_height 0; end else if(tpg_tlast 1) counter_height counter_height 1; end end initial begin output_file $fopen(image_out_1.ppm, w); $fwrite(output_file, P3\n); $fwrite(output_file, %0d %0d\n, width, height); $fwrite(output_file, %0d\n, 2**8-1); while(img_writing 1) begin (posedge aclk) #1ns; if ((tpg_tvalid 1) (tpg_tready 1)) begin if((tpg_tuser 1) (img_start 1)) img_writing 0; else begin if(tpg_tuser 1) img_start 1; $fwrite(output_file, %0d\n%0d\n%0d\n, int(tpg_tdata[23:16]), int(tpg_tdata[7:0]), int(tpg_tdata[15:8])); end end end $fclose(output_file); $display(Image written); end endmodule2.3 关键代码分析initial begin output_file $fopen(image_out_1.ppm, w); $fwrite(output_file, P3\n); $fwrite(output_file, %0d %0d\n, width, height); $fwrite(output_file, %0d\n, 2**8-1); while(img_writing 1) begin (posedge aclk); #1ns; if ((tpg_tvalid 1) (tpg_tready 1)) begin if((tpg_tuser 1) (img_start 1)) img_writing 0; else begin if(tpg_tuser 1) img_start 1; $fwrite(output_file, %0d\n%0d\n%0d\n, int(tpg_tdata[23:16]), int(tpg_tdata[ 7: 0]), int(tpg_tdata[15:8])); end end end $fclose(output_file); $display(Image written); end文件创建与头信息写入使用 $fopen 函数打开或创建一个新的文件image_out_1.ppm用于写入模式w。利用 $fwrite 函数向文件写入PPM图像的头信息P3\nPPM文件的格式标识表示该文件是一个ASCII编码的彩色PPM图像。%0d %0d\n接下来写入图像的宽度width和高度height这两个数值应该在代码的其他部分定义。%0d\n写入颜色的最大值这里是2**8-1即255表示每个颜色通道红、绿、蓝的最大值。图像数据写入代码进入一个while循环循环条件是 img_writing 等于1这意味着将在满足某些条件时写入图像数据。在每个时钟周期的上升沿(posedge aclk)并在等待1纳秒#1ns;后检查tpg_tvalid和tpg_tready信号。只有当这两个信号都为1时才会执行数据写入的逻辑。如果tpg_tuser信号为1且img_start也为1这表示图像数据的结束将img_writing设置为0退出循环。如果仅tpg_tuser为1这意味着图像数据的开始设置img_start为1。在其他情况下使用$fwrite函数将图像数据tpg_tdata写入文件。这里的数据被分解为红、蓝、绿三个颜色通道并按顺序写入文件。文件关闭与信息显示使用$fclose函数关闭文件。通过$display函数在仿真控制台显示“Image written”信息表示图像数据已成功写入文件。if ((tpg_tvalid 1) (tpg_tready 1)) begin if((tpg_tuser 1) (img_start 1)) img_writing 0; // 第二帧开始后img_writing标记为0 else begin if(tpg_tuser 1) img_start 1; // 第一帧开始img_start标记为1 $fwrite(output_file, %0d\n%0d\n%0d\n, xxx); // 第一、二帧之间逐个像素写入 end end3. VPG Background Pattern ID (0x0020) Register背景模式 ID 寄存器控制 TPG Core 生成的模式操作。该寄存器根据以下值控制核心输出的模式0x00 - 直接将视频输入传递到视频输出0x1 - 水平坡道每个分量RGB或Y水平增加10x2 - 垂直坡道每个分量RGB或Y垂直增加10x3 - 时间坡道根据运动速度寄存器设置的值每帧逐像素增加0x4 - 纯红色输出0x5 - 纯绿色输出0x6 - 纯蓝色输出0x7 - 纯黑色输出0x8 - 纯白色输出0x9 - 色条0xA - 区域板输出产生一个基于ROM的正弦模式。此选项依赖于运动速度、zplate水平起点、zplate水平增量、zplate垂直起点和zplate垂直增量寄存器。0xB - 方格色条0xC - 绘制十字交叉线模式0xD - 色彩扫描模式0xE - 组合的垂直和水平坡道0xF - 黑白棋盘0x10 - 伪随机模式0x11 - DisplayPort颜色坡道0x12 - DisplayPort黑白垂直线0x13 - DisplayPort彩色方块4. 总结本文介绍了如何使用 SystemVerilog 将 AXI4-Stream 图像数据输出到 PPM 格式的图像文件中。通过使用 $fopen、$fwrite 和 $fclose 函数成功地将仿真生成的图像数据写入到文件中实现了图像数据的输出。在 TestBench 代码中设置了图像的分辨率和颜色模式并通过循环逐像素地写入数据。通过这种方式我们可以将仿真生成的图像数据保存为 PPM 格式的文件方便后续的图像处理和分析。这种方法可以帮助开发人员在仿真过程中方便地将图像数据输出到文件中以便进行后续的验证和分析工作。

相关新闻

深度对比:TencentDB Agent Memory vs 传统向量数据库,谁才是AI记忆最佳选择?

深度对比:TencentDB Agent Memory vs 传统向量数据库,谁才是AI记忆最佳选择?

深度对比:TencentDB Agent Memory vs 传统向量数据库,谁才是AI记忆最佳选择? 【免费下载链接】TencentDB-Agent-Memory TencentDB Agent Memory is a team-level memory hub for AI Agents — turning conversations, docs, and code into fo…

2026/8/7 18:00:44 阅读更多 →
大规模AWS迁移实战:GoDaddy和Atlassian的云转型之路

大规模AWS迁移实战:GoDaddy和Atlassian的云转型之路

大规模AWS迁移实战:GoDaddy和Atlassian的云转型之路 【免费下载链接】howtheyaws A curated collection of publicly available resources on how technology and tech-savvy organizations around the world use Amazon Web Services (AWS) 项目地址: https://gi…

2026/8/7 18:00:44 阅读更多 →
Unity随机数系统深度解析:从Random.Range到确定性模拟与高性能随机

Unity随机数系统深度解析:从Random.Range到确定性模拟与高性能随机

1. 项目概述:为什么Unity开发者需要重新审视Random.Range? 如果你在Unity项目里写过 Random.Range(0, 10) ,然后觉得随机数生成这事儿已经搞定了,那这篇文章就是为你准备的。我见过太多项目,从简单的敌人随机刷新&am…

2026/8/7 18:00:44 阅读更多 →

最新新闻

leaflet-omnivore常见问题解答:解决跨域请求与格式解析错误的终极方案

leaflet-omnivore常见问题解答:解决跨域请求与格式解析错误的终极方案

leaflet-omnivore常见问题解答:解决跨域请求与格式解析错误的终极方案 【免费下载链接】leaflet-omnivore universal format parser for Leaflet & Mapbox.js 项目地址: https://gitcode.com/gh_mirrors/le/leaflet-omnivore leaflet-omnivore是一款强大…

2026/8/7 19:53:22 阅读更多 →
Scroll Reverser终极指南:3步解决macOS滚动方向混乱问题

Scroll Reverser终极指南:3步解决macOS滚动方向混乱问题

Scroll Reverser终极指南:3步解决macOS滚动方向混乱问题 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser Scroll Reverser是一款专为macOS设计的免费开源工具&#xf…

2026/8/7 19:53:22 阅读更多 →
三步搞定全网小说自由阅读:Uncle小说PC版完全指南

三步搞定全网小说自由阅读:Uncle小说PC版完全指南

三步搞定全网小说自由阅读:Uncle小说PC版完全指南 【免费下载链接】uncle-novel 📖 Uncle小说,PC版,一个全网小说下载器及阅读器,目录解析与书源结合,支持有声小说与文本小说,可下载mobi、epub、…

2026/8/7 19:53:22 阅读更多 →
Vue 3 + ECharts 5 构建高性能金融分时图与交易量联动图表实战

Vue 3 + ECharts 5 构建高性能金融分时图与交易量联动图表实战

1. 项目概述与核心价值 最近在做一个金融数据可视化相关的项目,核心需求是把股票的分时走势和交易量变化清晰地展示出来。市面上很多现成的图表库要么太重,要么定制化程度不够,尤其是在处理高频、实时更新的金融数据时,性能和交互…

2026/8/7 19:53:22 阅读更多 →
AI代理网络安全:Agent Governance Toolkit通信加密与防护机制

AI代理网络安全:Agent Governance Toolkit通信加密与防护机制

AI代理网络安全:Agent Governance Toolkit通信加密与防护机制 【免费下载链接】agent-governance-toolkit AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents…

2026/8/7 19:53:22 阅读更多 →
Seamly2D完整指南:开源服装制版软件从入门到精通

Seamly2D完整指南:开源服装制版软件从入门到精通

Seamly2D完整指南:开源服装制版软件从入门到精通 【免费下载链接】Seamly2D Open source patternmaking software to democratize fashion. 项目地址: https://gitcode.com/gh_mirrors/se/Seamly2D Seamly2D是一款功能强大的开源服装制版软件,致力…

2026/8/7 19:52:22 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →