簡體   English   中英

無法從Linux訪問Znyq AXI BRAM

[英]Unable to access Znyq AXI BRAM from Linux

在我的項目中,數據從自定義IP寫入BRAM(通過Block Ram IP生成器生成)。 然后,我使用AXI BRAM控制器將內存與AXI總線接口,並使其可在ARM上運行的Linux上訪問。

控制器的基地址為0x4200_0000,范圍為8K(最大0x4200_1FFF)。 存儲器也有8K個位置,每個位置的寬度為32位。

為確保訪問問題不在我的自定義IP中生成的數據中,我僅對每個8K地址(因此地址1包含0x01等,最多0x1fff)進行編號即可初始化內存。

嘗試從Linux讀取這些值時出現問題。 在命令行上使用devmem 0x42000001返回0x04000000和以下內容:

Alignment trap: devmem (1257) PC=0x0001ca94 Instr=0xe7902005 Address=0xb6f9d2fd FSR 0x011

這似乎表明Linux期望每個地址值映射到一個字節,而不是32位字。 對齊陷阱一直持續到devmem 0x42000004 ,它返回0x00000004(第四個方向的正確值),但無法訪問地址中不是4的倍數的值。 devmem 0x42000002返回0x00040000(注意偏移0x04)以及對齊陷阱。 我發現了使用mmap映射/ dev / mem的原始python腳本的問題:由於每個單獨的地址似乎都映射到一個字節,因此我必須讀取每個4個地址值,但這意味着我只能獲取這四個值之一。

關於如何正確與AXI控制器及其背后的存儲器接口的任何想法?

*******編輯以澄清我遇到的問題。 如有疑問,請添加圖片:

問題圖

這似乎表明Linux期望每個地址值都映射到一個字節

這是所有現代CPU中的標准映射。 當您使用數據總線寬度超過8位的AXI時,最低地址位將從AXI數據總線中選擇一個字節。 請訪問ARM網站並下載AXI規范。

控制器的基地址為0x4200_0000,范圍為8K(最大0x4200_1FFF)。 存儲器也有8K個位置,每個位置的寬度為32位。

這是錯誤的,32位的8K具有8K * 4 = 0x0000 .. 0x7FFF的地址范圍。

我建議您重新構建BRAM,但對Block Ram IP生成器使用不同的參數。


我更改了RAM,使暴露給AXI控制器的端口可以使用8位。 .....

您的Zynq AXI總線可能約為32位寬。 因此,標准連接的存儲器應為32位寬,並應啟用字節寫入功能。
如果將8位存儲器連接到32位總線而沒有這樣做,或者錯誤地修改了地址,則可能會丟失4個字節中的3個。

我不清楚您到底想要哪種行為。

  1. 具有字節訪問權限的標准8Kx32位存儲器
    要么
  2. 8kx8位存儲器,其中0x0、0x4、0x8等處有一個字節。

在第2種情況下,您應該使用不同的AXI地址:您應該將地址位上移兩個位置,以便每個字節占用4個地址位置。 您還必須決定將字節放置在何處:

  • 僅LS位置:將MS 24位綁定為零

  • 僅限於MS位置:將LS 24位綁定為零

  • 在所有4個位置重復:在32位上將字節復制四次。

  • 不管你喜歡什么。 (這是您的硬件,您可以執行所需的操作。)

請注意,對於連接到AXI總線的任何模塊,應將前面的AXI分離器設置為覆蓋正確的地址范圍。 但我認為您沒有這些。

暫無
暫無

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

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