请选择 进入手机版 | 继续访问电脑版
[X]关闭

米联客-XILINX-H3_CZ08_7100] FPGA_AXI总线入门连载-12AXI-Stream 发数据到 PS(DMA)

文档创建者:FPGA课程
浏览次数:210
最后更新:2024-10-15
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 3-FPGA AXI 总线入门
本帖最后由 FPGA课程 于 2024-10-15 18:40 编辑

​软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1 概述
本文在 AXI_DMA_LOOP  环路测试架构的基础上,在 DATA FIFO  端加入 FPGA  代码,对 FIFO  写,实现将 PL  端数据 通过 DMA  发送给 PS  功能。
本文实验目的:
1:掌握编程 PL 代码,以 AXI-Stream 协议把数据通过 DMA 发送到 PS DDR
2:通过 VITIS-SDK 编程实现数据的接收
3:通过 VITIS-SDK 观察 PS 内存中接收到的数据是否正确。
2 搭建 SOC 系统工程
新建一个名为为 zu_prj 的工程,之后创建一个 BD 文件,并命名为 system ,添加并且配置好 ZYNQ Ultrascale+ MPSOC IP 。读者需要根据自己的硬件类型配置好输入时钟频率、 内存型号、串 口,连接时钟等。新手不清楚这些 内容的,请参考“3-2-01_ex_soc_base .pdf” “01 HelloWold/DDR/网口测试 ”这篇文章。
e2bd45a1e99d4693ada7d851f056557b.jpg
2.1PS 部分设置
1:PS 复位设置
b904bf48359e43e78beaa5b0282a3e99.jpg
2:设置 PS GP 接口和 HP 接口
f03feec1f78a4a9c8cfd3e97e2b9d472.jpg
3:设置 PL PS 的中断
Interurpts-->勾选 Fabric Interrupt ,勾选 IRQ_F2P[15:0]。
2d41c657f62c4fbf9db6564139e52381.jpg
4:设置 PL 的时钟
勾选 PL0 ,设置为 100 ,即 PS 的 PLL 提供本系统的时钟 100MHZ。
399086d81d1e4ea2b4ef4d8bef0ca8ad.jpg
2.2 添加 IP
单击添加IP 按钮“ 3c4226043caf4f8da211fe4f213bbda9.jpg ​编辑” ,输入如下模块 IP 名字的关键词,并双击添加。

