孫國萃 杜軍 馮祥虎 肖世偉 楊美娜
摘? 要:針對傳統(tǒng)平臺傳輸信號慢、開發(fā)過程復(fù)雜的特點,對信號的傳輸采集系統(tǒng)做了相關(guān)研究,設(shè)計了一種基于ZYNQ-7000和AD(AD9226)架構(gòu)的嵌入式數(shù)據(jù)采集的實現(xiàn)方案,以ZYNQ-7000為數(shù)字信號處理平臺,搭配AD轉(zhuǎn)換芯片,在Linux操作系統(tǒng)下利用AXI-DMA方式實現(xiàn)信號的高速采集。該設(shè)計數(shù)據(jù)傳輸速率快,開發(fā)前景好,且具有小型化、高集成度的特點,為后續(xù)進一步的數(shù)據(jù)處理提供了前提。
關(guān)鍵詞:ZYNQ-7000;Linux操作系統(tǒng);AD轉(zhuǎn)換;AXI-DMA傳輸
中圖分類號:TN919.5 ? ? ? ?文獻標(biāo)識碼: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? 引? 言
數(shù)據(jù)的發(fā)射采集和處理在通信工程領(lǐng)域中起到至關(guān)重要的作用,隨著科學(xué)技術(shù)的發(fā)展,傳統(tǒng)的硬件平臺已經(jīng)無法適應(yīng)多頻段、多模式的信號處理。軟件無線電技術(shù)的出現(xiàn)使對信號的靈活處理成為現(xiàn)實,軟件無線電技術(shù)是一種基于軟件定義的無線電廣播通信技術(shù),除了最基本的射頻收發(fā)器、放大器和頻器以外,信號的處理部分基本都由軟件進行實現(xiàn)。這樣,不僅提高了系統(tǒng)的靈活性,還節(jié)約了時間成本。而Linux操作系統(tǒng)具有超強的靈活性,用戶可以根據(jù)自己的需求去剪裁定制系統(tǒng)。Linux能有效利用系統(tǒng)資源,可在特定的硬件要求下進行安裝,安裝過程靈活,能夠更充分的利用硬件資源。
該設(shè)計采用ZYNQ-7000系列ZYBO板作為載波板,搭配AD9226芯片,結(jié)合Linux操作系統(tǒng)設(shè)計并實現(xiàn)一種高速AD數(shù)據(jù)采集系統(tǒng)。
1? 硬件模塊設(shè)計方案
1.1? ZYNQ-7000芯片
ZYNQ-7000芯片包含一個基于雙核ARM Cortex-A9的處理子系統(tǒng)(PS)和可編程邏輯(PL)[1]。設(shè)計思路采用以ARM處理器為核心,以可編程邏輯電路作為擴展。用戶可在ARM核中移植操作系統(tǒng)并開發(fā)相應(yīng)的應(yīng)用程序,并通過控制程序?qū)τ布Y源進行控制。PS除了核心外還包括片上存儲器、外部存儲器接口以及大量外設(shè)連接接口。ARM與FPGA之間的數(shù)據(jù)交互使用AXI總線,滿足實時控制和高速數(shù)據(jù)交互的需求。該設(shè)計應(yīng)用的開發(fā)板是由Digilent開發(fā)的低成本ZYNQ開發(fā)板ZYBO,硬件資源包括一個Xilinx XC7Z010-CLG400芯片,兩片Micron的512 MB bytes的MT41J128M16JT-125 DDR3內(nèi)存,10/100/1 000M自適應(yīng)以太網(wǎng)、USBOTG、USB轉(zhuǎn)ART調(diào)試串口、micro SD卡和用以開發(fā)板擴展的Digilent Pmod接口連接器[2]。
總硬件設(shè)計如圖1所示。
1.2? 模數(shù)轉(zhuǎn)換芯片AD9226
AD9226是一款12位、單芯片、單電源供電、65MSPS模數(shù)轉(zhuǎn)換器,且具有475 MW功耗和70 dB的信躁比[3]。AD9226通過AXI總線與ARM板處理器進行數(shù)據(jù)通信,采用AXI-DMA方式對收集到的數(shù)字信號傳輸給內(nèi)存,處理器再將內(nèi)存中的數(shù)據(jù)讀取并顯示出來。
1.3? AXI4總線介紹
ZYNQ7000的性能不僅依賴于PS和PL兩大部分,系統(tǒng)的整體性非常重要,AXI總線負(fù)責(zé)維系PS與PL兩端之間的通信。AXI是一種總線協(xié)議,是面向高性能、高帶寬、低延遲的片內(nèi)總線。AXI4總線有AXI4、AXI4-Lite、AXI-Stream三種總線類型[4],本次主要用到的是AXI-Stream總線,它支持面向高速數(shù)據(jù)流的傳輸,去掉了地址項,允許無限制的數(shù)據(jù)突發(fā)傳輸規(guī)模,減少了延時。
比較重要的信號線有:(1)Aclk為時鐘線,所有信號都在Aclk上升沿被采集。(2)ARESETn為復(fù)位線,低電平有效。(3)TVALID為主機數(shù)據(jù)同步線,為高表示主機準(zhǔn)備好發(fā)送數(shù)據(jù);TREADY為從機數(shù)據(jù)同步線,為高表示從機準(zhǔn)備好接收數(shù)據(jù)。這兩根線完成了主機與從機的握手信號,一旦二者都變高有效,數(shù)據(jù)傳輸開始。(4)TDATA為數(shù)據(jù)線,主機發(fā)送,從機接收。(5)TKEEP為主機數(shù)據(jù)有效指示,為高代表對應(yīng)的字節(jié)為有效字節(jié),否則表示發(fā)送的為空字節(jié)。(6)TLAST為主機最后一個字指示,下一clk數(shù)據(jù)將無效,TVALID將變低。
AXI-Stream只能在PL中實現(xiàn),不能直接和PS相連,必須通過AXI-Lite或AXI4轉(zhuǎn)接。AXI-DMA由Xilinx公司提供,負(fù)責(zé)從AXI到AXI-Stream的轉(zhuǎn)換。
1.4? AXI-DMA介紹
AXI DMA IP核相比于AXI內(nèi)存映射,它提供了更高帶寬的直接內(nèi)存訪問通道。該IP核在PL中使用,在PL中添加AXI DMA IP core,并利用AXI_HP接口完成高速的數(shù)據(jù)傳輸,當(dāng)PL的外設(shè)和存儲器之間需要高速傳輸時,就可以選擇AXI DMA這種簡單DMA模式。在簡單DMA模式下,通過配置相應(yīng)的DMA控制寄存器進行數(shù)據(jù)傳輸,如果數(shù)據(jù)傳輸完成,DMA控制器發(fā)出中斷信號。這種簡單的DMA數(shù)據(jù)傳輸方式,占用了較少的FPGA資源,節(jié)省硬件的開銷。DMA工作流程如圖2所示。
1.5? 硬件工程模塊設(shè)計
在Vivado工程中主要添加了ZYNQ-7000的IP核、AXI-DMA IP核和AD9226采集IP核,AXI-DMA IP核負(fù)責(zé)通過AXI接口從AD9226采集IP核中搬運數(shù)據(jù),然后將數(shù)據(jù)流到內(nèi)存映射(S2MM)從機到AXI4寫主機,S2MM通道提供了一個AXI Status流,用于從目標(biāo)IP接收用戶應(yīng)用程序數(shù)據(jù)。其中adc_data[11:0]用于接收AD芯片轉(zhuǎn)換來的12位數(shù)字信號。
AXI-DMA IP核與數(shù)據(jù)采集IP核如圖3、圖4所示。
2? 系統(tǒng)軟件方案
2.1嵌入式Linux移植和開發(fā)
嵌入式Linux系統(tǒng)移植主要由四大部分組成:
(1)搭建交叉開發(fā)環(huán)境。
(2)Bootloader的選擇和移植。
(3)Kernel的配置、編譯、和移植。
(4)根文件的制作。
首先需要在Vivado中完成PS的相關(guān)配置和針對特定應(yīng)用的PL開發(fā),經(jīng)過Vivado的編譯、綜合與實現(xiàn)、分配引腳,最后生成比特流,將比特流文件導(dǎo)入到SDK軟件中,SDK利用硬件配置文件實現(xiàn)FSBL文件的創(chuàng)建,生成FSBL.elf文件,然后編譯U-boot、Linux內(nèi)核并生成u-boot.elf和uImage文件,將FSBL.elf、比特流文件、u-boot.elf文件結(jié)合生成Boot.bin文件。利用SDK生成設(shè)備樹文件,再將設(shè)備樹放在Linux環(huán)境下編譯生成二進制文件。最后將Boot.bin、設(shè)備樹、內(nèi)核鏡像、根文件一起放入SD卡FAT分區(qū),最后將SD卡放入開發(fā)板的卡槽中啟動開發(fā)板。
系統(tǒng)上電后自動執(zhí)行片內(nèi)Boot ROM中的代碼,BootRom會初始化CPU和一些外設(shè),并根據(jù)外部啟動MIO引腳配置,在Bin文件中找到FSBL的位置,找到后拷貝到內(nèi)存中。FSBL根據(jù)硬件配置bit文件初始化PS部分,配置PL邏輯部分,并加載U-boot作為Linux內(nèi)核的Bootloader程序,初始化CPU及外設(shè),拷貝Linux內(nèi)核映像到RAM中,再通過設(shè)備樹文件將硬件相關(guān)信息傳遞給Linux內(nèi)核,最后由Linux系統(tǒng)加載文件完成啟動,根據(jù)特定需求運行相關(guān)驅(qū)動及應(yīng)用程序。
2.2? 驅(qū)動程序和應(yīng)用程序的開發(fā)
驅(qū)動程序是一種讓計算機和設(shè)備通信的特殊程序,相當(dāng)于硬件的接口,操作系統(tǒng)只有通過這個接口,才能控制硬件設(shè)備的工作。Linux中有三大類驅(qū)動:字符設(shè)備驅(qū)動、塊設(shè)備驅(qū)動和網(wǎng)絡(luò)設(shè)備驅(qū)動[5]。本次用到的AD9226屬于字符驅(qū)動。Linux驅(qū)動有兩種運行方式,第一種就是將驅(qū)動編譯進Linux內(nèi)核中,這樣當(dāng)Linux內(nèi)核啟動的時候就會自動運行驅(qū)動程序。第二種就是將驅(qū)動編譯成模塊,在Linux內(nèi)核啟動以后使“insmod”命令加載驅(qū)動模塊在調(diào)試驅(qū)動的時候一般都選擇將其編譯為模塊,這樣修改驅(qū)動以后只需要編譯一下驅(qū)動代碼即可,不需要編譯整個Linux代碼。
2.2.1? AD轉(zhuǎn)換驅(qū)動程序的部分函數(shù)
初始化DMA
memset(axi_adc_dev[dev_index], 0, sizeof(struct axi_adc_dev));//給設(shè)備的內(nèi)存空間全部設(shè)置為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);通過設(shè)備樹的設(shè)備結(jié)點直接進行設(shè)備內(nèi)存區(qū)間的 映射
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數(shù)據(jù)個數(shù)。
writel(1,axi_adc_dev[minor]->adc_virtaddr);//對寄存器基地址寫1,開始數(shù)據(jù)傳輸
DMA傳輸結(jié)束
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]);//釋放內(nèi)存
2.2.2? 應(yīng)用程序的部分函數(shù)
初始化axidma設(shè)備
DEV = axidma_init();
AN926RegBase=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,AN926FileDev,AN926_REGBASE);//將AD9226采集IP核寄存器基地址映射到內(nèi)存上。
數(shù)據(jù)傳輸
axidma_oneway_transfer(Dev,g_apRxChannels->data[0],AN926DataBuf,AN926_SAMPLENUM*2,false);//將數(shù)據(jù)傳遞給Buf
printf(“%x “,*((unsigned short*)(an926DataBuf)+i));//將Buf中的每個數(shù)據(jù)進行打印
結(jié)束傳輸并關(guān)閉設(shè)備
axidma_stop_transfer(Dev,RxChannels->data[0]);//結(jié)束傳輸
close(AN926FileDev);//關(guān)閉文件
驅(qū)動的加載和文件的運行
將AD9226的驅(qū)動模塊進行加載,在終端輸入insmod axi_adc_dma.ko,輸入mknod/dev axi_adc_dma c 200 0即可創(chuàng)建字符設(shè)備的節(jié)點。加載完驅(qū)動后的終端輸出結(jié)果,如圖5所示。
然后執(zhí)行命令./axi_app/dev/axi_adc_dma即可。
實驗結(jié)果如圖6所示。
3? 結(jié)? 論
帶有axi_dma驅(qū)動的AD數(shù)據(jù)采集系統(tǒng)能傳輸高速數(shù)據(jù)流,相較于傳統(tǒng)數(shù)據(jù)采集系統(tǒng)來講,傳輸效率更高,占用資源更少。移植過Linux操作系統(tǒng)的arm嵌入式開發(fā)板更為后續(xù)的相關(guān)應(yīng)用開發(fā)提供了可能,對硬件的操作方式也更加的方便和靈活??蓮V泛應(yīng)用于實現(xiàn)數(shù)據(jù)采集功能的掌上設(shè)備及其他嵌入式的系統(tǒng),如醫(yī)療儀器、通信設(shè)備等領(lǐng)域。
參考文獻:
[1] 趙莉,李司.基于ZYNQ和AD9361的軟件無線電平臺設(shè)計與實現(xiàn) [J].移動通信,2018,42(12):63-67+73.
[2] 高寒.基于ZYBO開發(fā)平臺的智慧環(huán)保監(jiān)測及數(shù)據(jù)采集系統(tǒng)設(shè)計 [J].電子設(shè)計工程,2018,26(5):174-178+183.
[3] 張晨亮,蘇學(xué)軍,王成剛,等.基于AD9226的數(shù)據(jù)采集板設(shè)計與實現(xiàn) [J].實驗技術(shù)與管理,2017,34(S1):63-65+69.
[4] 莊瓊.基于AXI總線的DMA高速通道及驅(qū)動的設(shè)計與實現(xiàn) [D].成都,電子科技大學(xué),2020.
[5]段月驍,郭斌,胡曉峰,等.嵌入式Linux下ADS1256驅(qū)動程序的設(shè)計與實現(xiàn) [J].化工自動化及儀表,2015,42(12):1381-1385.
作者簡介:孫國萃(1997—),女,漢族,山東德州人,研究生在讀,研究方向:嵌入式技術(shù)。