許思琦
(中國飛行試驗研究院,西安 710089)
基于Linux的FPGA+ARM高速數據采集系統設計
許思琦
(中國飛行試驗研究院,西安 710089)
對于高速A/D的采集,采用I/O讀取方式,ARM9最大能夠采集500KSPS的A/D,因此ARM不能實現對更高速度數據讀取;為達到更高速,提出了FPGA+ARM的雙核架構的高速數據采集的方法,FPGA能夠采集2MSPS的A/D,并采用ARM的DMA完成與FPGA的FIFO通信,以及使用Linux的內存映射技術來提高應用層與內核層數據傳輸效率,完成數據采集;該系統設計了FPGA+ARM接口電路,開發了Linux下的DMA驅動程序;經試驗測試,系統具有高速采集的性能。
FPGA+ARM雙核設計;FIFO+DMA傳輸;內存映射;高速采集
為完成更高速AD數據采集,提出以ARM+FPGA雙核硬件架構采集系統;由于FPGA側重于數據處理,采用的并行多通道處理方式,處理速度為ns級別,能實現對數據高速采集;但是FPGA沒有指令系統,控制能力較弱[1],因此,結合ARM的控制能力和FPGA數據處理優勢進行雙核設計。由于FPGA與ARM工作在不同的時鐘域,采用FPGA異步FIFO來實現數據傳輸很好地解決這一問題。為達到數據高速傳輸,系統采用 DMA控制器來讀取FIFO數據[2]。為提高應用程序讀取數據速度,采用Linux內核中的內存映射技術提高數據傳輸效率,完成數據采集。
1.1 FPGA+ARM的硬件平臺設計
以S3C2440芯片為嵌入式硬件平臺,它是基于ARM920T的架構處理器,片內有4k的SRAM,nandflash控D制器,SDRAM控制器等資源。板級設備包含:全功能的串口,JTAG,Nandflash (256M), SDRAM(64M)等。
FPGA平臺選擇Cyclone IV E系列EP4C6F17C8芯片,該芯片內部資源由6272個邏輯單元LE,392個乘法器LAB,以及179個IO組成,有270 kbit存儲空間,工作電壓為1.2 V,是一款低功耗,高性能的FPGA。
數據采集芯片選擇用ADI公司的AD7621,是一個16位,2MSPS,全差分數模轉換器,可實現較高的采樣速率。

圖1 FPGA+ARM系統總體設計框圖
1.2 ARM的硬件平臺設計
采用和FPGA+ARM平臺相同的A/D和ARM設計一個對比測試平臺,使用ARM來控制A/D,使ARM9處于最大400MHz的時鐘頻率,并提供A/D控制器2.5 MHz時鐘頻率,進行測試ARM在1 s啟動轉換A/D的次數,其測試平臺如圖2所示。

圖2 ARM系統設計框圖
根據高速采集要求,設計硬件連接圖如3所示,設置AD模塊的PAR為低電平,選擇AD為并口輸出模式;FPGA提供片選CS,控制啟動轉換CNVST,檢測AD轉換是否忙BUSY信號,以及100 MHz的時鐘SCLK;當FPGA開始采集數據時,通過FIFO的讀數指針把數據存入FIFO中;ARM以DMA方式與FPGA的FIFO進行通信;并采用16位數據線DATA[15:0],提供對FPGA的控制信號,如DREQ,DACK以及讀寫信號,片選信號nGCS4,和輸出時鐘線與FPGA相連,當DMA開始采集FPGA的數據時,FIFO通過寫數指針完成與DMA的數據傳輸。

圖3 FPGA+ARM硬件接口電路
FPGA的異步讀時鐘由FPGA內部提供,寫時鐘由S3C244的外部時鐘CLOCK0提供。 FPGA的片選信號為nGCS4,相當于FIFO掛載到ARM的bank4上,對DMA源地址寄存器寫0x2000_0000~0x2800_0000時,選中FPGA,這時data[15:0]數據線被FPGA占用[3]。
采用FPGA+ARM雙核架構, FPGA系統時鐘由外部50MHz晶振提供經過內部PLL倍頻后得到100 MHz;通過設計FPGA內部邏輯電路實現對A/D的控制并將數據寫入FIFO。
FPGA對AD數據讀取:AD7621完成一次采樣需要500 ns,對于2MSPS采樣速度,需要50個周期完成一次采樣,AD7621時序如圖4所示。

圖4 A/D轉換時序圖
根據圖4的AD的時序可知,當CNVST為高電平,BUSY為低電平; FPGA控制CNVST引腳為4個周期連續低電平,AD檢測到CNVST信號為低電平,則會啟動AD轉換,并同時把BUSY信號設置為高電平,FPGA內部檢測到BUSY為高電平時,表示AD正在進行單次數據轉換,當FPGA檢測BUSY為低電平時,AD轉換完成,FPGA內部FIFO讀操作在100 MHz時鐘下開始讀取data[15:0]上數據,并存入FIFO中,利用Quartus II 和Modelsim對數據采樣模塊進行時序仿真如圖5所示。

圖5 Modelsim數據采集仿真時序圖
由圖5仿真時序可知,clk 為FPGA內部100 Mhz的系統時鐘,完成一次采樣需要50個周期,開始轉換時,cnvst的前4周期為低電平,busy在第36個時鐘周期出現低電平,表示完成一次數據轉換,d[15:0]為16位的AD7621輸出數據,q[15:0]為FIFO讀取數據。利用嵌入式邏輯分析儀(SignalTap II Logic Analyzer)對AD7622數據采集卡的測試結果如圖6所示。

圖6 FPGA對AD采集測試圖
設計雙時鐘的異步FIFO,解決ARM與FPGA不在同時鐘域問題,FIFO的讀時鐘是由FPGA提供,FIFO的寫時鐘由ARM的CLKOUT0提供,時鐘頻率都為100 Mhz。當rdreq產生上升沿觸發讀使能信號時,FIFO通過data[15:0]讀AD數據,當wrreq產生上升沿觸發寫使能信號時,FIFO通過q[15:0]發送數據;clock是上升沿觸發的時鐘信號,用于FIFO控制讀寫的時鐘,sclr是FIFO同步復位信號;empty/full是用于判斷空/滿的狀態標記信號,empty為高電平表示FIFO為空,full為高電平表示FIFO滿,具體設計如圖7所示。

圖7 FIFO接口圖
FIFO的讀操作與ARM的DMA操作時序(如下圖8)密切相關,系統采用單觸發握手模式(一次讀兩字節)的DMA操作和FIFO非空立刻發出申請DREQ0信號的方式。
當FIFO有數據,同時DACK0響應信號為高電平時,發起DREQ0申請;當DMA控制器采集DREQ0信號從高電平變低,DMA會發出DACK0的相應信號從高電平變低,此時FIFO檢測到DACK0為低電平,把兩個字節數據送到數據總線上,同時DMA發起一次DMA操作,每傳輸完兩字節數據,DMA把DACK0從低電平拉高;FIFO采集DACK0的高電平信號,如果里面有數據,就會發起下一次申請,如此往復,直到DAM字節計數器為0。這樣就可以防止FIFO數據丟失,保證數據準確性。

圖8 DMA握手模式時序
根據DMA的時序要求,對FPGA與ARM進行通信測試,測試結果如圖9所示。

