《第10章综合创新实验名师编辑PPT课件.ppt》由会员分享,可在线阅读,更多相关《第10章综合创新实验名师编辑PPT课件.ppt(55页珍藏版)》请在优知文库上搜索。
1、1综合创新实验2提纲l1、设计任务l2、设计分析l3、FPGA设计基础l4 模块分析l5 驱动设计l6 测试程序设计l7 GUI程序设计31.设计任务l设计题目:FGPA扩展子板系统设计l设计内容:扩展一块FPGA子板,合理选用FPGA器件。有效使用XSBase255扩展槽资源。扩展以下硬件资源:16键键盘、8个LED灯、拨码开关、2路A/D和D/A。4l设计要求 l合理选择各种元器件,包括FPGA、A/D、D/A芯片。l合理使用XSBase255开发系统扩展槽资源,设计原理图,要考虑子板和母板的安装。布局图:5l软件测试要求:lLED显示lA/DlD/A lKeyPadl开关量输入 62.设
2、计分析设计分析 l嵌入式系统项目开发流程要经历项目分析、设计和实现与维护四个阶段 l本设计:前期准备 FPGA逻辑设计 设备驱动设计 驱动测试 GUI应用程序设计 73.FPGA3.FPGA设计基础设计基础 l可编程逻辑器件简介可编程逻辑器件简介 什么是FPGA?什么是CPLD?FPGA与CPLD的主要区别 为什么要使用CPLD/FPGA?可编程逻辑器件有哪些?如何使用可编程逻辑器件进行开发?如何使用Xscale和FPGA进行开发?83.1 VHDL语言介绍语言介绍l随着EDA技术的发展,使用硬件描述语言(HDL)设计CPLD/FPGA成为一种趋势lVHDL的程序结构特点是将一项工程设计,分成
3、外部(端口)和内部(涉及实体的内部功能实现部分)lVHDL主要用于描述数字系统的结构、行为、功能和接口,跟原理图有对应的关系 9l一个简单的VHDL例子:ENTITY REG12 IS-外部端口定义:数据,时钟,输出 PORT(d:IN BIT_VECTOR(11 DOWNTO 0);clk :IN BIT;q :OUT BIT_VECTOR(11 DOWNTO 0);END REG12;-内部实体逻辑ARCHITECTURE a OF REG12 ISBEGIN PROCESS BEGIN WAIT UNTIL clk=1;-等待时钟上升沿 q private_data;/*判断是否设置了允
4、许键盘产生中断*/if(readb(f_b_p-ICNTR_VIR_ADDR)&KEY_EN)/*如果设置了允许键盘产生中断,程序向下执行*/if(filp-f_flags&O_NONBLOCK)/*如果设置了非阻塞就立刻返回*/return-EAGAIN;wait_event_interruptible(f_b_p-key_readq,f_b_p-key_int_occur);/*睡眠点*/f_b_p-key_int_occur=0;value=(readb(f_b_p-KEY_VIR_ADDR)&KEY_VALID_VAL);/*读取键值*/copy_to_user(buff,&value
5、,count);/*将键值返回给应用程序*/31lpoll方法分两步完成l第一步,poll方法需要将所有这些可让进程睡眠的事件队列都加入到poll_table结构的链表中 l第二步是返回一个用来描述操作是否可以立即无阻塞执行的位掩码 32lPoll方法代码如下:static unsigned int fpga_board_poll(struct file*filp,poll_table*wait)unsigned int mask=0;FPGA_BOARD*f_b_p;f_b_p=filp-private_data;poll_wait(filp,&f_b_p-key_readq,wait);/
6、*键盘 */poll_wait(filp,&f_b_p-sw_readq,wait);/*拨码开关*/poll_wait(filp,&f_b_p-ad_readq,wait);/*AD控制器*/if(f_b_p-key_int_occur|f_b_p-sw_int_occur|f_b_p-ad_int_occur)mask|=POLLIN|POLLRDNORM;return mask;33lfasync方法l当应用程序修改文件描述符的FASYNC标志(filp-f_flags)时,该方法就会被调用。fasync方法代码如下:static int fpga_board_fasync(int fd
7、,struct file*filp,int mode)FPGA_BOARD*f_b_p;f_b_p=filp-private_data;return fasync_helper(fd,filp,mode,&f_b_p-fasync);34l中断处理函数l在注册中断号中,使用如下函数:参数filp用于传递信息给中断处理函数,中断处理函数通过参数dev_id接收l中断处理函数的代码,以键盘为例:request_irq(IRQ_GPIO(GPIO_X),board_irq_handle,SA_INTERRUPT|SA_SHIRQ,INT_OWNER,filp);35static void board
8、_irq_handle(int irq,void*dev_id,struct pt_regs*regs)FPGA_BOARD*f_b_p;struct file*flip;char icntr_cur=0,iflag_cur=0;flip=(struct file*)dev_id;f_b_p=(FPGA_BOARD*)flip-private_data;if(f_b_p-fasync)kill_fasync(&f_b_p-fasync,SIGIO,POLL_IN );wake_up_interruptible(&f_b_p-key_readq);f_b_p-key_int_occur=1;36
9、驱动的加载驱动的加载 l1.安装位置 l将以上的驱动程序文件放入嵌入式Linux的源代码目录中:driver/char/l2.修改Makefilel在位于driver/char/目录下的Makefile文件中加入如下语句:obj-$(CONFIG_FPGA)+=fpga_board_0.o fpga_board_1.o fpga_board_2.o fpga_board_3.o fpga_board_4.o 37l3.修改菜单文件l修改config.in文件,增加如下语句:dep_tristate ADS7843Touchcontroller CONFIG_FPGA$CONFIG_ARCH_X
10、SBASE255dep_tristate FPGA_BOARD CONFIG_FPGA$CONFIG_ARCH_XSBASE255/添加语句38l4.初始化FPGA扩展板的中断引脚 l修改 include/asm-arm/arch-pxa/xsbase255.h,增加以下语句:l修改arch/arm/mach-pxa/xsbase255.c,增加以下语句:#define IRQ_GPIO_EXTEND IRQ_GPIO(11)set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(IRQ_GPIO_EXTEND),GPIO_RISING_EDGE);39l5.编译Linux内核
11、l进入Linux源代码目录中,执行make menuconfig,进入Linux内核配置菜单将FPGA扩展板的驱动加入内核中 l进入Character devices菜单 l选择“FPGA_BOARD”l编译内核 make depmake zImage406.6.测试程序设计测试程序设计 l测试程序(应用程序)可以通过驱动提供的接口函数来操作设备文件结点来控制设备l6.1 设备文件lFPGA扩展板的设备文件为“fpga_board_x”l在应用程序中通过以下指令打开设备文件:open(/dev/fpga_board_x,O_RDWR);x可以具体指定为0,1,2,3,4416.2 操作命令字
12、l操作命令字是一些符号,通过ioctl系统调用,将这些符号传递到底层驱动程序,告诉驱动程序将要执行的操作 lFPGA扩展板上有五个部件:分别是灯,键盘,拨码开关,A/D控制器,D/A控制器,相应的操作对象可以使用对象选择命令字来表示:LED、KEYBOARD、SWBOARD、DAC和ADC 42l如果需要操作扩展板上灯,键盘,拨码开关,可使用以下程序:int fd_key,fd_sw,fd_led;fd_key=open(/dev/fpga_board_0,O_RDWR);fd_sw=open(/dev/fpga_board_1,O_RDWR);fd_led=open(/dev/fpga_bo
13、ard_2,O_RDWR);ioctl(fd_key,,KEYBOARD);ioctl(fd_sw,SWBOARD);ioctl(fd_led,LED);43lselect系统调用:是用在访问多个设备文件,但又不想阻塞于任何一个设备文件时使用 l异步通知:是应用程序中通过向系统注册一个信号,并且将该信号与某一处理函数相关联,当中断产生时,激发该信号,然后系统调用与该信号相关联的处理函数 lFPGA扩展板中只有键盘,拨码开关,A/D控制器才能使用异步通知,当使用异步通知前需要开启中断44lKEYBOARD对象lKEYBOARD对象命令字 l使用方式:l键盘的操作模式有查询和中断方式两种 ioct
14、l(fd,KEYBOARD,KEYBOARD_READ_KEYVALUE)ioctl(fd,KEYBOARD,KEYBOARD_READ_IFLAG)ioctl(fd,KEYBOARD,KEYBOARD_READ_ICNTR)ioctl(fd,KEYBOARD,KEYBOARD_UNMASK_INTERRUPT)ioctl(fd,KEYBOARD,KEYBOARD_MASK_INTERRUPT)ioctl(fd,KEYBOARD,KEYBOARD_CLEAR_IFLAG)ioctl(fd,KEYBOARD,KEYBOARD_SET_DEFAULT)45lADC对象 lA/D控制器有两个输入通道
15、,并且每个通道的工作模式都有两种选择:l模式一.即时输入方式 l模式二.自动缓冲采集 l采集频率设置unsigned short feq;ioctl(fd ADC,ADC_SET_FREQUENCY);/*通知底层驱动以下write操 作是设置频率*/feq=1;write(fd,&feq,sizeof(feq);/*频率的数值将通过write操作传递到底层驱动*/46l板级对象 l有一些命令字是针对整个FPGA扩展板的,包括如下:命令字描述INIT_FPGA初始化FPGA扩展板各模块INTERRUPT_ENABLE响应FPGA扩展板发出的中断请求INTERRUPT_DISABLE不允许响应F
16、PGA扩展板发出的中断请求477.GUI程序设计 l着重介绍如何为FPGA扩展板设计具有图形用户介面的应用程序 建立回调函数 监控I/O 绘制图形 48Key&Led 界面49DA控制界面50AD控制界面51l完成界面后,还需完成以下工作:l响应ADC发出的中断。l为控件的事件添加回调函数。l绘制图形。52l建立回调函数 l以普通按钮控件为例,在Glade的Properties窗口的Signal下拉菜单中,为按钮的clicked事件添加回调函数 53l监控I/O l这一步我们需要控制AD控制器对外部信号的采集 l对ADC的控制方式,这里选择模式二自动缓冲采集 lGDK+中包含更加简便的方法来监测IO gint gdk_input_add(gint source_fd,GdkInputCondition condition,GdkInputFunction function,gpointer data)54l绘制图形 l建立一个pixmap,并且将该pixmap的背景色置为白色,drawingarea1为绘图区域控件,代码如下:pixmap=gdk_pixmap_new(drawinga