news 2026/9/27 15:17:55

axis stream data通过DMA S2MM写入DDR

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
axis stream data通过DMA S2MM写入DDR

今天我做了如下实验:axis stream data通过DMA S2MM写入DDR,PS读取DDR并通过串口打印,其中axis stream data的触发是通过按键完成,并且在调试过程中发现一个有意思的问题,即
“我首先在SDK点击Debug,包含program FPGA,然后我又在vivado重新Program device,出现了ila,我设置了key_pressed==1为trigger条件,在SDK端点击Run之前我按了按键,ila捕捉到source_tready在key_pressed==1之前一直为高电平(有效),之后source_tready有效持续4个时钟周期,然后又被拉低,此时我返回SDK点击Run,收到的是丢失前四个数据的结果。”

该错误操作下的ila抓包结果如下:

再次运行debug,并先在PS端启动DMA,后进行按键启动数据传输,ila抓包如下,此时PS串口也输出了完整的8个数据。

结论:一定要确保axis stream data在source_tready真正有效之后再进行传输。

其中PS端对DDR的配置和轮询程序如下:

#include "xparameters.h" #include "xaxidma.h" #include "xil_printf.h" #include "xil_cache.h" #include "sleep.h" #define DMA_DEV_ID XPAR_AXI_DMA_0_DEVICE_ID #define DDR_BUFFER_ADDR 0x10000000 #define TRANSFER_LENGTH 32 XAxiDma AxiDma; int main(void) { XAxiDma_Config *ConfigPtr; xil_printf("\r\n"); xil_printf("----- AXI DMA S2MM Test -----\r\n"); //1. 查找 DMA 配置 ConfigPtr = XAxiDma_LookupConfig(DMA_DEV_ID); //2. 初始化 DMA XAxiDma_CfgInitialize(&AxiDma, ConfigPtr); //3. 禁用 S2MM 中断,当前我们采用轮询方式 XAxiDma_IntrDisable( &AxiDma, XAXIDMA_IRQ_ALL_MASK, XAXIDMA_DEVICE_TO_DMA ); //4. 清空 DDR Buffer u32 *BufferPtr = (u32 *)DDR_BUFFER_ADDR; for (int i = 0; i < 8; i++) { BufferPtr[i] = 0xAAAAAAAA; } // 5. Flush Cache Xil_DCacheFlushRange( DDR_BUFFER_ADDR, TRANSFER_LENGTH ); xil_printf("\r\n"); xil_printf("DDR buffer initialized.\r\n"); XAxiDma_SimpleTransfer( &AxiDma, DDR_BUFFER_ADDR, TRANSFER_LENGTH, XAXIDMA_DEVICE_TO_DMA ); xil_printf("DMA S2MM is armed.\r\n"); xil_printf("Please press KEY to start PL data transmission.\r\n"); // 6. 等待 DMA 接收完成 while (XAxiDma_Busy( &AxiDma, XAXIDMA_DEVICE_TO_DMA )) {;} xil_printf("DMA transfer completed.\r\n"); // 7. Invalidate Cache Xil_DCacheInvalidateRange( DDR_BUFFER_ADDR, TRANSFER_LENGTH ); // 8. 读取 DDR xil_printf("\r\n"); xil_printf("DDR data:\r\n"); for (int i = 0; i < 8; i++) { xil_printf( "DDR[%d] = 0x%08lx\r\n", i, BufferPtr[i] ); } xil_printf("\r\n"); xil_printf("----- Test Finished -----\r\n"); return XST_SUCCESS; }

PL中有一部分关于ILA的使用需要注意,这里我将自己的source文件作为RTL module加入到了block design中了,ila_0 不要作为一个独立 OOC 子设计处理,而是跟 pll_clock_top 一起综合。