807d1b75ca244202b133aa4b027d45bc.jpg
2.3IP 设置
设置 Wideh of buffer length register  :23 。(寄存器设置最大为 26,即 2 的 26 次方 64M 大小,这里设置 23bit  就 够用了,长度越大,需要的资源也就越多)
这里也只要使用DMA 写通道,
edb74d2735f340a4a3f7ba737e68db21.jpg
Data FIFO 设置 TDATA Width 为 4。
2dcdf4894053420fb0aee602852324dd.jpg
2.4PL 图形编程
下图中可以看到 FIFO 的 S_AXIS 接口引出到了外部的FPGA 代码中,所以后面我们需要编写合适的 AXI-Stream FPGA 代码来写 FIFO。
62c27ee80f2e4b7b998a035eb440817a.jpg
2.5 地址空间分配
cdf9a48cc4304fb9aa708d2c0cb0ec83.jpg
2.6 编写 AXI-Stream 写代码
如下图中,system_dma_top.v 代码是可以实现对 FPGA 图形设计代码的调用。
0590d24c88014316b8b88396f98d3618.jpg
现在我们看看 system_dma_top.v 中如何利用 axi-stream 协议完成对 fifo 的写操作。
  1. module system_wrapper
  2. (
  3. inout [14:0]DDR_addr,
  4. inout [2:0]DDR_ba,
  5. inout DDR_cas_n,
  6. inout DDR_ck_n,
  7. inout DDR_ck_p,
  8. inout DDR_cke,
  9. inout DDR_cs_n,
  10. inout [3:0]DDR_dm,
  11. inout [31:0]DDR_dq,
  12. inout [3:0]DDR_dqs_n,
  13. inout [3:0]DDR_dqs_p,
  14. inout DDR_odt,
  15. inout DDR_ras_n,
  16. inout DDR_reset_n,
  17. inout DDR_we_n,
  18. inout FIXED_IO_ddr_vrn,
  19. inout FIXED_IO_ddr_vrp,
  20. inout [53:0]FIXED_IO_mio,
  21. inout FIXED_IO_ps_clk,
  22. inout FIXED_IO_ps_porb,
  23. inout FIXED_IO_ps_srstb

  24. );

  25. reg  [31:0]W_data_i_0;
  26. wire W_wren_i_0;
  27. wire [0:0]dma_rstn;
  28. wire [0:0]dma_start;
  29. wire pl_clk;

  30. assign W_wren_i_0 = dma_start;

  31. always @(posedge pl_clk)begin
  32.     if(dma_rstn == 1'b0)
  33.         W_data_i_0 <= 0;
  34.     else if(dma_start )
  35.         W_data_i_0 <= W_data_i_0 + 1'b1;

  36. end

  37. system system_i
  38. (
  39. .DDR_addr(DDR_addr),
  40. .DDR_ba(DDR_ba),
  41. .DDR_cas_n(DDR_cas_n),
  42. .DDR_ck_n(DDR_ck_n),
  43. .DDR_ck_p(DDR_ck_p),
  44. .DDR_cke(DDR_cke),
  45. .DDR_cs_n(DDR_cs_n),
  46. .DDR_dm(DDR_dm),
  47. .DDR_dq(DDR_dq),
  48. .DDR_dqs_n(DDR_dqs_n),
  49. .DDR_dqs_p(DDR_dqs_p),
  50. .DDR_odt(DDR_odt),
  51. .DDR_ras_n(DDR_ras_n),
  52. .DDR_reset_n(DDR_reset_n),
  53. .DDR_we_n(DDR_we_n),
  54. .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
  55. .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
  56. .FIXED_IO_mio(FIXED_IO_mio),
  57. .FIXED_IO_ps_clk(FIXED_IO_ps_clk),
  58. .FIXED_IO_ps_porb(FIXED_IO_ps_porb),
  59. .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),
  60. .W_data_i_0(W_data_i_0),
  61. .W_wren_i_0(W_wren_i_0),
  62. .dma_rstn(dma_rstn),
  63. .dma_start(dma_start),
  64. .pl_clk(pl_clk)
  65. );
  66. endmodule
