簡體   English   中英

從 PS 和 PL 訪問 Zynq BRAM

[英]Access Zynq BRAM from PS and PL

我正在嘗試將一些數據寫入雙端口 BRAM 並從 PL 中讀取。 我從 IP 目錄中創建了一個定制的 BRAM,並將其放入包裝器中,以便我可以在框圖中使用它。 PORTA 寬度為 32 位,PORTB 寬度為 256 位。 我需要傳輸 1024 個 8 位值,因此 PORTA 深度為 256(8 位),而 PORTB 深度為 32(5 位)。 我在 32 位模式下使用標准 BRAM 控制器(深度為 2048,但這不重要嗎?)。

框圖

要通過 AXI 接口將數據寫入 BRAM,我使用 function Xil_Out32(BASE_ADDR+0, 0xFFFFFFFF) 當我想訪問 BRAM 中的下一個 32 位數據時,使用Xil_Out32(BASE_ADDR+4, 0xFFFFFFFF) +4 導致 memory 是字節對齊的,對吧? (當我使用 +1 時,我的程序崩潰了)。

要通過 PL 從 BRAM 讀取數據,我只需在addrb[4:0]上放置一個地址,然后在兩個時鍾周期后從doutb[255:0]獲取我的數據。 因為“addrb”只有 5 位,這不能是字節對齊的,所以每次我向 addrb 添加 +1 時,我都會從 BRAM 獲得下一個 256 位,對吧?

好的。 現在我的問題:我在 PS 上執行以下操作:

Xil_Out32(BASE_ADDR+0, 0xFFFFFFFF);
Xil_Out32(BASE_ADDR+4, 0xAAAAAAAA);

並從 PL 讀取我的 256 位 output 上的地址 0x00,output 如下所示:

0x000000000000000000000000AAAAAAAA000000000000000000000000FFFFFFFF

我還把它放在一個小圖中,以使其更清楚:

問題描述

我希望有人能把我引向正確的方向......

因為“addrb”只有 5 位,這不能是字節對齊的,所以每次我向 addrb 添加 +1 時,我都會從 bram 獲得下一個 256 位,對吧?

這個結論有點太快了。 這在很大程度上取決於所有地址總線的連接方式。 標准 AXI 地址總線始終具有 LS 地址位,即使它們從未使用過。

例如,我的 AXI DMA 引擎有一個 128 寬的數據總線。 地址端口仍然有:

output logic  [31:0] m_axi_awaddr,

然而,底部 4 個地址位 [3:0] 始終為零。 如果我想在 memory 中寫入連續位置,我必須以 16 步(16 字節為 128 位)遞增地址總線。

但在其他地方,我有一個帶有 8 位寬 4K 深 BRAM 的 VGA 適配器,我將 AXI[2] 連接到 BRAM A[0]。 現在,如果我想在 BRAM memory 中寫入連續的字節位置,我必須以 4 步遞增地址總線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM