一、簡(jiǎn)介
BRAM(Block RAM)是 PL 部分的存儲(chǔ)器陣列,PS 和 PL 通過(guò)對(duì) BRAM 進(jìn)行讀寫操作,來(lái)實(shí)現(xiàn)數(shù)據(jù)的交互。在 PL 中,通過(guò)輸出時(shí)鐘、地址、讀寫控制等信號(hào)來(lái)對(duì) BRAM 進(jìn)行讀寫操作。而在 PS 中,處理器并不需要直接驅(qū)動(dòng) BRAM 的端口,而是通過(guò) AXI BRAM 控制器來(lái)對(duì) BRAM 進(jìn)行讀寫操作。AXI BRAM 控制器是集成在 Vivado 設(shè)計(jì)軟件中的軟核,可以配置成 AXI4-lite 接口模式或者 AXI4 接口模式。
AXI4 接口模式的 BRAM 控制器支持的數(shù)據(jù)位寬為 32 位、64 位、128 位、512 位和 1024 位,而 AXI4-Lite接口僅支持 32 位數(shù)據(jù)位寬。PS 通過(guò) AXI4-Lite 接口訪問(wèn) BRAM,當(dāng)使能 ECC 選項(xiàng)時(shí),ECC 允許 AXI 主接口檢測(cè)和糾正 BRAM 塊中的單位和雙位錯(cuò)誤。AXI BRAM 控制器作為 AXI 總線的從接口,和 AXI 主接口實(shí)現(xiàn)互聯(lián),來(lái)對(duì) BRAM 進(jìn)行讀寫操作。針對(duì)不同的應(yīng)用場(chǎng)合,該 IP 核支持單次傳輸和突發(fā)傳輸兩種方式。
任務(wù):
PS 將串口接收到的數(shù)據(jù)寫入 BRAM,然后從 BRAM 中讀出數(shù)據(jù),并通過(guò)串口打印出來(lái);與此同時(shí),PL 從 BRAM 中同樣讀出數(shù)據(jù),并通過(guò) ILA 來(lái)觀察讀出的數(shù)據(jù)與串口打印的數(shù)據(jù)是否一致。下面是系統(tǒng)框圖

PS 端的 M_AXI_GP0 作為主端口,與 PL 端的 AXI BRAM 控制器 IP 核和 PL 讀 BRAM IP (pl_bram_rd)通過(guò) AXI4 總線進(jìn)行連接。其中,AXI 互聯(lián) IP(AXI Interconnect)用于連接 AXI 存儲(chǔ)器映射(memory-mapped)的主器件和從器件;AXI BRAM 控制器作為 PS 端讀寫 BRAM 的 IP 核;PL 讀BRAM IP 核是我們自定義的 IP 核,實(shí)現(xiàn)了 PL 端從 BRAM 中讀出數(shù)據(jù)的功能,除此之外,PS 端通過(guò) AXI總線來(lái)配置該 IP 核讀取 BRAM 的起始地址和個(gè)數(shù)等。本實(shí)驗(yàn)中,我們將自定義的IP核替換成AXI BRAM IP核。
本次實(shí)驗(yàn)創(chuàng)建的BRAM是雙端口RAM,兩個(gè)端口均連接AXI BRAM控制器
二、硬件設(shè)計(jì)

接著我們調(diào)用一個(gè)雙端口RAM



綜合后的連線圖

三、SDK驗(yàn)證
工程代碼
#include <stdio.h>
#include "xil_io.h"
#include "xparameters.h"
#include "xbram.h"
#define BRAM_CTRL_0_BASE XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR//用于寫入數(shù)據(jù),操作A端口的AXI總線基地址
#define BRAM_CTRL_1_BASE XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR//用于讀數(shù)據(jù),操作B端口的AXI總線基地址
char test_string[]="test ps pl bram string\n";
int main()
{
int num,str_len;
int str_rev;
xil_printf("application start \n");
str_len=strlen(test_string);//計(jì)算寫入長(zhǎng)度
//通過(guò)控制axi_bram_ctrl_0像雙端口ram寫入test_string
for( num=0; num<str_len; num++ )
{
XBram_WriteReg(BRAM_CTRL_0_BASE , num*4, test_string[num]);
}
//通過(guò)控制axi_bram_ctrl_1讀出寫入的數(shù)據(jù)
for( num=0; num<str_len; num++ )
{
str_rev = XBram_ReadReg( BRAM_CTRL_1_BASE, num*4);
xil_printf( "ADDR:%x DAT:%c\n",XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4,str_rev);
}
xil_printf("test over!\n");
return 0;
}
調(diào)試如下文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-787400.html

地址高位是42開頭的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-787400.html

到了這里,關(guān)于PS和PL使用BRAM進(jìn)行數(shù)據(jù)交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!