[轉]【ZYNQ-7000開發之五】PL和PS通過BRAM交互共享數據


本篇文章目的是使用Block Memory進行PS和PL的數據交互或者數據共享,通過zynq PS端的Master GP0端口向BRAM寫數據,然后再通過PS端的Mater GP1把數據讀出來,將結果打印輸出到串口終端顯示。
涉及到AXI BRAM Controller 和 Block Memery Generator等IP的使用。
 
本系列文章盡可能的讓每一個實驗都相對獨立,過程盡可能保證完整性,保證實驗的可重現性。 但是用到的模塊或者IP的具體作用和用法不保證都重復詳細的介紹。
 
本文所使用的開發板是Miz702(兼容zedboard)
PC 開發環境版本:Vivado 2015.2 Xilinx SDK 2015.2
 
要實現的結構簡圖如圖所示:
 
一、PL端硬件架構的搭建
 
1.1 新建工程
 
 
1.2 一路next,選擇Zedboard
 
 
1.3 新建一個Block Design
 
 
1.4 點擊Add IP ,雙擊ZYNQ Processing System
 
 
1.5 點擊Run Block Automation,在彈出的對話框選擇OK
 
1.6 雙擊ZYNQ 模塊,在Peripheral 下,保留UART0,其余全部去掉
 
 
1.7 在PL-PS Configuration下,選中 GP0和GP1然后 點擊ok
 
 
1.8 配置完成后如圖所示(本次試驗沒有用到DDR和IO):
 
 
1.9 點擊,Add IP,連續添加兩個 AXI BRAM Controller
 
 
1.10 小技巧----重復IP模塊添加可以用TCL的方式,修改下名字就可以了
 
 
1.11 雙擊AXI BRAM Controller模塊(l兩個),把number of BRAM interfaces 修改成1
 
 
1.12 點擊ADD IP,添加Block Memory Generator 
 
 
1.13 雙擊Block Memory Generator ,修改Memory Type。
 
 
1.14 點擊run Connection  Automation,把axi_bram_ctrl_1的S_AXI端口的連接目標修改為如圖所示
 
 
1.15 點擊重新布局,生成好的硬件框架如下
 
 
1.16 點擊Address Editor 可以看到系統已經為我們自動分配好了正確的地址
 
 
1.17 在Block design 上右擊,點擊Creater HDL Wrapper,這一步生成整個硬件工程的頂層模塊
 
 
1.18 點擊ok
 
 
1.19 點擊Generate Output Products,這一步把IP Core的源碼加載到工程下面(貌似)
 
 
1.20 點擊Generate
 
 
1.21 點擊Generate bit,然后需要耐心等待一下
 
 
1.22 完成,可以選擇需要查看的信息,也可以點擊Cancel
 
 
1.23 點擊File,選擇Export Hardware
 
 
1.24 選中Include bitstream,方便在SDK里直接可以燒寫FPGA的配置文件
 
 
1.25 選擇   然后點擊OK,至此硬件環境搭建完成
 
 
二、PS端軟件實現數據共享
 
2.1 打開的SDK界面如下,這里的信息是和硬件相關的,例如在Address Map 這一欄下可以看到axi_bram_ctrl_0和剛剛在vavado Address Editor下的地址是一致的
 
2.2 新建工程
 
2.3 輸入工程名字,點擊next
 
2.4 選擇Hello World,Finish
 
2.5 把src路徑下,把helloworld.c里的代碼修改如下
 
 
//關於驅動函數,這里先簡要介紹一下,將來會詳細講解
#include <stdio.h>
#include "platform.h"
#include "xil_io.h"   //這個頭文件下面包含很重要的IO讀寫函數
#include "xparameters.h"  //這個頭文件里把硬件的地址映射等參數都寫成了宏定義方便使用

//void print(char *str);

int main()
{
       int num;
       int rev;
    init_platform();

    xil_printf("------The test is start...------\n\r");


    //XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR是axi_bram_ctrl_0的地址,Xil_Out32通過控制axi_bram_ctrl_0,向blk_mem_gen_0寫數據
    for( num=0; num<15; num++ )
    {
       Xil_Out32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + num*4, 0x10000000+num);     //
    }


    //XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR是axi_bram_ctrl_1的地址,Xil_In32 通過控制axi_bram_ctrl_0,把blk_mem_gen_0里的數據讀出來
    //PS和PL可以在blk_mem_gen_0里共享數據
   for( num=0; num<15; num++ )
       {
              rev = Xil_In32(XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4);
              xil_printf( "The data at %x is %x \n\r",XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4,rev);
       }

    xil_printf("------The test is end!------\n\r");

    cleanup_platform();
    return 0;
}

 
         
 
2.6 設置串口終端
 
 
2.7 把bit文件燒寫到FPGA
 
 
2.8 配置軟件燒寫文件
 
 
2.9 如圖所示配置
 
 
2.10 如圖所示配置
 
 
2.11 串口終端打印輸出信息如下:
 
------The test is start...------
The data at 80000000 is 10000000
The data at 80000004 is 10000001
The data at 80000008 is 10000002
The data at 8000000C is 10000003
The data at 80000010 is 10000004
The data at 80000014 is 10000005
The data at 80000018 is 10000006
The data at 8000001C is 10000007
The data at 80000020 is 10000008
The data at 80000024 is 10000009
The data at 80000028 is 1000000A
The data at 8000002C is 1000000B
The data at 80000030 is 1000000C
The data at 80000034 is 1000000D
The data at 80000038 is 1000000E
------The test is end!------
 
 
PS:在點擊Run后出現了這個錯誤,找了很久沒發現問題,最后重啟了下電腦解決。
 Failed to open Cable Node jsn1 on TCP:127.0.0.1:3121
 at com.xilinx.sdk.targetmanager.internal.TM.isFPGAConfigured(TM.java:372)
 at com.xilinx.sdk.debug.core.XilinxAppLaunchConfigurationDelegate.isFpgaConfigured(XilinxAppLaunchConfigurationDelegate.java:381)
 at com.xilinx.sdk.debug.core.XilinxAppLaunchConfigurationDelegate.launch(XilinxAppLaunchConfigurationDelegate.java:290)
 at com.xilinx.sdk.debug.ui.XilinxAppLaunchDelegateWrapper.launch(XilinxAppLaunchDelegateWrapper.java:31)
 
 
三、總結
本文通過PS端把數據寫入到PL端的BRAM,然后從而又把數據從PL端讀到PS端,從而簡單的實現了PL和PS的數據交互和共享。
 
 
更多關於zynq開發相關的文章和問題請點擊:
http://www.osrc.cn/forum.php?mod=forumdisplay&fid=292
http://blog.csdn.net/rzjmpb

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM