新闻详情

新闻详情

首页 / 资讯中心 / 详情

axis stream data通过DMA S2MM写入DDR

发布时间:2026/9/27 15:17:59来源:尧图网络
axis stream data通过DMA S2MM写入DDR
今天我做了如下实验axis stream data通过DMA S2MM写入DDRPS读取DDR并通过串口打印其中axis stream data的触发是通过按键完成并且在调试过程中发现一个有意思的问题即“我首先在SDK点击Debug包含program FPGA然后我又在vivado重新Program device出现了ila我设置了key_pressed1为trigger条件在SDK端点击Run之前我按了按键ila捕捉到source_tready在key_pressed1之前一直为高电平有效之后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_tkeep4b1111; 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] //这样告诉 Vivadoila_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
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Deepseek-R1 评测:开源人工智能革命击败 GPT-4 和 Claude 3.5,TaoToken 统一 Key 接入实测 2026/9/27 16:12:29

Deepseek-R1 评测:开源人工智能革命击败 GPT-4 和 Claude 3.5,TaoToken 统一 Key 接入实测

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

阅读更多 →
OpenClaw 三层架构实战拆解:Channels、Gateway、LLM 协同链路与 TaoToken 配置骨架 2026/9/27 16:12:22

OpenClaw 三层架构实战拆解:Channels、Gateway、LLM 协同链路与 TaoToken 配置骨架

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

阅读更多 →
【Bug已解决】Codex 报错 MCP client for context7 failed to start: program not found 解决方案:从 npx 路径到 config.to 2026/9/27 16:12:15

【Bug已解决】Codex 报错 MCP client for context7 failed to start: program not found 解决方案:从 npx 路径到 config.to

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

阅读更多 →
MCP 通信协议演进:从 SSE 双通道到 Streamable HTTP 的配置迁移指南 2026/9/27 16:12:03

MCP 通信协议演进:从 SSE 双通道到 Streamable HTTP 的配置迁移指南

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

阅读更多 →
3分钟搞定wordpress字符串函数,一文搞懂不踩坑 2026/9/27 16:12:02

3分钟搞定wordpress字符串函数,一文搞懂不踩坑

3分钟搞定wordpress字符串函数,一文搞懂不踩坑 改个需求建站公司拖一周?别被忽悠了。其实很多看似复杂的后台逻辑调整,核心就是几行代码的事。今天咱们不整虚的,直接 一文搞懂 WordPress…

阅读更多 →
在 Claude Code 里用 TaoToken 配 oh-my-claudecode:魔法关键词与 Hook 的无摩擦配置骨架 2026/9/27 16:11:56

在 Claude Code 里用 TaoToken 配 oh-my-claudecode:魔法关键词与 Hook 的无摩擦配置骨架

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