微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ARM+FPGA的高速数据采集智能控制器设计

基于ARM+FPGA的高速数据采集智能控制器设计

时间:07-11 来源:互联网 点击:

框图如图3所示。

3.1 FPGA设备驱动程序

Linux设备驱动被分为三类:字符设备、块设备和网络设备。字符设备是以字符为单位输入输出数据的设备。FPGA设备驱动程序为字符型设备驱动程序,其基本框架为:1)定义一个结构体static structfile operations变量,其內定义一些设备的打开、关闭、读、写、控制函数;2)在结构体外分别实现结构体中定义的这些函数;3)向内核中注册或删除驱动模块。Linux内核中一个字符设备用cdev数据结构来描述和管理设备文件。智能控制器的协处理器FPGA用作主处理器ARM外部静态存储器SRAM。因此,主处理器ARM可以通过静态存储控制器(SMC)产生信号控制外部存储设备或者外围接口设备来进行读写操作。FPGA字符型设备驱动程序能够完成控制FPGA模块,完成数据采集,最为关键的是初始化FPGA模块,配置主处理器ARM的SMC来实现FPGA总线驱动。可参照ARM静态存储控制器读、写时序。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


由上图可知主要是配置静态存储控制器SMC_SETUP、SMC_PULSE、SMC_CYCLE、SMC_MODE四个参数。配置是通过函数static inline void at91_sys write(unsigned intreg_effset,unsigned long value)实现,详细配置如下:

at91_sys_write(AT91_SMC_SETUP(5),AT91_SMC_NWESETUP(0x02)|AT91_SMC_NCS_WRSETUP_(0x00)|AT91_SMC_NRDSETUP_(0x00)|AT91_SMC

_NCS_RDSETUP_(0X00));

at91_sys_write(AT91_SMC_PULSE(5),AT91_SMC_NWEPULSE_(0x06)|AT91_SMC_NCS_WRPULSE(0x0A)|AT91_SMC_NRDPULSE(0x0A)|AT91_SMC_ NCS_RDPULSE_(0x0A));

at91_sys_write(AT91_SMC_CYCLE(5),AT91_SMC_NWECYCLE_(0X0A)|AT91_SMC_NRDCYCLE_(0X0A));

at91_sys_write(AT91_SMC_MODE(5),AT91_SMC_READMODE|AT91_SMC_WRITEMODE|AT91_SMC_EXNWMODE_DISABLE|AT91_SMC_DBW_16|AT91_ SMC_TDF_(1));

申请I/O内存:

request_mem_region((unsigned long)sram_buf_1,SRAM_BUFSIZE,“fpga_arm”);

request_mem_region((unsigned long)sram_buf_2,SRAM_BUFSIZE,“fpga_arm”);

FPGA寄存器地址映射:

sram_buf_1=(unsigned char*)ioremap(0x60000000,SRAM_BUFSIZE);

sram_buf_2=(unsigned char*)ioremap(0x60004000,SRAM_BUFSIZE);

以上为FPGA字符设备驱动程序初始化最为关键的配置。剩下的是在file operation结构下编写驱动函数,结构中的每个成员除了owner必须指向驱动中的函数。其中最为重要的内核态函数是staticssize_t fpga_arm_read(struct file*filp,char_user*buf,size_tsize,loff_ t*ppos),它对应应用层的函数read。驱动程序从FPGA读取数据使用readw函数,完成从内存映射的I/O空间读取16位数据。copy_to_user(buf, (void*)(read_mem),size)复制数据从内核空间到用户空间。FPGA字符设备驱动程序基本实现了控制和管理FPGA读取状态信息和两路ADC采集的数据。

3.2 协处理器FPGA控制程序

协处理器FPGA控制程序分为三个部分:控制ADC数据采集模块、控制读写SRAM模块和FPGA与ARM总线通信模块。其中FPGA与ARM总线通信模块位于顶层模块,控制ADC数据采集模块、控制读写SRAM模块的是底层模块。顶层模块主要是例化底层模块,然后进行数字信号综合处理。

控制ADC数据采集模块,控制并行ADC比较简单,正常工作需要时钟驱动ADC CLK,在编写ADC采样程序时最为关键的是注意在ADC CLK上升沿读取采集的数据才是稳定可靠的。FPGA会对两路ADC采集的数据进行多点求平均的预处理,主要是滤除50Hz的工频干扰,然后写入SRAM存储。

控制读写SRAM模块,FPGA写SRAM与读SRAM操作是非常相似的,SRAM型号是CY7C1021DV33,工作时片选信号CE要拉低。读操作时注意OE信号先拉低再拉高,在其上升沿,读取数据。写操作时注意WE信号先拉低再拉高,在其上升沿,写入数据。FPGA读SRAM时需要关注sram_cs(片选)、sram_oe(读控制)、sram_addr(地址线)和sram1_data(16bit数据线),将sram_cs、sram_oe同时拉低,同时给地址线sram_addr赋值,一个时钟后数据端口sram_data的数据就有效了。

FPGA与ARM通信模块较为复杂,首先,是ARM向FPGA发控制命令。ARM写FPGA内部寄存器时比较重要的信号有:NCS4(片选)、at9260_wr(写信号)、at9260_addr(地址线)、at9260_data(数据线),当NCS4=0&&at9260_wr=0时,意味着ARM9260正在写FPGA寄存器,具体写哪个寄存器由地址信号at9260_addr决定,这样可以将at9260_data写入到相应地址处对应的寄存器。

其次,ARM读FPGA内部状态寄存器,与ARM写FPGA寄存器是非常类似的,当NCS4=0 &&at92

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top