APP下载

基于Linux的FPGA+ARM高速数据采集系统设计

2017-05-10许思琦

计算机测量与控制 2017年4期
关键词:低电平高电平内核

许思琦

(中国飞行试验研究院,西安 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传输;内存映射;高速采集

0 引言

为完成更高速AD数据采集,提出以ARM+FPGA双核硬件架构采集系统;由于FPGA侧重于数据处理,采用的并行多通道处理方式,处理速度为ns级别,能实现对数据高速采集;但是FPGA没有指令系统,控制能力较弱[1],因此,结合ARM的控制能力和FPGA数据处理优势进行双核设计。由于FPGA与ARM工作在不同的时钟域,采用FPGA异步FIFO来实现数据传输很好地解决这一问题。为达到数据高速传输,系统采用 DMA控制器来读取FIFO数据[2]。为提高应用程序读取数据速度,采用Linux内核中的内存映射技术提高数据传输效率,完成数据采集。

1 硬件系统架构

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系统设计框图

2 FPGA+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]。

3 FPGA控制AD

采用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采集测试图

4 FPGA的FIFO设计

设计双时钟的异步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接口图

5 DMA和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 Linux底层驱动设计

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))//内存管理会一次完成全部页表的建

}

7 结论

通过设计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

猜你喜欢

低电平高电平内核
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
一种实用的电脑接口判断方法
TS-03C全固态PDM中波发射机开关机控制电路原理及故障分析
微软发布新Edge浏览器预览版下载换装Chrome内核
2017款凯迪拉克2.8L/3.0L/3.2L/3.6L车型低电平参考电压总线电路图
数字电子技术的应用
浅谈物理电路与数字电路
关于Multisim10.0的高电平调幅电路仿真研究