孫國萃 杜軍 馮祥虎 肖世偉 楊美娜






摘? 要:針對傳統平臺傳輸信號慢、開發過程復雜的特點,對信號的傳輸采集系統做了相關研究,設計了一種基于ZYNQ-7000和AD(AD9226)架構的嵌入式數據采集的實現方案,以ZYNQ-7000為數字信號處理平臺,搭配AD轉換芯片,在Linux操作系統下利用AXI-DMA方式實現信號的高速采集。該設計數據傳輸速率快,開發前景好,且具有小型化、高集成度的特點,為后續進一步的數據處理提供了前提。
關鍵詞:ZYNQ-7000;Linux操作系統;AD轉換;AXI-DMA傳輸
中圖分類號:TN919.5 ? ? ? ?文獻標識碼:A文章編號:2096-4706(2022)04-0085-04
Design and Implementation of Data Acquisition System Based on ZYNQ7000 Linux
SUN Guocui, DU Jun, FENG Xianghu, XIAO Shiwei, YANG Meina
(School of Computer Science and Information Engineering, Harbin Normal University, Harbin? 150025, China)
Abstract: In view of the characteristics of slow signal transmission and complex development process of traditional platform, the signal transmission and acquisition system is studied, and an implementation scheme of embedded data acquisition based on ZYNQ-7000 and AD (AD9226) architecture is designed. Taking ZYNQ-7000 as the digital signal processing platform, combined with AD conversion chip, the high-speed signal acquisition is realized in AXI-DMA ways under Linux operating system. The design has the characteristics of fast data transmission rate, good development prospect, miniaturization and high integration, which provides a premise for further data processing.
Keywords: ZYNQ-7000; Linux operating system; AD conversion; AXI-DMA transmission
0? 引? 言
數據的發射采集和處理在通信工程領域中起到至關重要的作用,隨著科學技術的發展,傳統的硬件平臺已經無法適應多頻段、多模式的信號處理。軟件無線電技術的出現使對信號的靈活處理成為現實,軟件無線電技術是一種基于軟件定義的無線電廣播通信技術,除了最基本的射頻收發器、放大器和頻器以外,信號的處理部分基本都由軟件進行實現。這樣,不僅提高了系統的靈活性,還節約了時間成本。而Linux操作系統具有超強的靈活性,用戶可以根據自己的需求去剪裁定制系統。Linux能有效利用系統資源,可在特定的硬件要求下進行安裝,安裝過程靈活,能夠更充分的利用硬件資源。
該設計采用ZYNQ-7000系列ZYBO板作為載波板,搭配AD9226芯片,結合Linux操作系統設計并實現一種高速AD數據采集系統。
1? 硬件模塊設計方案
1.1? ZYNQ-7000芯片
ZYNQ-7000芯片包含一個基于雙核ARM Cortex-A9的處理子系統(PS)和可編程邏輯(PL)[1]。設計思路采用以ARM處理器為核心,以可編程邏輯電路作為擴展。用戶可在ARM核中移植操作系統并開發相應的應用程序,并通過控制程序對硬件資源進行控制。PS除了核心外還包括片上存儲器、外部存儲器接口以及大量外設連接接口。ARM與FPGA之間的數據交互使用AXI總線,滿足實時控制和高速數據交互的需求。該設計應用的開發板是由Digilent開發的低成本ZYNQ開發板ZYBO,硬件資源包括一個Xilinx XC7Z010-CLG400芯片,兩片Micron的512 MB bytes的MT41J128M16JT-125 DDR3內存,10/100/1 000M自適應以太網、USBOTG、USB轉ART調試串口、micro SD卡和用以開發板擴展的Digilent Pmod接口連接器[2]。
總硬件設計如圖1所示。
1.2? 模數轉換芯片AD9226
AD9226是一款12位、單芯片、單電源供電、65MSPS模數轉換器,且具有475 MW功耗和70 dB的信躁比[3]。AD9226通過AXI總線與ARM板處理器進行數據通信,采用AXI-DMA方式對收集到的數字信號傳輸給內存,處理器再將內存中的數據讀取并顯示出來。
1.3? AXI4總線介紹
ZYNQ7000的性能不僅依賴于PS和PL兩大部分,系統的整體性非常重要,AXI總線負責維系PS與PL兩端之間的通信。AXI是一種總線協議,是面向高性能、高帶寬、低延遲的片內總線。AXI4總線有AXI4、AXI4-Lite、AXI-Stream三種總線類型[4],本次主要用到的是AXI-Stream總線,它支持面向高速數據流的傳輸,去掉了地址項,允許無限制的數據突發傳輸規模,減少了延時。
比較重要的信號線有:(1)Aclk為時鐘線,所有信號都在Aclk上升沿被采集。(2)ARESETn為復位線,低電平有效。(3)TVALID為主機數據同步線,為高表示主機準備好發送數據;TREADY為從機數據同步線,為高表示從機準備好接收數據。這兩根線完成了主機與從機的握手信號,一旦二者都變高有效,數據傳輸開始。(4)TDATA為數據線,主機發送,從機接收。(5)TKEEP為主機數據有效指示,為高代表對應的字節為有效字節,否則表示發送的為空字節。(6)TLAST為主機最后一個字指示,下一clk數據將無效,TVALID將變低。
AXI-Stream只能在PL中實現,不能直接和PS相連,必須通過AXI-Lite或AXI4轉接。AXI-DMA由Xilinx公司提供,負責從AXI到AXI-Stream的轉換。
1.4? AXI-DMA介紹
AXI DMA IP核相比于AXI內存映射,它提供了更高帶寬的直接內存訪問通道。該IP核在PL中使用,在PL中添加AXI DMA IP core,并利用AXI_HP接口完成高速的數據傳輸,當PL的外設和存儲器之間需要高速傳輸時,就可以選擇AXI DMA這種簡單DMA模式。在簡單DMA模式下,通過配置相應的DMA控制寄存器進行數據傳輸,如果數據傳輸完成,DMA控制器發出中斷信號。這種簡單的DMA數據傳輸方式,占用了較少的FPGA資源,節省硬件的開銷。DMA工作流程如圖2所示。
1.5? 硬件工程模塊設計
在Vivado工程中主要添加了ZYNQ-7000的IP核、AXI-DMA IP核和AD9226采集IP核,AXI-DMA IP核負責通過AXI接口從AD9226采集IP核中搬運數據,然后將數據流到內存映射(S2MM)從機到AXI4寫主機,S2MM通道提供了一個AXI Status流,用于從目標IP接收用戶應用程序數據。其中adc_data[11:0]用于接收AD芯片轉換來的12位數字信號。
AXI-DMA IP核與數據采集IP核如圖3、圖4所示。
2? 系統軟件方案
2.1嵌入式Linux移植和開發
嵌入式Linux系統移植主要由四大部分組成:
(1)搭建交叉開發環境。
(2)Bootloader的選擇和移植。
(3)Kernel的配置、編譯、和移植。
(4)根文件的制作。
首先需要在Vivado中完成PS的相關配置和針對特定應用的PL開發,經過Vivado的編譯、綜合與實現、分配引腳,最后生成比特流,將比特流文件導入到SDK軟件中,SDK利用硬件配置文件實現FSBL文件的創建,生成FSBL.elf文件,然后編譯U-boot、Linux內核并生成u-boot.elf和uImage文件,將FSBL.elf、比特流文件、u-boot.elf文件結合生成Boot.bin文件。利用SDK生成設備樹文件,再將設備樹放在Linux環境下編譯生成二進制文件。最后將Boot.bin、設備樹、內核鏡像、根文件一起放入SD卡FAT分區,最后將SD卡放入開發板的卡槽中啟動開發板。
系統上電后自動執行片內Boot ROM中的代碼,BootRom會初始化CPU和一些外設,并根據外部啟動MIO引腳配置,在Bin文件中找到FSBL的位置,找到后拷貝到內存中。FSBL根據硬件配置bit文件初始化PS部分,配置PL邏輯部分,并加載U-boot作為Linux內核的Bootloader程序,初始化CPU及外設,拷貝Linux內核映像到RAM中,再通過設備樹文件將硬件相關信息傳遞給Linux內核,最后由Linux系統加載文件完成啟動,根據特定需求運行相關驅動及應用程序。
2.2? 驅動程序和應用程序的開發
驅動程序是一種讓計算機和設備通信的特殊程序,相當于硬件的接口,操作系統只有通過這個接口,才能控制硬件設備的工作。Linux中有三大類驅動:字符設備驅動、塊設備驅動和網絡設備驅動[5]。本次用到的AD9226屬于字符驅動。Linux驅動有兩種運行方式,第一種就是將驅動編譯進Linux內核中,這樣當Linux內核啟動的時候就會自動運行驅動程序。第二種就是將驅動編譯成模塊,在Linux內核啟動以后使“insmod”命令加載驅動模塊在調試驅動的時候一般都選擇將其編譯為模塊,這樣修改驅動以后只需要編譯一下驅動代碼即可,不需要編譯整個Linux代碼。
2.2.1? AD轉換驅動程序的部分函數
初始化DMA
memset(axi_adc_dev[dev_index], 0, sizeof(struct axi_adc_dev));//給設備的內存空間全部設置為0。
axi_adc_dev[dev_index]->rx_chan = dma_request_slave_channel(&pdev->dev, “axidma1”);//申請DMA通道。
axi_adc_dev[dev_index]->adc_virtaddr = of_iomap(node, 0);通過設備樹的設備結點直接進行設備內存區間的 映射
DMA傳輸
dma_async_issue_pending(axi_adc_dev[minor]->rx_chan);//開始DMA傳輸
writel(axi_adc_dev[minor]->adc_sample_num,axi_adc_dev[minor]->adc_virtaddr+4);//對 IP核的寄存器基址向后偏移4的位置寫入了需要采集的ADC數據個數。
writel(1,axi_adc_dev[minor]->adc_virtaddr);//對寄存器基地址寫1,開始數據傳輸
DMA傳輸結束
iounmap(axi_adc_dev[dev_index]->adc_virtaddr);//取消映射的虛擬地址空間首地址
dma_release_channel(axi_adc_dev[dev_index]->rx_chan);//釋放dma通道
kfree(axi_adc_dev[dev_index]);//釋放內存
2.2.2? 應用程序的部分函數
初始化axidma設備
DEV = axidma_init();
AN926RegBase=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,AN926FileDev,AN926_REGBASE);//將AD9226采集IP核寄存器基地址映射到內存上。
數據傳輸
axidma_oneway_transfer(Dev,g_apRxChannels->data[0],AN926DataBuf,AN926_SAMPLENUM*2,false);//將數據傳遞給Buf
printf(“%x “,*((unsigned short*)(an926DataBuf)+i));//將Buf中的每個數據進行打印
結束傳輸并關閉設備
axidma_stop_transfer(Dev,RxChannels->data[0]);//結束傳輸
close(AN926FileDev);//關閉文件
驅動的加載和文件的運行
將AD9226的驅動模塊進行加載,在終端輸入insmod axi_adc_dma.ko,輸入mknod/dev axi_adc_dma c 200 0即可創建字符設備的節點。加載完驅動后的終端輸出結果,如圖5所示。
然后執行命令./axi_app/dev/axi_adc_dma即可。
實驗結果如圖6所示。
3? 結? 論
帶有axi_dma驅動的AD數據采集系統能傳輸高速數據流,相較于傳統數據采集系統來講,傳輸效率更高,占用資源更少。移植過Linux操作系統的arm嵌入式開發板更為后續的相關應用開發提供了可能,對硬件的操作方式也更加的方便和靈活。可廣泛應用于實現數據采集功能的掌上設備及其他嵌入式的系統,如醫療儀器、通信設備等領域。
參考文獻:
[1] 趙莉,李司.基于ZYNQ和AD9361的軟件無線電平臺設計與實現 [J].移動通信,2018,42(12):63-67+73.
[2] 高寒.基于ZYBO開發平臺的智慧環保監測及數據采集系統設計 [J].電子設計工程,2018,26(5):174-178+183.
[3] 張晨亮,蘇學軍,王成剛,等.基于AD9226的數據采集板設計與實現 [J].實驗技術與管理,2017,34(S1):63-65+69.
[4] 莊瓊.基于AXI總線的DMA高速通道及驅動的設計與實現 [D].成都,電子科技大學,2020.
[5]段月驍,郭斌,胡曉峰,等.嵌入式Linux下ADS1256驅動程序的設計與實現 [J].化工自動化及儀表,2015,42(12):1381-1385.
作者簡介:孫國萃(1997—),女,漢族,山東德州人,研究生在讀,研究方向:嵌入式技術。