開發者分享 | 有關 Zynq UltraScale+ RFSoC 的 AXI CDMA Linux...

2020-12-06 電子工程專輯

本篇博文將為您演示如何創建 AXI CDMA Linux 用戶空間示例應用。

示例設計將在 Zynq UltraScale+ RFSoC ZCU111 評估板上實現通過 AXI CDMA 把數據從 PS DDR 傳輸至 AXI BRAM。

適用平臺


Vivado 和 PetaLinux 2019.2。

Zynq UltraScale+ RFSoC ZCU111 評估板

啟動模式:JTAG,SD


模塊框圖



Vivado步驟

 

步驟 1:基於ZCU111 評估版創建一個工程,並根據上圖中的模塊設計完成相應的模塊設計。

步驟 2:按下列設置來配置 AXI CDMA:



步驟 3:成功完成後,選擇「驗證設計 (Validate design)」以驗證設計,並檢查地址編輯器。

步驟4:創建整個模塊設計的頂層文件並生成比特流。

步驟 5:導出硬體設計以獲取 XSA 文件。


PetaLinux步驟

 

以下步驟用於生成啟動鏡像和 Linux 用戶空間應用。

步驟 1:

使用以下命令和隨附內容 (axicdma.c) 創建 AXI CDMA 用戶空間應用。

步驟 2:

petalinux-create -t project -n bram --template zynqMP

步驟3:

petalinux-config --v --get-hw-description=<hdf directory>

步驟4:

在 system-user.dtsi 文件中添加以下更改以禁用 CDMA 驅動並保留內存。

           /include/ "system-conf.dtsi"
           / {
           #address-cells = <2>;
           #size-cells = <2>;
           memory {
           device_type = "memory";
           reg = <0x0 0x0 0x0 0x80000000>, <0x0 0xA0000000 0x0 0x40000>, <0x00000008 0x00000000 0x0 0x80000000>;
           };
           reserved-memory {
           ranges;
           reserved {
           reg = <0x0 0xa0000000 0x0 0x40000>;
           };
           };

           };
           &axi_bram_ctrl_1 {
           status = "disabled";
           };

           &axi_cdma_0 {
           status = "disabled";
           };


步驟 5:

petalinux-config -c kernel

然後,按如下方式操作:

           Kernel hacking  --->[ ] Filter access to /dev/mem  --> Save & exit 

步驟 6:

步驟 7:

petalinux-package --boot --fsbl images/linux/zynqmp_fsbl.elf --pmufw images/linux/pmufw.elf --fpga images/linux/system.bit  --u-boot  images/linux/u-boot.elf --force

步驟 8: 

將 BOOT.bin 和 image.ub 文件與測試應用二進位文件一起複製到 SD 卡。

步驟 9:

啟動評估板,並運行隨附的應用 (axicmda.c)。


運行設計


要運行設計,請首先連接到 ZCU111 評估板並從 SD 卡啟動鏡像,然後運行二進位應用文件。


控制臺輸出


