【ZYNQ-7000開發之四】PS讀寫PL端BRAM

本篇文章目的是使用Block Memory進行PS和PL的數據交互或者數據共享,通過zynq PS端的Master GP0端口向BRAM寫數據,然後再通過PS端的Mater GP1把數據讀出來,將結果打印輸出到串口終端顯示。

涉及到AXI BRAM Controller 和 Block Memery Generator等IP的使用。

本系列文章儘可能的讓每一個實驗都相對獨立,過程儘可能保證完整性,保證實驗的可重現性。 但是用到的模塊或者IP的具體作用和用法不保證都重複詳細的介紹。

本文所使用的開發板是Miz702 PC 開發環境版本:Vivado 2015.4 Xilinx SDK 2015.4

11.0本章難度係數★★☆☆☆☆☆

11.1 搭建硬件工程

Step1:新建一個名爲爲Miz701_sys的工程

wps9EB9.tmp

Step2:選擇RTL Project 勾選Do not specify source at this time

wps9ECA.tmp

Step3:選擇xc7z010clg400-1爲開發器件。

wps9ECB.tmp

Step4:單擊Finish

wps9ECC.tmp

11.2使用IP Integrator創建硬件系統

Step1:單擊Create Block Design

Step2:輸入system

wps9ECD.tmp

Step3:單擊下圖中wps9ECE.tmp添加IP按鈕

wps9EDE.tmp

Step4:搜素單詞z選擇ZYNQ7 Processing System,然後雙擊

wps9EDF.tmp

Step5:添加進來了ZYNQ CPU IP,然後雙擊對其進行配置。

wps9EE0.tmp

Step6:修改輸入時鐘爲50MHZ,PL端頻率FCLK_CLK0爲100MHZ。

wps9EE1.tmp

Step7:修改內存型號爲MT41K256M16 RE-125。

wps9EE2.tmp

Step8:在MIO configuration選項中,勾選添加UART1接口。

wps9EE3.tmp

Step9: 在PL-PS Configuration下,選中 GP0和GP1然後 點擊ok。

wps9EF4.tmp

Step10:單擊Run Block Automation進行智能佈線。

wps9EF5.tmp

Step11:直接單擊OK

wps9EF6.tmp

Step12:在你點擊了OK後,你會發現DDR以及FICED_IO自動的延伸出來。

wps9EF7.tmp

Step13:連線的作用就是把PS的時鐘可以接入PL部分,當然這裏我們暫時用不到PL部分的資源。在Block文件中,我們迚行連線,將鼠標放在引腳處,鼠標變成鉛筆後迚行拖拽,連線如下圖所示:

wps9EF8.tmp

Step14:點擊,Add IP,連續添加兩個 AXI BRAM Controller

wps9EF9.tmp

Step15:分別雙擊AXI BRAM Controller模塊,把number of BRAM interfaces 全部修改成1

wps9EFA.tmp

Step16:點擊ADD IP,添加Block Memory Generator

wps9F0B.tmp

Step17:雙擊Block Memory Generator ,修改Memory Type。

wps9F0C.tmp

Step18:點擊run Connection Automation,把axi_bram_ctrl_1的S_AXI端口的連接目標修改爲如圖所示:

wps9F0D.tmp

Step19:點擊重新佈局,生成好的硬件框架如下

wps9F0E.tmp

Step20:點擊Address Editor 可以看到系統已經爲我們自動分配好了正確的地址

wps9F0F.tmp

Step21: 右擊 system.bd, 單擊Generate Output Products

wps9F1F.tmp

Step22:支部操作會產生執行、仿真、綜合的文件

wps9F20.tmp

Step23:右擊system.bd 選擇 Create HDL Wrapper 這步的作用是產生頂層的HDL文件

wps9F21.tmp

Step24:選擇Leave Let Vivado manager wrapper and auto-update 然後單擊OK

Step25:執行->產生bit文件wps9F22.tmp

11.3導出SOC硬件到SDK

Step1:File->Export->Export Hardware

wps9F23.tmp

Step2:勾選Include bitstream 直接單擊OK

wps9F24.tmp

Step3:File->Launch SDK加載到SDK

wps9F35.tmp

Step4:單擊OK

wps9F36.tmp

11.4 軟件工程

Step1:打開的SDK界面如下,這裏的信息是和硬件相關的,例如在Address Map 這一欄下可以看到axi_bram_ctrl_0和剛剛在vavado Address Editor下的地址是一致的

wps9F37.tmp

Step2: 新建一個名爲BRAM_Test的空的工程,並且新建一個main.c文件,添加如下代碼。

/*

* mai.c

*

*  Created on: 2016年6月26日

*      Author: Administrator

*/

#include <stdio.h>

#include "xil_io.h"   //這個頭文件下面包含很重要的IO讀寫函數

#include "xparameters.h"  //這個頭文件裏把硬件的地址映射等參數都寫成了宏定義方便使用

//void print(char *str);

int main()

{

       int num;

       int rev;

    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_BRAM_0_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_BRAM_0_BASEADDR + num*4);

            xil_printf( "The data at %x is %x \n\r",XPAR_BRAM_0_BASEADDR + num*4,rev);

       }

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

    return 0;

}

 

11.5 測試結果

串口終端打印輸出信息如下:

------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!------

11.6 本章小結

本文通過PS端把數據寫入到PL端的BRAM,然後從而又把數據從PL端讀到PS端,從而簡單的實現了PL和PS的數據交互和共享。

參考博文:https://www.cnblogs.com/milinker/p/5905911.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章