圖9 ARM與FPGA通信測試圖
clk為FPGA工作時鐘100 Mhz;reset為復位信號,低電平有效;data為AD7621的輸出數據;q為FPGA的采集信號;rereq和wrreq為FIFO的讀寫信號;count_dreq為DMA傳輸數據的個數;DREQ、DACK、nGCS、nOE為DMA的傳輸控制信號;其他信號為FPGA內部溝通信號。由圖9可知,DMA方式的數據傳輸滿足2MSPS高速數據傳輸,達到系統的設計要求。
6.1 DMA驅動操作函數編寫
所有設備的操作函數都由file_operation結構體提供,根據需要可以定義,open,read,ioctl,mmap等函數[3],具體實現如下:
static struct file_operations Dma_drv_fops=
{
.owner = THIS_MODULE,
.release =dma_close
.ioctl =dma_ioctl,
.mmap =dma_mmap,
};
其中dma_open,dam_release分別為打開和關閉設備,dma_ioctl完成應用程序向驅動的命令傳遞,dma_mmap把內核申請的DMA緩沖區映射到應用層,提高用戶空間和內核空間的數據傳輸效率。
6.2 dma_open函數
dma_open函數向內核空間申請一片連續DMA內存,注冊DMA0的中斷,把相應的I/O端口的物理地址通過ioremap映射到內核空間,然后根據FPGA與ARM的通信協議,配置DMA的控制寄存器,提供FPGA的FIFO讀時鐘信號。關鍵代碼如下:
{
2.3 數據處理 利用Excel 2010對試驗數據進行處理,對每個地塊各深度層面處的3個土壤樣本的有效試驗數據取平均值,用Origin2007進行分析和圖標的制作。
dst = dma_alloc_writecombine(NULL, BUFF_SIZE, &my_des_phy, GFP_KERNEL);
request_irq(IRQ_DMA0, s3c_dma_irq, 0, "s3c_dma", 1)
dma_regs = ioremap(DMA1_BASE_ADDR, sizeof(struct s3c_dma_regs));……//IO端口映射
設置FIFO的讀時鐘為CLKOUT0
*misccr |=(4<<4);
*gpacon |=(1<<14);//NGCS3
*gpbcon |= (2<<16)|(2<<14);//GPB8 nXDREQ1 GPB7 nXDACK1
dma_regs->didst =my_des_phy; /*目的的物理地址*/
dma_regs->disrcc =(0<<1) |(1<<0); /*源位于AHB總線,地址guding */
dma_regs->disrc =0x20000000; /* 源的物理地址*/
dma_regs->didstc=(0<<2) |(0<<1) |(0<<0); /*目的位于AHB,地址增加*/
/*握手模式,AHB,中斷使能,單元傳輸,單服務模式,nXDREQ1,自動加載*/
dma_regs->dcon=(1<<31)|(0<<30)|(0<<29)|(0<<28)|(0<<27)|(0<<26)|(0<<25)|(0<<24)|(1<<23) |(1<<22)|(0<<21)|(0<<20)|(BUFF_SIZE);
}
6.3 dma_ioctl函數
dma_ioctl函數接受應用程序傳入的啟動DMA傳輸命令,如果申請的DMA內存中無數據,就會調用wait_event_interrupt函數,初始狀態ev_dma=0,進程就會休眠。當DMA數據傳輸完,在中斷函數中作相應修改。Dma_ioctl主要代碼如下:
{
dma_regs->dmasktrig = (1<<1) | (1<<0);/*啟動DMA傳輸*/
wait_event_interruptible(dma_waitq, ev_dma);/*DMA未完成數據傳輸,進程進行休眠*/
ev_dam=0;/*重新設置dma完成標志位*/
}
中斷服務函數:
DMA寄存器CURR_CT中值變為0,即DMA傳輸完成,產生中斷。在中斷函數中,設置ev_dma=1,調用wake_up_interruptible把當前進程dma_waitq加入內核進程隊列中,供系統來調度[4]。具體程序如下:
static irqreturn_t s3c_dma_irq(int irq, void *devid)
{ ev_dma = 1;
wake_up_interruptible(&dma_waitq); /* 喚醒休眠的進程 */
return IRQ_HANDLED;
}
6.4 內存映射dma_mmap函數
DMA在內核空間申請的一片連續緩沖區映射到用戶空間,把映射成功的虛擬首地址返回給用戶空間,應用層直接操作這段虛擬地址可以進行文件的讀寫操作[5],不必調用read,write等函數,提高了內核空間與用戶空間之間數據傳輸能力。關鍵代碼如下:
static int dma_mmap(struct file *file, struct vm_area_struct * vma)
{ off = vma->vm_pgoff << PAGE_SHIFT;
start =src_phys ;//把DMA申請緩沖區物理地址賦值給start
len = PAGE_ALIGN((start & ~PAGE_MASK) +BUF_SIZE);//進行頁對齊
start &= PAGE_MASK;
……
off += start;
vma->vm_pgoff = off >> PAGE_SHIFT;
vma->vm_flags |= VM_IO | VM_RESERVED;//設置一些映射保護
if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT,vma->vm_end vma->vm_start, vma->vm_page_prot))//內存管理會一次完成全部頁表的建
}
通過設計FPGA+ARM高速數據采集的嵌入式平臺,采用DMA和FIFO進行高速通信,并使用內核內存映射技術提高數據采集效率;經過實驗測試,系統滿足數據采集的高效性和快速性,并達到4MB/s采樣速度。
[1] 張福洪,徐春暉,胡舜峰,等.基于Linux的ARM與FPGA數據通信設計與實現[J].杭州電子科技大學學報,2015,(4):26-30.
[2] 王小平,王萬剛,蔡 川,等.嵌入式Linux下FPGA與ARM處理器DMA數據采集程序設計[J].西南師范大學學報(自然科學版),2014,(4):120-123.
[3] 方傳杰,朱 健,房志東,等.高速實時數據采集智能控制器的設計與實現[J].電子技術,2014,(5):28-32.
[4] 朱曉鵬,肖鐵軍,趙 蕙,等.ARM+FPGA的實時數據采集系統設計[J].計算機工程與設計,2009,30(13):3088-3090.
[5] 吳 迪,李丙玉,王曉東,等.基于ARM+FPGA 的影像交互與顯示系統設計[J].液晶與顯示,2015,(6):979-986.
DesigningHigh-speedData-acquisitionSystemBasedonLinuxandFPGA+ARM
XuSiqi
(ChineseFlightTestEstablishment,Xi’an710089,China)
For high speed A/D acquisition, using the I/O, ARM9 maximum can collect A/D 500KSPS.So, ARM can’t realize the higher speed data reading.To achieve faster, A high speed data acquisition method based on FPGA+ARM dual core architecture is proposed. FPGA can collect A/D 2MSPS.And the use of DMA ARM to complete the communication with FIFO FPGA. Using the memory remmapping of Linux to improve the application layer and the core layer of data transmission efficiency,completing data collection. Designing the FPGA+ARM interface circuit in this system. Developing of DMA device driver. After the test,the system has the performance of the high-speed sampling.
FPGA+ARM dual-core design;FIFO+DMA transfer;memory mapping;high-speed sample
2016-11-02;
2016-11-24。
許思琦(1990-),女,陜西西安人,碩士研究生,主要從事發動機測試方向的研究。
1671-4598(2017)04-0172-04DOI:10.16526/j.cnki.11-4762/tp
TP
A