/dev/mem opened.
BRAM Memory mapped at address 0x7fb5339000.
PSDDR Memory mapped at address 0x7fb5192000.
CDMA Memory mapped at address 0x7fb5336000.
Input : value in PSDDR 0 : value in BRAM 1179403647
Input : value in PSDDR 1 : value in BRAM 65794
Input : value in PSDDR 2 : value in BRAM 0
Input : value in PSDDR 3 : value in BRAM 0
Input : value in PSDDR 4 : value in BRAM 11993091
Input : value in PSDDR 5 : value in BRAM 1
Input : value in PSDDR 6 : value in BRAM 13128
Input : value in PSDDR 7 : value in BRAM 0
Input : value in PSDDR 8 : value in BRAM 64
Input : value in PSDDR 9 : value in BRAM 0
Input : value in PSDDR 10 : value in BRAM 44872
Input : value in PSDDR 11 : value in BRAM 0
Input : value in PSDDR 12 : value in BRAM 0
Input : value in PSDDR 13 : value in BRAM 3670080
Input : value in PSDDR 14 : value in BRAM 4194313
Input : value in PSDDR 15 : value in BRAM 1638426
Input : value in PSDDR 16 : value in BRAM 6
Input : value in PSDDR 17 : value in BRAM 4
Input : value in PSDDR 18 : value in BRAM 64
Input : value in PSDDR 19 : value in BRAM 0
Input : value in PSDDR 20 : value in BRAM 64
Input : value in PSDDR 21 : value in BRAM 0
Input : value in PSDDR 22 : value in BRAM 64
Input : value in PSDDR 23 : value in BRAM 0
Input : value in PSDDR 24 : value in BRAM 504
Input : value in PSDDR 25 : value in BRAM 0
Input : value in PSDDR 26 : value in BRAM 504
Input : value in PSDDR 27 : value in BRAM 0
Input : value in PSDDR 28 : value in BRAM 8
Input : value in PSDDR 29 : value in BRAM 0
Input : value in PSDDR 30 : value in BRAM 3
Input : value in PSDDR 31 : value in BRAM 4
Input : value in PSDDR 32 : value in BRAM 568
Input : value in PSDDR 33 : value in BRAM 0
Input : value in PSDDR 34 : value in BRAM 568
Input : value in PSDDR 35 : value in BRAM 0
Input : value in PSDDR 36 : value in BRAM 568
Input : value in PSDDR 37 : value in BRAM 0
Input : value in PSDDR 38 : value in BRAM 27
Input : value in PSDDR 39 : value in BRAM 0
Input : value in PSDDR 40 : value in BRAM 27
Input : value in PSDDR 41 : value in BRAM 0
Input : value in PSDDR 42 : value in BRAM 1
Input : value in PSDDR 43 : value in BRAM 0
Input : value in PSDDR 44 : value in BRAM 1
Input : value in PSDDR 45 : value in BRAM 5
Input : value in PSDDR 46 : value in BRAM 0
Input : value in PSDDR 47 : value in BRAM 0
Input : value in PSDDR 48 : value in BRAM 0
Input : value in PSDDR 49 : value in BRAM 0
Input : value in PSDDR 50 : value in BRAM 0
Input : value in PSDDR 51 : value in BRAM 0
Input : value in PSDDR 52 : value in BRAM 37116
Input : value in PSDDR 53 : value in BRAM 0
Input : value in PSDDR 54 : value in BRAM 37116
Input : value in PSDDR 55 : value in BRAM 0
Input : value in PSDDR 56 : value in BRAM 65536
Input : value in PSDDR 57 : value in BRAM 0
Input : value in PSDDR 58 : value in BRAM 1
Input : value in PSDDR 59 : value in BRAM 6
Input : value in PSDDR 60 : value in BRAM 39544
Input : value in PSDDR 61 : value in BRAM 0
Input : value in PSDDR 62 : value in BRAM 105080
Input : value in PSDDR 63 : value in BRAM 0
Input : value in PSDDR 64 : value in BRAM 105080
Input : value in PSDDR 65 : value in BRAM 0
Input : value in PSDDR 66 : value in BRAM 5072
Input : value in PSDDR 67 : value in BRAM 0
Input : value in PSDDR 68 : value in BRAM 6168
Input : value in PSDDR 69 : value in BRAM 0
Input : value in PSDDR 70 : value in BRAM 65536
Input : value in PSDDR 71 : value in BRAM 0
Input : value in PSDDR 72 : value in BRAM 2
Input : value in PSDDR 73 : value in BRAM 6
Input : value in PSDDR 74 : value in BRAM 39560
Input : value in PSDDR 75 : value in BRAM 0
Input : value in PSDDR 76 : value in BRAM 105096
Input : value in PSDDR 77 : value in BRAM 0
Input : value in PSDDR 78 : value in BRAM 105096
Input : value in PSDDR 79 : value in BRAM 0
Input : value in PSDDR 80 : value in BRAM 512
Input : value in PSDDR 81 : value in BRAM 0
Input : value in PSDDR 82 : value in BRAM 512
Input : value in PSDDR 83 : value in BRAM 0
Input : value in PSDDR 84 : value in BRAM 8
Input : value in PSDDR 85 : value in BRAM 0
Input : value in PSDDR 86 : value in BRAM 4
Input : value in PSDDR 87 : value in BRAM 4
Input : value in PSDDR 88 : value in BRAM 596
Input : value in PSDDR 89 : value in BRAM 0
Input : value in PSDDR 90 : value in BRAM 596
Input : value in PSDDR 91 : value in BRAM 0
Input : value in PSDDR 92 : value in BRAM 596
Input : value in PSDDR 93 : value in BRAM 0
Input : value in PSDDR 94 : value in BRAM 68
Input : value in PSDDR 95 : value in BRAM 0
Input : value in PSDDR 96 : value in BRAM 68
Input : value in PSDDR 97 : value in BRAM 0
Input : value in PSDDR 98 : value in BRAM 4
Input : value in PSDDR 99 : value in BRAM 0
control reg:0x00000000
status reg:0x00000002
all interrupts masked...
control reg:0x00005000
status reg:0x00000002
Writing source address
Source addr reg:0x04000000
status reg:0x00000002
Writing destination address
Dest addr reg:0xa0000000
status reg:0x00000002
Writing transfer length...
DMA transfer is completed
length reg:0x00000190
status reg:0x00001002
Output : value in PSDDR 0 : value in BRAM 0
Output : value in PSDDR 1 : value in BRAM 1
Output : value in PSDDR 2 : value in BRAM 2
Output : value in PSDDR 3 : value in BRAM 3
Output : value in PSDDR 4 : value in BRAM 4
Output : value in PSDDR 5 : value in BRAM 5
Output : value in PSDDR 6 : value in BRAM 6
Output : value in PSDDR 7 : value in BRAM 7
Output : value in PSDDR 8 : value in BRAM 8
Output : value in PSDDR 9 : value in BRAM 9
Output : value in PSDDR 10 : value in BRAM 10
Output : value in PSDDR 11 : value in BRAM 11
Output : value in PSDDR 12 : value in BRAM 12
Output : value in PSDDR 13 : value in BRAM 13
Output : value in PSDDR 14 : value in BRAM 14
Output : value in PSDDR 15 : value in BRAM 15
Output : value in PSDDR 16 : value in BRAM 16
Output : value in PSDDR 17 : value in BRAM 17
Output : value in PSDDR 18 : value in BRAM 18
Output : value in PSDDR 19 : value in BRAM 19
Output : value in PSDDR 20 : value in BRAM 20
Output : value in PSDDR 21 : value in BRAM 21
Output : value in PSDDR 22 : value in BRAM 22
Output : value in PSDDR 23 : value in BRAM 23
Output : value in PSDDR 24 : value in BRAM 24
Output : value in PSDDR 25 : value in BRAM 25
Output : value in PSDDR 26 : value in BRAM 26
Output : value in PSDDR 27 : value in BRAM 27
Output : value in PSDDR 28 : value in BRAM 28
Output : value in PSDDR 29 : value in BRAM 29
Output : value in PSDDR 30 : value in BRAM 30
Output : value in PSDDR 31 : value in BRAM 31
Output : value in PSDDR 32 : value in BRAM 32
Output : value in PSDDR 33 : value in BRAM 33
Output : value in PSDDR 34 : value in BRAM 34
Output : value in PSDDR 35 : value in BRAM 35
Output : value in PSDDR 36 : value in BRAM 36
Output : value in PSDDR 37 : value in BRAM 37
Output : value in PSDDR 38 : value in BRAM 38
Output : value in PSDDR 39 : value in BRAM 39
Output : value in PSDDR 40 : value in BRAM 40
Output : value in PSDDR 41 : value in BRAM 41
Output : value in PSDDR 42 : value in BRAM 42
Output : value in PSDDR 43 : value in BRAM 43
Output : value in PSDDR 44 : value in BRAM 44
Output : value in PSDDR 45 : value in BRAM 45
Output : value in PSDDR 46 : value in BRAM 46
Output : value in PSDDR 47 : value in BRAM 47
Output : value in PSDDR 48 : value in BRAM 48
Output : value in PSDDR 49 : value in BRAM 49
Output : value in PSDDR 50 : value in BRAM 50
Output : value in PSDDR 51 : value in BRAM 51
Output : value in PSDDR 52 : value in BRAM 52
Output : value in PSDDR 53 : value in BRAM 53
Output : value in PSDDR 54 : value in BRAM 54
Output : value in PSDDR 55 : value in BRAM 55
Output : value in PSDDR 56 : value in BRAM 56
Output : value in PSDDR 57 : value in BRAM 57
Output : value in PSDDR 58 : value in BRAM 58
Output : value in PSDDR 59 : value in BRAM 59
Output : value in PSDDR 60 : value in BRAM 60
Output : value in PSDDR 61 : value in BRAM 61
Output : value in PSDDR 62 : value in BRAM 62
Output : value in PSDDR 63 : value in BRAM 63
Output : value in PSDDR 64 : value in BRAM 64
Output : value in PSDDR 65 : value in BRAM 65
Output : value in PSDDR 66 : value in BRAM 66
Output : value in PSDDR 67 : value in BRAM 67
Output : value in PSDDR 68 : value in BRAM 68
Output : value in PSDDR 69 : value in BRAM 69
Output : value in PSDDR 70 : value in BRAM 70
Output : value in PSDDR 71 : value in BRAM 71
Output : value in PSDDR 72 : value in BRAM 72
Output : value in PSDDR 73 : value in BRAM 73
Output : value in PSDDR 74 : value in BRAM 74
Output : value in PSDDR 75 : value in BRAM 75
Output : value in PSDDR 76 : value in BRAM 76
Output : value in PSDDR 77 : value in BRAM 77
Output : value in PSDDR 78 : value in BRAM 78
Output : value in PSDDR 79 : value in BRAM 79
Output : value in PSDDR 80 : value in BRAM 80
Output : value in PSDDR 81 : value in BRAM 81
Output : value in PSDDR 82 : value in BRAM 82
Output : value in PSDDR 83 : value in BRAM 83
Output : value in PSDDR 84 : value in BRAM 84
Output : value in PSDDR 85 : value in BRAM 85
Output : value in PSDDR 86 : value in BRAM 86
Output : value in PSDDR 87 : value in BRAM 87
Output : value in PSDDR 88 : value in BRAM 88
Output : value in PSDDR 89 : value in BRAM 89
Output : value in PSDDR 90 : value in BRAM 90
Output : value in PSDDR 91 : value in BRAM 91
Output : value in PSDDR 92 : value in BRAM 92
Output : value in PSDDR 93 : value in BRAM 93
Output : value in PSDDR 94 : value in BRAM 94
Output : value in PSDDR 95 : value in BRAM 95
Output : value in PSDDR 96 : value in BRAM 96
Output : value in PSDDR 97 : value in BRAM 97
Output : value in PSDDR 98 : value in BRAM 98
Output : value in PSDDR 99 : value in BRAM 99
Transmitted Data successfully
root@cdma_proj:~#


