本篇文章目的是使用Block Memory進行PS和PL的數據交互或者數據共享,經過zynq PS端的Master GP0端口向BRAM寫數據,而後再經過PS端的Mater GP1把數據讀出來,將結果打印輸出到串口終端顯示。app
涉及到AXI BRAM Controller 和 Block Memery Generator等IP的使用。框架
本系列文章儘量的讓每個實驗都相對獨立,過程儘量保證完整性,保證明驗的可重現性。 可是用到的模塊或者IP的具體做用和用法不保證都重複詳細的介紹。函數
本文所使用的開發板是Miz702 PC 開發環境版本:Vivado 2015.4 Xilinx SDK 2015.4佈局
Step1:新建一個名爲爲Miz701_sys的工程測試
Step2:選擇RTL Project 勾選Do not specify source at this timethis
Step3:選擇xc7z010clg400-1爲開發器件。3d
Step4:單擊Finishblog
Step1:單擊Create Block Design接口
Step2:輸入system內存
Step4:搜素單詞z選擇ZYNQ7 Processing System,而後雙擊
Step5:添加進來了ZYNQ CPU IP,而後雙擊對其進行配置。
Step6:修改輸入時鐘爲50MHZ,PL端頻率FCLK_CLK0爲100MHZ。
Step7:修改內存型號爲MT41K256M16 RE-125。
Step8:在MIO configuration選項中,勾選添加UART1接口。
Step9: 在PL-PS Configuration下,選中 GP0和GP1而後 點擊ok。
Step10:單擊Run Block Automation進行智能佈線。
Step11:直接單擊OK
Step12:在你點擊了OK後,你會發現DDR以及FICED_IO自動的延伸出來。
Step13:連線的做用就是把PS的時鐘能夠接入PL部分,固然這裏咱們暫時用不到PL部分的資源。在Block文件中,咱們迚行連線,將鼠標放在引腳處,鼠標變成鉛筆後迚行拖拽,連線以下圖所示:
Step14:點擊,Add IP,連續添加兩個 AXI BRAM Controller
Step15:分別雙擊AXI BRAM Controller模塊,把number of BRAM interfaces 所有修改爲1
Step16:點擊ADD IP,添加Block Memory Generator
Step17:雙擊Block Memory Generator ,修改Memory Type。
Step18:點擊run Connection Automation,把axi_bram_ctrl_1的S_AXI端口的鏈接目標修改成如圖所示:
Step19:點擊從新佈局,生成好的硬件框架以下
Step20:點擊Address Editor 能夠看到系統已經爲咱們自動分配好了正確的地址
Step21: 右擊 system.bd, 單擊Generate Output Products
Step22:支部操做會產生執行、仿真、綜合的文件
Step23:右擊system.bd 選擇 Create HDL Wrapper 這步的做用是產生頂層的HDL文件
Step24:選擇Leave Let Vivado manager wrapper and auto-update 而後單擊OK
Step1:File->Export->Export Hardware
Step2:勾選Include bitstream 直接單擊OK
Step3:File->Launch SDK加載到SDK
Step4:單擊OK
Step1:打開的SDK界面以下,這裏的信息是和硬件相關的,例如在Address Map 這一欄下能夠看到axi_bram_ctrl_0和剛剛在vavado Address Editor下的地址是一致的
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; } |
串口終端打印輸出信息以下:
------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端把數據寫入到PL端的BRAM,而後從而又把數據從PL端讀到PS端,從而簡單的實現了PL和PS的數據交互和共享。