[X]关闭

米联客-XILINX-H3_CZ08_7100] FPGA_AXI总线入门连载-10PL 读写 PS 端 DDR(FDMA)

文档创建者:FPGA课程
浏览次数:40
最后更新: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概述
FDMA 是米联客的基于 AXI4 总线协议定制的一个 DMA 控制器。有了这个 IP 我们可以统一实现用FPGA 代码直接 读写 PL 的 DDR 或者 PS 的 DDR。本文中 FDMA 的 IP 是开源的,在配套 FPGA 工程的 uisrc/ip 路径下可以找到源码。 本文的 IP 已经利用VIVADO 做了图形化的封装,所以可以直接通过图形化连线设计,使用非常方便。
本文实验目的:
1:利用米联客自定一定 FDMA2.0/3.0 版本搭建 SOC 工程(最新发布的版本是 3.0)
2:编写 FPGA 测试代码实现,PL 写入数据到 PS DDR 然后再读出 PS DDR 中的数据,对比是否正确。
为了让 PS 的 DDR 可以运行,必须新建一个 vitis-sdk 工程,这个工程主要是为了初始化 PS DDR,我们可以简单 新建一个自带的hello 工程。
2搭建 SOC 系统工程
新建一个名为为 soc_prj 的工程,之后创建一个 BD 文件,并命名为 system ,添加并且配置好 ZYNQ Ultrascale+ MPSOC IP 。读者需要根据自己的硬件类型配置好输入时钟频率、 内存型号、串 口,连接时钟等。新手不清楚这些 内容个,请参考“3-2-01_ex_soc_base .pdf” “01 HelloWold/DDR/网口测试 ”这篇文章。
ef8ec34e8e674216a04e55be1c836438.jpg
2. 1PS 部分设置
1:PS 复位设置
68f1d2f72be945e08a1227354eaaec4c.jpg
2:PS Slave AXI 设置
44ccc96c066a4cee8ebea612d8d2bceb.jpg
3:PL 输出时钟设置
3d6ec8377a3e4977b4510df45d6ebb4f.jpg
2.2 添加自定义 IP
1:设置 IP 路径
本文中是我们第一次在 BD 图形化设计中添加自定义的 IP , 自定义的 IP 需要设置 IP 路径才能被识别到。默认情况 下,我们自定的 IP 在配套工程的 uisrc/ip 路径下:
583795d3f21f4faaa378e985eb9f840d.jpg
2.3PL 图像化编程
4dcdc6b4fb994b5a82da97d89c0a7ce7.jpg
2.4 添加FPGA FDMA 读写代码
989085e464c3415b992adf1c275e40e3.jpg
上图中源码在配套fpga工程的uisrc/rtl路径中,本文中我们修改了默认的system_wrapper.v文件为 system_wrapper_fdma.v 这样的好处是对默认文件和手动修改过的文件加以区分,以免幸苦修改的代码一不小心,被软件自动更新替换掉。
关键的代码为 fdma_test.v 。在这个程序中,写入一定数据到DDR中,然后再读出,对比是否有错误,几个关键参数:
TEST_MEM_SIZE:定义了测试内从空间的大小,以byte为单位,是整数倍的 FDMA_BURST_LEN *(fdma_wdata/8)。
FDMA_BURST_LEN:定义每次 FDMA 传输的长度,这个长度是整数倍的 fdma_wdata 或者 fdma_rdata。
ADDR_MEM_OFFSET:代码了内从访问的起始地址。
  1. `timescale 1ns / 1ns
  2. /*******************************MILIANKE*******************************
  3. *Company : MiLianKe Electronic Technology Co., Ltd.
  4. *WebSite:https://www.milianke.com
  5. *TechWeb:https://www.uisrc.com
  6. *tmall-shop:https://milianke.tmall.com
  7. *jd-shop:https://milianke.jd.com
  8. *taobao-shop1: https://milianke.taobao.com
  9. *Create Date: 2019/12/17
  10. *Module Name:fdma_ddr_test
  11. *File Name:fdma_ddr_test.v
  12. *Description:
  13. *The reference demo provided by Milianke is only used for learning.
  14. *We cannot ensure that the demo itself is free of bugs, so users
  15. *should be responsible for the technical problems and consequences
  16. *caused by the use of their own products.
  17. *Copyright: Copyright (c) MiLianKe
  18. *All rights reserved.
  19. *Revision: 1.0
  20. *Signal description
  21. *1) _i input
  22. *2) _o output
  23. *3) _n activ low
  24. *4) _dg debug signal
  25. *5) _r delay or register
  26. *6) _s state mechine
  27. *********************************************************************/

  28. module fdma_test#
  29. (
  30. parameter TEST_MEM_SIZE   = 32'd536800000,
  31. parameter FDMA_BURST_LEN  = 16'd1000,
  32. parameter ADDR_MEM_OFFSET = 1024*1024*50
  33. )
  34. (
  35. input               ui_clk,
  36. input               fdma_rstn,
  37. output     [31: 0]  fdma_waddr,
  38. output reg          fdma_wareq,
  39. output     [15: 0]  fdma_wsize,                                    
  40. input               fdma_wbusy,               
  41. output reg [31:0]   fdma_wdata,
  42. input               fdma_wvalid,
  43. output              fdma_wready,

  44. output     [31: 0]  fdma_raddr,
  45. output reg          fdma_rareq,
  46. output     [15: 0]  fdma_rsize,                                    
  47. input               fdma_rbusy,                        
  48. input      [31:0]   fdma_rdata,
  49. input               fdma_rvalid,
  50. output              fdma_rready
  51.     );
  52.   
  53. parameter WRITE1 = 0;
  54. parameter WRITE2 = 1;
  55. parameter READ1  = 2;
  56. parameter READ2  = 3;

  57. reg [31: 0] fdma_waddr_r;
  58. reg [16 :0] fdma_rcnt = 0;
  59. reg [1  :0] T_S = 0;

  60. assign fdma_waddr = fdma_waddr_r + ADDR_MEM_OFFSET;
  61. assign fdma_raddr = fdma_waddr;

  62. assign fdma_wsize = FDMA_BURST_LEN;
  63. assign fdma_rsize = FDMA_BURST_LEN;

  64. reg [10:0] rst_cnt = 0;

  65. always @(posedge ui_clk)
  66.     if(fdma_rstn == 1'b0)begin
  67.         rst_cnt <=0;
  68.     end
  69.     else begin
  70.         if(rst_cnt[10] == 1'b0)
  71.             rst_cnt <= rst_cnt + 1'b1;
  72.         else
  73.             rst_cnt <= rst_cnt;
  74.     end

  75. assign fdma_wready = 1'b1;
  76. assign fdma_rready = 1'b1;

  77. always @(posedge ui_clk)begin
  78.     if(rst_cnt[10] == 1'b0)begin
  79.         T_S <=0;   
  80.         fdma_wareq  <= 1'b0;
  81.         fdma_rareq  <= 1'b0;
  82.         fdma_wdata<=0;
  83.         fdma_waddr_r <=0;      
  84.     end
  85.     else begin
  86.         case(T_S)      
  87.         WRITE1:begin
  88.             if(fdma_waddr_r>TEST_MEM_SIZE) fdma_waddr_r<=0;
  89.                 if(!fdma_wbusy)begin
  90.                     fdma_wareq  <= 1'b1;
  91.                     fdma_wdata  <= 0;
  92.                 end
  93.                 if(fdma_wareq&&fdma_wbusy)begin
  94.                     fdma_wareq  <= 1'b0;
  95.                     T_S         <= WRITE2;
  96.                 end
  97.         end
  98.         WRITE2:begin
  99.             if(!fdma_wbusy) begin
  100.                  T_S <= READ1;
  101.                  fdma_wdata  <= 32'd0;
  102.             end
  103.             else if(fdma_wvalid) begin
  104.                 fdma_wdata <= fdma_wdata + 1'b1;
  105.             end
  106.         end
  107.         
  108.         READ1:begin
  109.             if(!fdma_rbusy)begin
  110.                 fdma_rareq  <= 1'b1;
  111.                 fdma_rcnt   <= 0;
  112.             end
  113.             if(fdma_rareq&&fdma_rbusy)begin
  114.                  fdma_rareq  <= 1'b0;
  115.                  T_S         <= READ2;
  116.             end
  117.         end
  118.         READ2:begin
  119.             if(!fdma_rbusy) begin
  120.                  T_S <= WRITE1;
  121.                  fdma_rcnt  <= 32'd0;
  122.                  fdma_waddr_r  <= fdma_waddr_r + FDMA_BURST_LEN*4;//32/8=4
  123.             end
  124.             else if(fdma_rvalid) begin
  125.                 fdma_rcnt <= fdma_rcnt + 1'b1;
  126.             end
  127.         end   
  128.         default:
  129.             T_S <= WRITE1;     
  130.         endcase
  131.     end
  132.   end
  133.   
  134. wire test_error = ((fdma_rready&&fdma_rvalid) && (fdma_rcnt[15:0] != fdma_rdata[15:0]));

  135. ila_0 ila_dbg (
  136.         .clk(ui_clk),
  137.         .probe0({fdma_waddr[15:0],fdma_wdata[15:0],fdma_wareq,fdma_wvalid,fdma_wready,fdma_wbusy}),
  138.         .probe1({fdma_rdata[15:0],fdma_rcnt[15:0],fdma_rvalid,fdma_rready,fdma_rbusy,T_S,test_error,fdma_rstn})
  139. );
  140.      
  141.    
  142.    
  143. endmodule
复制代码

2.5 设置地址分配
c3cf0644dd894c66a07c6b007c4fb9ec.jpg
2.6 编译并导出平台文件
1:单击 Block 文件 --> 右键 --> Generate the Output Products --> Global --> Generate。
2: 单 击 Block  文 件  --> 右 键  --> Create  a HDL wrapper( 生 成 HDL  顶 层 文 件 ) --> Let vivado manager wrapper and auto-update(自动更新)。
3:生成 Bit 文件。
4:导出到硬件: File --> Export Hardware --> Include bitstream
5:导出完成后,对应工程路径的 zu_hw 路径下有硬件平台文件:system_wrapper.xsa 的文件。根据硬件平台文件 system_wrapper.xsa 来创建需要 Platform 平台。
e439817d24904eb085e8cd5f962f617b.jpg

3搭建 Vitis-sdk 工程
创建 zu_base sdk platform 和 APP 工程的过程不再重复,可以阅读本章节 01~05 相关 demo 。 以下给出创建好 zu_base sdk platform 的截图和对应工程 APP 的截图。
3.1 创建 SDK Platform 工程
b8dd49ab6d714d2995c249b5b8b1ddef.jpg
3.2 创建 hello APP 工程
1b12f39b20cc41dd96a559262b7ff137.jpg

4实验结果
1:先运行 hello app
2:打开设备
37a2645119b0413893c71ae1740a7ccf.jpg
3:如果没有出来下图的 hw_ila波形窗口,右击刷新
403b9d389ab246f1ac74c88914c4adf3.jpg
3a8e052c09b94f13a4615ba4cd4ca1be.jpg
4:观察在线逻辑分析结果
0e034fcdd8b2477cb4d5b8a42ade58e0.jpg
5:写入过程
a166743c37104417b611433b1c482a90.jpg
6:读出过程
eb2dd87badec444881d0e38466c11e79.jpg

0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
0c56bb9dd6234b71a34900ccac0f0f1c.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则