學(xué)習(xí)內(nèi)容
本文介紹關(guān)于AXI BRAM控制器的相關(guān)內(nèi)容,針對(duì)數(shù)據(jù)量較少、地址不連續(xù)、長度不規(guī)則的情況,通過 BRAM 來進(jìn)行數(shù)據(jù)的交互。
開發(fā)環(huán)境
vivado 18.3&SDK,PYNQ-Z2開發(fā)板。
AXI BRAM控制器
簡介
BRAM控制器可以用于與 AXI 互連和系統(tǒng)主設(shè)備的集成,以與本地塊 RAM 進(jìn)行通信。內(nèi)核支持到塊 RAM 的單次和突發(fā)傳輸,并針對(duì)性能進(jìn)行了優(yōu)化。AX14或AX14- lite控制器配置中,可以配置到BRAM塊的單個(gè)端口或到BRAM塊的兩個(gè)端口。通過第二個(gè)AX14-Lite控制端口連接,AXI BRAM控制器IP可以在數(shù)據(jù)路徑上配置ECC功能,并通過可用的外部ECC寄存器設(shè)置。AXI BRAM Controller IP核的頂級(jí)端口連接和主模塊如下圖所示。展示了AX14-Lite模式下,AXI BRAM核心與BRAM塊的連接??梢岳肂RAM塊的單端口利用率或BRAM塊的雙端口模式(通過參數(shù)設(shè)置)。
下圖展示了為支持AX14接口而生成的HDL核心。對(duì)BRAM塊的單端口使用可以配置在雙端口配置中增強(qiáng)的性能設(shè)置。,詳細(xì)結(jié)構(gòu)框圖如下:
所有與axis主設(shè)備的通信都是通過一個(gè)5通道的axis接口進(jìn)行的。所有寫操作都在AXI總線的寫地址通道(AW)上啟動(dòng),該通道指定了寫事務(wù)的類型和相應(yīng)的地址信息。寫數(shù)據(jù)通道(W)為單個(gè)或突發(fā)寫操作通信所有寫數(shù)據(jù)。寫響應(yīng)通道(B)用作寫操作的握手或響應(yīng)。
在讀操作上,當(dāng)AXI主程序請(qǐng)求讀傳輸時(shí),讀地址通道(AR)通信所有地址和控制信息。當(dāng)可以處理讀操作時(shí),AXI從AXI BRAM控制器IP響應(yīng)讀地址通道(AR)。當(dāng)讀取數(shù)據(jù)可用時(shí),讀數(shù)據(jù)通道(R)將轉(zhuǎn)換操作的數(shù)據(jù)和狀態(tài)。
支持內(nèi)存大小
AXI BRAM Controller支持的內(nèi)存最大為2mbytes(字節(jié)大小為8或9),支持的內(nèi)存寬度和深度如表1-1所示。
AXI BRAM Controller IP支持的最小深度為512字節(jié)。任何小于512的深度都被調(diào)整為512字節(jié)。
系統(tǒng)框圖與工程設(shè)計(jì)
工程功能設(shè)計(jì)為PS 將串口接收到的數(shù)據(jù)寫入 BRAM,然后從 BRAM 中讀出數(shù)據(jù),并通過串口打印出來;與此同時(shí), PL 從 BRAM 中同樣讀出數(shù)據(jù),并通過 ILA 來觀察讀出的數(shù)據(jù)與串口打印的數(shù)據(jù)是否一致。系統(tǒng)框圖如下:
使能clock復(fù)位和 M_GP0接口,
配置時(shí)鐘,
配置BRAM控制器和BRAM
接著配置BRAM控制器,基本是默認(rèn)配置。
配置BRAM
連接連線后系統(tǒng)如下,
設(shè)計(jì)讀取控制模塊
首先點(diǎn)擊tools創(chuàng)建一個(gè)新的IP,
選擇創(chuàng)建一個(gè)AXI4接口的IP。
編輯IP名稱等信息,設(shè)計(jì)IP的接口信息,
點(diǎn)擊finish,完成IP創(chuàng)建。
在IP目錄下找到自己創(chuàng)建好的IP,右鍵進(jìn)行IP的編輯。
在頂層進(jìn)行例化ram接口。
在AXI總線協(xié)議實(shí)現(xiàn)的文件中添加IP的例化,實(shí)現(xiàn)AXI-Lite接口的功能進(jìn)行參數(shù)的傳遞。
這里引用正點(diǎn)原子的BRAM的讀取模塊,bram_rd.v
module bram_rd(
input clk , //時(shí)鐘信號(hào)
input rst_n , //復(fù)位信號(hào)
input start_rd , //讀開始信號(hào)
input [31:0] start_addr , //讀開始地址
input [31:0] rd_len , //讀數(shù)據(jù)的長度
//RAM端口
output ram_clk , //RAM時(shí)鐘
input [31:0] ram_rd_data, //RAM中讀出的數(shù)據(jù)
output reg ram_en , //RAM使能信號(hào)
output reg [31:0] ram_addr , //RAM地址
output reg [3:0] ram_we , //RAM讀寫控制信號(hào)
output reg [31:0] ram_wr_data, //RAM寫數(shù)據(jù)
output ram_rst //RAM復(fù)位信號(hào),高電平有效
);
define
reg [1:0] flow_cnt;
reg start_rd_d0;
reg start_rd_d1;
define
wire pos_start_rd;
//*****************************************************
main code
//*****************************************************
assign ram_rst = 1'b0;
assign ram_clk = clk ;
assign pos_start_rd = ~start_rd_d1 & start_rd_d0;
//延時(shí)兩拍,采start_rd信號(hào)的上升沿
always @(posedge clk or negedge rst_n) begin
begin
start_rd_d0 <= 1'b0;
start_rd_d1 <= 1'b0;
end
else begin
start_rd_d0 <= start_rd;
start_rd_d1 <= start_rd_d0;
end
end
//根據(jù)讀開始信號(hào),從RAM中讀出數(shù)據(jù)
always @(posedge clk or negedge rst_n) begin
begin
flow_cnt <= 2'd0;
ram_en <= 1'b0;
ram_addr <= 32'd0;
ram_we <= 4'd0;
end
else begin
case(flow_cnt)
begin
: begin
ram_en <= 1'b1;
ram_addr <= start_addr;
flow_cnt <= flow_cnt + 2'd1;
end
end
begin
: - start_addr == rd_len - 4) begin //數(shù)據(jù)讀完
ram_en <= 1'b0;
flow_cnt <= flow_cnt + 2'd1;
end
else
ram_addr <= ram_addr + 32'd4; //地址累加4
end
begin
: ram_addr <= 32'd0;
flow_cnt <= 2'd0;
end
endcase
end
end
endmodule
創(chuàng)建引腳接口,選擇任意一個(gè)BRAM引腳,創(chuàng)建封裝
設(shè)置接口和名稱,
完成接口映射。
然后點(diǎn)擊完成IP封裝。
完成系統(tǒng)設(shè)計(jì)
完成IP的創(chuàng)建后,添加IP,完成連線,整體設(shè)計(jì)如下圖所示:
然后在完成綜合后進(jìn)行setup debug ,抓取b端口有關(guān)的信號(hào)。
完成添加DEDUG信號(hào)后,進(jìn)行綜合生成bit流,然后導(dǎo)出硬件,launch SDK。
SDK軟件部分
新建應(yīng)用工程,main.c中輸入以下代碼:
char input_data[1024];
int len_input_data;
int main(){
while(1){
int i=0;
int wr_cnt=0;
printf("ps_pl_bram test
");
scanf("%s",input_data);
len_input_data= strlen(input_data);
for(i = START_ADDR*BRAM_DATA_BYTE;i<(START_ADDR + len_input_data)*BRAM_DATA_BYTE;i+=BRAM_DATA_BYTE)
{
PS_PL_RD_IP_mWriteReg(XPAR_BRAM_0_BASEADDR,i,input_data[wr_cnt]);
wr_cnt++;
}
//配置起始地址
PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_START_ADDR,START_ADDR*BRAM_DATA_BYTE);
//配置讀取長度
PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_LEN,len_input_data*BRAM_DATA_BYTE);
//使能脈沖
PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_START,1);
PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_START,0);
for(i = START_ADDR*BRAM_DATA_BYTE;i<(START_ADDR + len_input_data)*BRAM_DATA_BYTE;i+=BRAM_DATA_BYTE)
{
printf("bram address : %d ,read data : %c
",i/BRAM_DATA_BYTE,PS_PL_RD_IP_mReadReg(XPAR_BRAM_0_BASEADDR,i));
}
}
}
部分代碼講解
本次工程比較簡單,在while循環(huán)中實(shí)現(xiàn)了對(duì)串口輸入的存儲(chǔ)和顯示打印。
運(yùn)行效果
ila抓取數(shù)據(jù)
通過ILA抓取的讀取數(shù)據(jù)和發(fā)送寫入的數(shù)據(jù)一致。
審核編輯 :李倩
-
控制器
+關(guān)注
關(guān)注
114文章
17100瀏覽量
184223 -
BRAM
+關(guān)注
關(guān)注
0文章
41瀏覽量
11301
原文標(biāo)題:SDK軟件部分
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
NVMe控制器IP設(shè)計(jì)系列之接口轉(zhuǎn)換模塊

NVMe控制器IP設(shè)計(jì)之接口轉(zhuǎn)換

工程機(jī)械控制器廠家 控制器國產(chǎn)替代 #國產(chǎn)控制器#控制器廠家#控制器品牌
高速SSD存儲(chǔ)系統(tǒng)中數(shù)據(jù)緩存控制器整體頂層設(shè)計(jì)


請(qǐng)問STM32G473是否支持硬件AES?
求助,為什么ETH配置中沒有Advanced Parameters?
DLPR150PROM-2.3.1版本的固件是否包含圖像信息,如何切換圖像?
電機(jī)控制器EMC測(cè)試整改:確保電磁兼容性有效手段
晶體生長相關(guān)內(nèi)容——晶型控制與襯底缺陷
EMC電機(jī)控制器測(cè)試整改:性能提升的完整路徑
電機(jī)控制器原理是什么?類型有哪些?
TAS6424(L)-Q1 Fault腳如何控制拉低?
求助,關(guān)于LM331 F/V轉(zhuǎn)換電路輸入電容選擇的問題求解
Xilinx NVMe AXI4主機(jī)控制器,AXI4接口高性能版本介紹

評(píng)論