輸出截屏


參考資料:

https://china.xilinx.com/support/documentation/ip_documentation/axi_cdma/v4_1/pg034-axi-cdma.pdf

https://china.xilinx.com/support/documentation/sw_manuals/xilinx2019_2/ug1144-petalinux-tools-reference-guide.pdf

 

相關焦點

  • ZYNQ系列FPGA使用,PS與PL接口設計和硬體設計
    4個寄存器共需要2位地址線來進行尋址,由於slave是掛在ARM 處理器外部的,當處理器調用函數寫外設的寄存器,如果不做偏移,那麼數據就會寫入寄存器0,因此地址axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]決定了將數據寫入哪個寄存器。
  • 詳細解讀Zynq的三種啟動方式(JTAG,SD,QSPI)
    本文介紹zynq上三種方式啟動文件的生成和注意事項,包括只用片上RAM(OCM)和使用DDR3兩種情況。這裡沒有使用FSBL,不能加載.bit文件(zynq啟動過程另介紹),所以只適用於沒有使用PL(包括PL邏輯或PL的IO等)的情況;由於OCM大小為256KB,而在BootROM階段只能訪問192KB,所以「只用OCM」時要求裸機程序小於192KB才行。
  • 「linux專欄」嘔心瀝血兩天,就為linux中安裝拼音輸入法
    說句實話,在純linux的作業系統中,是真的與虛擬機中不同的,就拿輸入法來說,就真真地把小編折騰了兩天之久。但終究是功夫不負有心人,總算是解決了這個問題。今天呢,小編就跟大家一起分享一下經驗。之前呢,小編也百度過,都說直接下載linux版本的搜狗輸入法之後,直接點擊sougoupinyin.deb的安裝文件就能直接安裝。但是,事實卻很扎心,小編的REHL8作業系統系統並不支持這樣的操作,點擊之後反而是打開了安裝包,並沒有進入安裝程序。
  • Linux 下軟體安裝詳解
    rpm --rebuild Filename.src.rpm     這時系統會建立一個文件Filenamr.rpm,在/usr/src/redflag/RPMS/子目錄下,一般是i386,具體情況和Linux發行版本有關。
  • Zynq中AXI4-Lite和AXI-Stream功能介紹
  • 新款先進雷達傳感器ARS540將整合賽靈思Zynq UltraScale+ MPSoC平臺
  • S2C展示基於Virtex-7 2000T 和Zynq的AXI-4原型驗證套件
    AXI-4 原型驗證就緒的快速啟動套件提供一個全功能ARM的原型設計捷徑,以及一個給追求快速構建硬體和軟體的開發者的完整流程。詳AXI-4 快速啟動套件是 S2C 原型驗證就緒 IP 庫的最新成員,特別適用於包括蓬勃發展的物聯網在內的下一代設計開發。
  • A REVIEW OF LOW-INTENSITY ULTRASOUND FOR CANCER THERAPY
    Therapy was accompanied by decreases in tumor temperature and tumor mean gray scale.agent and ultrasound intensities) and Lin et al. (2012b) (0.6 MPa).
  • linux下安裝虛擬機,完美在linux系統下運行通達信軟體
    現在越來越多的人使用linux系統,現在很多的國產作業系統都是基於linux內核上的。雖說不少的軟體都可以運行在linux的系統上。但是對於股票軟體來說在linux上的使用是一個硬傷。能夠運行在linux下的國內股票軟體少之又少。
  • Linux系統的Linux應該怎麼讀?正確讀法在這裡,很多人都讀錯了!
    1、linux發音五花八門版本頗多,見到和聽到的不下10種。根據linux的創始人Linus Torvalds的說法,Linux的發音和「Minix」是押韻的。3、有人綜合網上和linux自己的讀音,概括出幾個自認為最合適也最通用的讀法:/li'n^ks/(「裡那克斯」)或/'li:nэks/(「裡訥克斯」)或/li'nju:ks/(「裡紐克斯」)。4、這幾個應該是誰都聽得懂的。至於哪個比較正宗,當然是linux的原因。但事實上使用linux哪種讀法的人似乎都不在少數。
  • 手機ultra是什麼意思?
    ultra翻譯為中文為過激的意思,而手機ultra的意思就是超強(極致)版。手機pro版是加強版,比標準版好,而ultra版是超強版,比pro版好。在當前來說ultra就如同當初的Pro、max和plus一樣,只是代表在手機的基礎版本上進行了加強,只是ultra的意思最為極端,基本同一款手機標註了ultra的話就到此終結了。
  • 開發者必備:基於 Linux 生態的十大AI開源框架盤
    本文將從開發者的角度出發,特別是針對開發者中為數眾多的Linux系統和Mac系統用戶,奉上一篇針對泛Linux生態的頂級人工智慧開源工具盤點(當然,有些工具也並非只兼容Linux)。
  • 嵌入式Linux的GDB調試環境建立
    嵌入式Linux的GDB調試環境由Host和Target兩部分組成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。
  • 讓Linux 接收來自 PL 的自定義中斷信號
    axi_uartlite_0: serial@a0000000 {clocks = misc_clk_0>;compatible = xlnx,xps-uartlite-1.00.a;current-speed = 115200>;device_type = serial;interrupt-parent
  • 開發者必備:基於Linux生態的十大AI開源框架盤點
    與此前不同,本文將從開發者的角度出發,特別是針對開發者中為數眾多的Linux系統和Mac系統用戶,奉上一篇針對泛Linux生態的頂級人工智慧開源工具盤點(當然,有些工具也並非只兼容Linux)。1.值得一提的是,為了便於開發者自由定製,Deeplearning4j已經開放了儘可能多的算法調節接口,並對接口參數做出了詳盡解釋。同時,Deeplearning4j團隊還開發了針對矩陣運算的ND4J和ND4S庫(N-Dimensional Arrays for Java/Scala),同樣需要JVM的支持。
  • Linux2.6內核驅動移植參考
    /slab.h>,而原來的linux/malloc.h>不存在 老版本:內存分配函數包含在頭文件linux/malloc.h> 10、 結構體的初試化 gcc開始採用ANSI C的struct結構體的初始化形式: static struct some_structure = { .field1 = value
  • 開發者盛宴 2014 Unity亞洲開發者大會盛大開幕
    2014 Unite China(Unity亞洲開發者大會·中國站)在北京國家會議中心舉行。來自國內外的20餘位頂級嘉賓在現場進行經驗分享。今年是Unity開發者大會進入中國以來的第三屆,活動議程為期兩天,第一天為主會場演講,與此同時,五大精品課程也將於4月13日下午開始上演,分別為:Unity全球巡迴講師專場、國內技術專場、Unity行業解決方案、Unity製作人分享專場及
  • Kubernetes 資源配額使用指南 | Linux 中國
    本文字數:4695,閱讀時長大約: 5分鐘  https://linux.cn/article-13006-1.html 作者:Mike Calizo 譯者:zwb  當 Kubernetes 集群運行過一段時間或者在被開發者大量使用後, 資源(例如 CPU 和內存)的控制的問題就會顯現出來。
  • linux下SCP指令的使用
    SCP常用實例(在linux的centos環境下為例,從192.168.200.10現在一個文件到本地)1、從遠程伺服器下載文件到本地伺服器。scp 用戶名@IP位址:/home/1.txt ./2、linux下,通過指定埠從遠程伺服器下載文件到本地。scp -oPort=埠號 用戶名@IP位址:/opt/ftp-0.17-54.el6.x86_64.rpm ./3、linux下,通過指定埠將本地文件,上傳到遠程伺服器指定目錄下。
  • 從RTOS到Linux的應用移植
    size, 0)__ioremap函數原型為(arm/mm/ioremap.c):void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags);其中,phys_addr為要映射的起始的I/O地址;size為要映射的空間的大小;flags為要映射的I/O空間和權限有關的標誌