module pll_clock_top( input clk, input rstn, input key, output [3:0] leds, output source_tvalid, output source_tlast, output [31:0]source_tdata, output [3:0] source_tkeep, input source_tready, //output key_pressed, //input start //input start ); //============================= // Key debounce //============================== wire key_state,key_pressed,key_released; key_debounce inst_key_debounce( .clk(clk), .rstn(rstn), .key(key), .key_state(key_state), .key_pressed(key_pressed), .key_released(key_released) ); //======================== // LED //============================ led_blink inst_led_blink( .clk(clk), .rstn(rstn), .key_pressed(key_pressed), .leds(leds) ); assign source_tkeep=4'b1111; axis_test_source inst_axis_test_source( .clk(clk), .rstn(rstn), .start(key_pressed), .m_tdata(source_tdata), .m_tvalid(source_tvalid), .m_tlast(source_tlast), .m_tready(source_tready) ); //set_property generate_synth_checkpoint 0 [get_files ila_0.xci] //这样告诉 Vivado:ila_0 不要作为一个独立 OOC 子设计处理,而是跟 pll_clock_top 一起综合。 ila_0 your_instance_name ( .clk(clk), // input wire clk .probe0(key_pressed), // input wire [0:0] probe0 .probe1(source_tvalid), // input wire [0:0] probe1 .probe2(source_tlast), // input wire [0:0] probe2 .probe3(source_tready), // input wire [0:0] probe3 .probe4(source_tdata) // input wire [31:0] probe4 ); endmodule
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 15:17:50

3步搞定免费搭建自助网站,性能优化让访问快如闪电

3步搞定免费搭建自助网站,性能优化让访问快如闪电 改个需求建站公司拖一周,改个颜色还要加钱?这种憋屈日子,今天必须终结。 别被“免费搭建自助网站”这四个字骗了,以为只是拖拖拽拽的模板站。真正的免费自助,是给你一套可掌控的代码骨架,让你像搭积木一样组装业务逻辑。但光能搭起来不够, 性能优化…

作者头像 李华
网站建设 2026/9/27 15:17:23

潍坊网页设计公司避坑指南:3招搞定备案与性能优化

潍坊网页设计公司避坑指南:3招搞定备案与性能优化 备案流程一头雾水,导致网站上线延迟三个月?在潍坊做网页设计,很多老板和运营最头疼的不是代码怎么写,而是合规怎么过,速度怎么提。很多团队花大价钱找了潍坊网页设计公司,结果因为备案卡壳,或者加载速度太慢,用户留不住,钱都打水漂了。…

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

wordpress怎么改端口适合什么场景

WordPress改端口避坑指南:3种方案对比评测与深度加固 做网站最崩溃的时刻是什么?不是代码报错,而是备案流程一头雾水。 很多人以为改个端口就能避开监管,结果备案卡住,网站打不开。 别慌,这篇对比评测帮你理清思路,用W3C 标准规范操作,安全又合规。 威胁场景:为什么要动端口?…

作者头像 李华
网站建设 2026/9/27 15:16:31

宣传类的网站有哪些内容保姆级教程

宣传类网站有哪些内容图解步骤与避坑指南 改个需求建站公司拖一周,这种憋屈事你肯定干过。明明只是换个Banner图,对方却要排期三天,理由是“涉及前端重构”。别信这套,大部分宣传类网站的内容结构是固定的,根本不需要动代码。今天把【宣传类的网站有哪些内容】拆解清楚,配合【图解步骤】,让你一眼看懂哪些能改…

作者头像 李华
网站建设 2026/9/27 15:16:28

网站建设乐达云创实战:网站被黑挂马自救与5大注意事项

网站建设乐达云创实战:网站被黑挂马自救与5大注意事项 昨晚凌晨两点,我的手机突然疯狂震动。客服后台炸了,客户在群里@我:“你们网站怎么变成博彩广告了?!”我心脏猛地一缩,这种 网站被黑挂马不知道怎么办 的恐慌感,每个做站的人都不陌生。更糟糕的是,谷歌刚刚把我们的首页移出了索引,SEO工作前功尽弃。…

作者头像 李华
网站建设 2026/9/27 15:16:00

代练中介网站有得做吗?对比评测安全坑与域名服务器避坑指南

代练中介网站有得做吗?对比评测安全坑与域名服务器避坑指南 域名服务器搞不懂,代码写了一堆全白搭。很多想做代练中介站的后端新手,盯着【代练中介网站有得做吗】这个问题纠结半天,却忽略了最致命的隐患:你的服务器配置和域名解析,可能正在把用户隐私直接暴露在黑客面前。今天不聊虚的,直接通过【对比评测】几种常见…

作者头像 李华