[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_SDK高级篇连载-01AXI-BRAM控制信号拓展方案

文档创建者:FPGA课程
浏览次数:219
最后更新:2024-09-29
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-SOC » 1_SDK应用方案(仅旗舰型号) » 2-SDK高级应用方案
本帖最后由 FPGA课程 于 2024-9-29 13:15 编辑

​软件版本: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 BRAM Controler 是一个可以和AXI4-FULL 或者AXI4-LITE接口互联到ZYNQ IP系统的IP CORE。使用该IP CORE可以用于BRAM数据缓存,通过BRAM和PL数据交互,或者直接使用AXI BRAM Controler的控制逻辑完成PL数据交互。
实验目的:
1:掌握基于图形化设计编程,完成AXI BRAM Controler控制器的FPGA编程
2:直接使用AXI BRAM Controler控制器的控制逻辑完成8个寄存器数据的读写操作
2系统框图
ZYNQ PS ARM端写入8个32bit数据到AXI BRAM Controller IP分配的基地址,这8个数据会出现在AXI BRAM Controller IP 的接口。PL读写逻辑根据地址,读取数据,并且保存到8个寄存器中。
当ZYNQ PS ARM端读数据的时候,PL读写逻辑把之前寄存器的数据加1。
e842179434fd495781ea4929041034c2.jpg
3搭建SOC系统工程
详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建SOC工程的,请学习“3-1-01米联客2024版ZynqSocSDK入门篇”中第一个工程 “01Vitis Soc开发入门”这个实验。
3.1Zynq IP PS部分设置
本文中的PS设置内容是新增加的配置部分,关于DDR、MIO、CPU时钟等设置请参考“米联客2024版ZynqSocSDK入门篇”中第一个工程 “01Vitis Soc开发入门”这个实验。
1:PS复位设置
a6a2eed5e6d24d12b8a8fb6b8579aa6b.jpg
2:设置 PS GT Master 接口
e1daaeb5a6f94ace96b9a67d426771fd.jpg
3:设置PL的时钟
勾选FCLK_CLK0,设置为100,即PS的PLL提供本系统的时钟100MHZ。
9316b3b95e7048d49de4d833ba265838.jpg
4:ZYNQ IP设置完成后
7ad7b70075a3426195e4abb18a1dc47e.jpg
3.2添加IP
单击添加IP按钮“ ca19437843b4487f838c0091b1c38fa7.jpg ​编辑”,输入如下模块IP名字的关键词,并双击添加。
cb021537e80344e6a16c638a9dc18f14.jpg
3.3图形连线设计
分别选择Run Connection Automation
fb2ab33b3cd04874bd725a434e85d2bd.jpg
弹出的设置窗口分别全部勾选,如下设置
0e449990ca7d4a7fab52b9116a50a6ca.jpg
7ee52b611a8c4688af45f19989288147.jpg
65771de444d94c8494c2761eb5729ce4.jpg
由于我们这里只想用BRAM Controller 控制器读写数据,不需要用BRAM缓存数据,所以删除自动产生的Block Memory
909eefd981814b708593d6d3871b3cf5.jpg
删除后如下
d5205914271c4115b9e799c29c7d741d.jpg
之后引出必要 时钟信号,复位信号,完成后如下:
1bc98be675a74754a6d8873a7860a362.jpg
双击 AXI BRAM Controller IP 参数设置如下:
609f4ddf8e0e4bfa809bc51b321b40c6.jpg
3.4PL端读写逻辑接口
BRAM Controller支持AXI-LITE接口也支持AXI4-FULL接口。而且支持多种数据传输方式,我们这里仅仅以Burst Write 和Burst Read说明如何利用BRAM Controller进行数据的交互控制。
本方案中,BRAM Controller是挂到了AXI4-FULL接口,传输效率更高,支持Burst传输。
Burst Write写时序:
e54cce8029994c3d95a9d3334cf7a63b.jpg
Burst Read读时序:
2298e22470d7476e918daa865362f3ab.jpg
编写PL端读写BRAM Controller接口的逻辑代码如下:
  1. *TechWeb:https://www.uisrc.com
  2. *tmall-shop:https://milianke.tmall.com
  3. *jd-shop:https://milianke.jd.com
  4. *taobao-shop1: https://milianke.taobao.com
  5. *Create Date: 2021/10/15
  6. *Module Name:system_wrapper
  7. *File Name:system_wrapper.v
  8. *Description:
  9. *The reference demo provided by Milianke is only used for learning.
  10. *We cannot ensure that the demo itself is free of bugs, so users
  11. *should be responsible for the technical problems and consequences
  12. *caused by the use of their own products.
  13. *Copyright: Copyright (c) MiLianKe
  14. *All rights reserved.
  15. *Revision: 1.0
  16. *Signal description
  17. *1) _i input
  18. *2) _o output
  19. *3) _n activ low
  20. *4) _dg debug signal
  21. *5) _r delay or register
  22. *6) _s state mechine
  23. *********************************************************************/
  24. `timescale 1 ps / 1 ps
  25. module system_wrapper
  26. (
  27. inout [14:0]DDR_addr,
  28. inout [2:0]DDR_ba,
  29. inout DDR_cas_n,
  30. inout DDR_ck_n,
  31. inout DDR_ck_p,
  32. inout DDR_cke,
  33. inout DDR_cs_n,
  34. inout [3:0]DDR_dm,
  35. inout [31:0]DDR_dq,
  36. inout [3:0]DDR_dqs_n,
  37. inout [3:0]DDR_dqs_p,
  38. inout DDR_odt,
  39. inout DDR_ras_n,
  40. inout DDR_reset_n,
  41. inout DDR_we_n,
  42. inout FIXED_IO_ddr_vrn,
  43. inout FIXED_IO_ddr_vrp,
  44. inout [53:0]FIXED_IO_mio,
  45. inout FIXED_IO_ps_clk,
  46. inout FIXED_IO_ps_porb,
  47. inout FIXED_IO_ps_srstb
  48. );
  49. wire [11:0] BRAM_PORTA_0_addr;
  50. wire [31:0] BRAM_PORTA_0_din;
  51. reg [31:0] BRAM_PORTA_0_dout;
  52. wire BRAM_PORTA_0_en;
  53. wire BRAM_PORTA_0_rst;
  54. wire [3 :0] BRAM_PORTA_0_we;
  55. wire pl_rstn;
  56. wire pl_clk;
  57. reg [31:0] reg32_0 = 0;
  58. reg [31:0] reg32_1 = 0;
  59. reg [31:0] reg32_2 = 0;
  60. reg [31:0] reg32_3 = 0;
  61. reg [31:0] reg32_4 = 0;
  62. reg [31:0] reg32_5 = 0;
  63. reg [31:0] reg32_6 = 0;
  64. reg [31:0] reg32_7 = 0;
  65. //添加在线逻辑分析仪信号查看数据
  66. ila_0 ila_dg (
  67. .clk(pl_clk), // input wire clk
  68. .probe0({reg32_0,reg32_1,reg32_2,reg32_3,reg32_4,reg32_5,reg32_6,reg32_7}), // input wire [255:0] probe0
  69. .probe1(BRAM_PORTA_0_din), // input wire [31:0] probe1
  70. .probe2(BRAM_PORTA_0_dout), // input wire [31:0] probe2
  71. .probe3(BRAM_PORTA_0_addr), // input wire [7:0] probe3
  72. .probe4({BRAM_PORTA_0_en,BRAM_PORTA_0_rst,BRAM_PORTA_0_we[3:0]}) // input wire [2:0] probe4
  73. );
  74. always@(posedge pl_clk)begin
  75. if((pl_rstn==1'b0) || (BRAM_PORTA_0_rst == 1'b1))begin
  76. reg32_0 <= 32'b0;
  77. reg32_1 <= 32'b0;
  78. reg32_2 <= 32'b0;
  79. reg32_3 <= 32'b0;
  80. reg32_4 <= 32'b0;
  81. reg32_5 <= 32'b0;
  82. reg32_6 <= 32'b0;
  83. reg32_7 <= 32'b0;
  84. end
  85. else if((BRAM_PORTA_0_en==1'b1)&(BRAM_PORTA_0_we==4'hF))begin//ps write to pl reg
  86. case(BRAM_PORTA_0_addr[7:0]) //PS 写 PL 寄存器,以下地址为 4 字节对齐
  87. 8'h00:reg32_0 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h00 寄存器
  88. 8'h04:reg32_1 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h04 寄存器
  89. 8'h08:reg32_2 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h08 寄存器
  90. 8'h0C:reg32_3 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h0C 寄存器
  91. 8'h10:reg32_4 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h10 寄存器
  92. 8'h14:reg32_5 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h14 寄存器
  93. 8'h18:reg32_6 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h18 寄存器
  94. 8'h1C:reg32_7 <= BRAM_PORTA_0_din; //PS 写 PL 偏移地址 8’h1C 寄存器
  95. default: reg32_0 <= BRAM_PORTA_0_din;
  96. endcase
  97. end
  98. else if(BRAM_PORTA_0_en==1'b1)begin//ps read pl reg
  99. case(BRAM_PORTA_0_addr[7:0]) //PS 读 PL 寄存器,以下地址为 4 字节对齐
  100. 8'h00:BRAM_PORTA_0_dout <= reg32_0 + 1'b1; //PS 读 PL 偏移地址 8’h00,读会结果为寄存器 reg32_0 加 1
  101. 8'h04:BRAM_PORTA_0_dout <= reg32_1 + 1'b1; //PS 读 PL 偏移地址 8’h04,读会结果为寄存器 reg32_1 加 1
  102. 8'h08:BRAM_PORTA_0_dout <= reg32_2 + 1'b1; //PS 读 PL 偏移地址 8’h08,读会结果为寄存器 reg32_2 加 1
  103. 8'h0C:BRAM_PORTA_0_dout <= reg32_3 + 1'b1; //PS 读 PL 偏移地址 8’h0C,读会结果为寄存器 reg32_3 加 1
  104. 8'h10:BRAM_PORTA_0_dout <= reg32_4 + 1'b1; //PS 读 PL 偏移地址 8’h10,读会结果为寄存器 reg32_4 加 1
  105. 8'h14:BRAM_PORTA_0_dout <= reg32_5 + 1'b1; //PS 读 PL 偏移地址 8’h14,读会结果为寄存器 reg32_5 加 1
  106. 8'h18:BRAM_PORTA_0_dout <= reg32_6 + 1'b1; //PS 读 PL 偏移地址 8’h18,读会结果为寄存器 reg32_6 加 1
  107. 8'h1C:BRAM_PORTA_0_dout <= reg32_7 + 1'b1; //PS 读 PL 偏移地址 8’h1C,读会结果为寄存器 reg32_7 加 1
  108. default: BRAM_PORTA_0_dout <= reg32_0 + 1'b1;
  109. endcase
  110. end
  111. end
  112. //以下调用图形化 PL 图形化 BD 模块,这里也可以看出对于 SOC 工程,图形化编程的实质也是 FPGA 编程
  113. system system_i
  114. (
  115. .DDR_addr(DDR_addr),
  116. .DDR_ba(DDR_ba),
  117. .DDR_cas_n(DDR_cas_n),
  118. .DDR_ck_n(DDR_ck_n),
  119. .DDR_ck_p(DDR_ck_p),
  120. .DDR_cke(DDR_cke),
  121. .DDR_cs_n(DDR_cs_n),
  122. .DDR_dm(DDR_dm),
  123. .DDR_dq(DDR_dq),
  124. .DDR_dqs_n(DDR_dqs_n),
  125. .DDR_dqs_p(DDR_dqs_p),
  126. .DDR_odt(DDR_odt),
  127. .DDR_ras_n(DDR_ras_n),
  128. .DDR_reset_n(DDR_reset_n),
  129. .DDR_we_n(DDR_we_n),
  130. .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
  131. .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
  132. .FIXED_IO_mio(FIXED_IO_mio),
  133. .FIXED_IO_ps_clk(FIXED_IO_ps_clk),
  134. .FIXED_IO_ps_porb(FIXED_IO_ps_porb),
  135. .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),
  136. .BRAM_PORTA_0_addr(BRAM_PORTA_0_addr),
  137. .BRAM_PORTA_0_clk(BRAM_PORTA_0_clk),
  138. .BRAM_PORTA_0_din(BRAM_PORTA_0_din),
  139. .BRAM_PORTA_0_dout(BRAM_PORTA_0_dout),
  140. .BRAM_PORTA_0_en(BRAM_PORTA_0_en),
  141. .BRAM_PORTA_0_rst(BRAM_PORTA_0_rst),
  142. .BRAM_PORTA_0_we(BRAM_PORTA_0_we),
  143. .pl_clk(pl_clk),
  144. .pl_rstn(pl_rstn)
  145. );
  146. endmodule
复制代码

3.5地址空间分配
初学者需要注意,这个地址分配非常重要,PL端的寄存器空间即是根据这个地址做偏移计算得出
2507135766b24b7f9a2c7bcaf71dfcc4.jpg
3.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:导出完成后,对应工程路径的soc_hw路径下有硬件平台文件:system_wrapper.xsa的文件。根据硬件平台文件system_wrapper.xsa来创建需要Platform平台。
e8175166f94643a4b7145741c85d90f2.jpg
4搭建Vitis-sdk工程
创建soc_base sdk platform和APP工程。
4.1创建SDK Platform工程
启动Vitis-Sdk
03832bffcf544679a6ef3b220cbf1345.jpg
设置好路径
56d65ad097984e1b80b9757a2c68e84c.jpg
米联客资料中的路径规范如下图:
soc_prj里面是基于SOC的硬件工程源码
soc_hw里面是xsa格式文件,soc_prj编译会导出system_wrapper.xsa到这个路径
soc_sdk里面是裸机的sdk工程,sdk工程创建依赖soc_hw中的system_wrapper.xsa
c0860c5f4e424700a4b9502a2370506c.jpg
单击Create Platform Project 创建基于开发平台的工程
ac9a166f3c9547a5ac358795f72c3e7d.jpg
a9610e4b3c434d49813f6b1bd97dfd6c.jpg
添加之前导出的system_wrapper.xsa文件
d6b2f36eb0414e1a9499076f00e298d3.jpg
dbcf4f2130874ad7be38602c25e82a3e.jpg
创建完成后
3d9654cbc7564006a8475537b4c1e2de.jpg
最后,右击soc_base完成编译
14c71d7bc84a4570bc130d8ed7d42d48.jpg
a21bb7f8e2154613bad5d506dbda1596.jpg
4.2创建bram_controller_test APP工程
首选创建一个空的工程
edd671335a3e445f9f6e2dfd7de42147.jpg
8b11ca639f044de0be2fb5f49a2ce744.jpg
c337193dfc2341cba52f043d36dbb5d7.jpg
1d82f23e48c64480b4bf4b79226479d4.jpg
b77ee270f60445d6969d0a7e5cb091f5.jpg

ed6eafd564ba4de881f7df7e39a65dc9.jpg

复制soc_prj/uisrc/07_sdk_src路径下已经编写好的源码到src路径下
7b2150cc057848c8a819276b0bce1bf9.jpg
之后对工程编译
5程序分析
连续写入8个数据到PL的BRAM Controller,然后读出,并且打印出来。
dbdfeca9335a4872b3bb703b11281797.jpg
6方案演示
6.1硬件准备
本实验需要用到 JTAG 下载器、USB 转串口外设,另外需要把核心板上的 2P 模式开关设置到 JTAG 模式,即 ON ON (注意新版本的 MLK-H3-CZ08-7100FC(米联客 7X 系列),支持 JTAG 模式,对于老版本的核心板,JTAG 调试 的时候一定要拔掉 TF 卡,并且设置模式开关为 OFF OFF)
9587b7a1563f4a98b68d07cb5732d864.jpg
6.2实验结果
ed3dd22487e14f3ca1864accd534fcfe.jpg
Debug程序,单程序停止main函数处,打开VIVADO,扫描芯片,这个时候会自动之前添加的在线逻辑分析仪IP核。如下红框的按键先不要单击
f96e1dace97d406db347f62785eb884d.jpg
具体步骤如下:
在VIVADO工程中点击Open Target 然后点击Auto Connect
1edd997e516f422aa88a9849d07b2ca6.jpg
连接成功后入下图
ef61de99a9764ec9aa331b495421e977.jpg
设置触发条件、观察信号。设置波形偏移500。
Settings ​-->​Trigger position in window:500
Trigger Setup -->添加触发信号BRAM_PORTA_0_en,设置Value为R。如图所示。
2a933d5ffbd24a338169daaa1ee66492.jpg
启动波形捕捉
117770ed812a46108bdcc8e6d1403fe5.jpg
SDK中点击继续运行
0b3b0fa929994e15b28cb472fbf216b8.jpg
当信号触发的时,VIVAIDO中Hardware Manager出现捕捉波形,如下图所示
cf2985fedda44502898a112c69d1976c.jpg
在串口控制台输出结果:
8bc8026d9dd847c48d385adfd184534c.jpg


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

本版积分规则