复制代码
以上代码非常简洁,本身 axi-stream 协议就非常简洁。
以上代码中设置 S_AXIS_tvalid = 1'b1 始终为 1 代表,任何时候只要 S_AXIS_tready 有效,数据计数器 S_AXIS_tdata    就加 1,每次发送 512 个 32bit 数据,也就是 1024 个字节数据。每发送 1024 个数据产生一个中断。中断的产生是靠  axi-stream 协议的 S_AXIS_tlast 信号决定。S_AXIS_tlast = (S_AXIS_tdata == 511)&&S_AXIS_tready&&S_AXIS_tvalid。
2.7 编译并导出平台文件
1:单击 Block 文件 --> 右键 --> Generate the Output Products --> Global --> Generate。
2: 单 击 Block  文 件  --> 右 键  --> Create  a HDL wrapper( 生 成 HDL  顶 层 文 件 ) --> Let vivado manager wrapper andauto-update(自动更新)。
3:生成 Bit 文件。
4:导出到硬件: File --> Export Hardware --> Include bitstream
5:导出完成后,对应工程路径的 zu_hw 路径下有硬件平台文件:system_wrapper.xsa 的文件。根据硬件平台文件 system_wrapper.xsa 来创建需要 Platform 平台。
e45f26bfbbd54d2aaeaf29f4114cac08.jpg
3 搭建 Vitis-sdk 工程
创建 zu_base sdk platform 和 APP 工程的过程不再重复,可以阅读本章节 01~05 相关 demo 。 以下给出创建好 zu_base sdk platform 的截图和对应工程 APP 的截图。
3.1 创建 SDK Platform 工程
542fc872b3cd44d0aa3e43b7a080a40a.jpg
62b4c284ac6d4beba63f72340860127d.jpg
3.2 创建 axi_dma_pl2ps APP 工程
27d226500e5a436fa120b707daae545e.jpg
4 实验结果
df83d5a6b1db4b52bbd1be556d63fdd5.jpg
Debug 程序,单程序停止 main 函数处,打开 VIVADO ,扫描芯片,这个时候会自动之前添加的在线逻辑分析仪 IP 核。如下红框的按键先不要单击。
87bfea5f0b42427081cc42e130a0ef6b.jpg
具体步骤如下:
在 VIVADO 工程中点击 Open Target  然后点击 Auto Connect
72aa8dbb0133472f9abd45286fc93c29.jpg
连接成功后入下图
下图中,我们利用 axi-tlast 信号作为触发信号
ecea0d51e05646fab8d8191523a119d3.jpg
下图中我们使用DMA 产生的中断信号作为触发信号
35f1bc88729b4b47a80438ff425d3db3.jpg
单击如下图片,让在线逻辑分析仪的 2 个窗口都处于等待触发状态
b897b66ca06048db83cbef709d55cb0a.jpg
如下图所示是等待触发状态
92c91fea07da494399a516ea807debbe.jpg
回到 SDK,继续设置,打开 Memory:Window->Show View->Memory
91499efa4d3947b58831c467a8f5bd35.jpg
点击添加接收内存部分地址用于观察内存中的数据 地址为 0x01300000

f3191a0a2afe42a4a46f5cba8d305d47.jpg
1ce472e741ef428b9c89b6c52dcd85d7.jpg
为了观察一次收发数据:设置断点,重新让收发程序跑一次。双击以下程序处可以设置断点。
d9796075aecd49a2964d1855ed79599e.jpg
设置完成后,单击如下可以单击如下红框的按键
bfdfad75eecf4e07b5e20ebd2fa25d16.jpg
串口打印结果,通过设置 TTC 定时器,每间隔 1S  打印一次计算的测速。实际上也就是计算单位时 间内,DMA 了多少次。可以通过增加数据位宽,以及增加 PL 时钟的频率,提高速度。读者可以去 尝试下。
2715b45d90e847179a7b674268594a1f.jpg
内存中观察到的数据,可以看到地址 0x01300000 地址的开始并不是 00 而是 AB 和我们的预期有些差 异,不过数据是非常有规律的,说明DMA 是正常工作的,但是我们的用户逻辑实际上没有能够确保 发送数据的时候第一数据是 00 ,这个大家可以思考下为什么,有什么办法可以改进。我们后面 lwip的 demo 就对此问题必须做改进。

f5ecb4b2c87846b8a0e0e97385e1a34c.jpg
在线逻辑分析仪
c3b7c24314d2453aa09b0f973f2a1c2d.jpg

3627421ab95443c0a23a6d5178985bd4.jpg
1e64e182da6e4d3a8e2e36ed951eef59.jpg
70370690344649e7b3cab7b828705b36.jpg
6c0967ad74f04261839a59c587725d71.jpg
b23ba5310b7243c3b53b3cc133dae664.jpg
e824ef4c12a741f98e69c5816601e64b.jpg
bf88fd7c70864cc79bc19b87cd6f7646.jpg
3ed440e207834191864bbd6b047bf293.jpg
7240a8adbca04a7db37bf9b14e7a003a.jpg
d99b07c7dfaf4f0db1ee3c280bbbb60f.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则