嵌入式系统 第10章 综合创新实验_第1页
嵌入式系统 第10章 综合创新实验_第2页
嵌入式系统 第10章 综合创新实验_第3页
嵌入式系统 第10章 综合创新实验_第4页
嵌入式系统 第10章 综合创新实验_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、提纲l1、设计任务l2、设计分析l3、FPGA设计基础l4 模块分析l5 驱动设计l6 测试程序设计l7 GUI程序设计11. 设计任务l设计题目:FGPA扩展子板系统设计l设计内容: 扩展一块FPGA子板,合理选用FPGA器件。有效使用XSBase255扩展槽资源。扩展以下硬件资源:16键键盘、8个LED灯、拨码开关、2路A/D和D/A。2l设计要求 l合理选择各种元器件,包括FPGA、A/D、D/A芯片。l合理使用XSBase255开发系统扩展槽资源,设计原理图,要考虑子板和母板的安装。布局图: 3l软件测试要求:lLED显示lA/DlD/A lKeyPadl开关量输入 42. 设计分析设

2、计分析 l嵌入式系统项目开发流程要经历项目分析、设计和实现与维护四个阶段 l本设计: 前期准备 FPGA逻辑设计 设备驱动设计 驱动测试 GUI应用程序设计 53. FPGA3. FPGA设计基础设计基础 l可编程逻辑器件简介可编程逻辑器件简介 什么是FPGA?什么是CPLD? FPGA与CPLD的主要区别 为什么要使用CPLD/FPGA? 可编程逻辑器件有哪些? 如何使用可编程逻辑器件进行开发? 如何使用Xscale和FPGA进行开发? 63.1 VHDL语言介绍语言介绍l随着EDA技术的发展,使用硬件描述语言(HDL)设计CPLD/FPGA成为一种趋势lVHDL的程序结构特点是将一项工程设

3、计,分成外部(端口)和内部(涉及实体的内部功能实现部分) lVHDL主要用于描述数字系统的结构、行为、功能和接口,跟原理图有对应的关系 7l一个简单的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_d

4、ata; /*判断是否设置了允许键盘产生中断*/ 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) &a

5、mp; KEY_VALID_VAL); /*读取键值*/ copy_to_user(buff, &value, count); /*将键值返回给应用程序*/ 29lpoll方法分两步完成l第一步,poll方法需要将所有这些可让进程睡眠的事件队列都加入到poll_table结构的链表中 l第二步是返回一个用来描述操作是否可以立即无阻塞执行的位掩码 30lPoll方法代码如下: static unsigned int fpga_board_poll(struct file * filp, poll_table * wait) unsigned int mask=0; FPGA_BOARD

6、* f_b_p; f_b_p = filp-private_data; poll_wait(filp, &f_b_p-key_readq, wait); /*键盘 */ 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 ; retu

7、rn mask;31lfasync方法l当应用程序修改文件描述符的FASYNC标志(filp-f_flags)时,该方法就会被调用。fasync方法代码如下: static int fpga_board_fasync( int fd, 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); 32l中断处理函数l在注册中断号中,使用如下函数: 参数filp用于传递信息给中断处理函数,中断

8、处理函数通过参数dev_id接收l中断处理函数的代码,以键盘为例: request_irq(IRQ_GPIO(GPIO_X), board_irq_handle, SA_INTERRUPT | SA_SHIRQ , INT_OWNER, filp);33static void board_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_

9、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; 34驱动的加载驱动的加载 l1.安装位置 l将以上的驱动程序文件放入嵌入式Linux的源代码目录中:driver/char/ l2.修改Makefilel在位于driver/char/目录下的Makefile文件中加入如下语句: o

10、bj-$(CONFIG_FPGA) += fpga_board_0.o fpga_board_1.o fpga_board_2.o fpga_board_3.o fpga_board_4.o 35l3.修改菜单文件l修改config.in文件,增加如下语句: dep_tristate ADS7843Touchcontroller CONFIG_FPGA $CONFIG_ARCH_XSBASE255dep_tristate FPGA_BOARD CONFIG_FPGA $CONFIG_ARCH_XSBASE255 /添加语句36l4.初始化FPGA扩展板的中断引脚 l修改 include/asm

11、-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);37l5.编译Linux内核 l进入Linux源代码目录中,执行make menuconfig,进入Linux内核配置菜单将FPGA扩展板的驱动加入内核中 l进入Character devices菜单 l选择“FPGA_BOARD” l编

12、译内核 make depmake zImage386. 6. 测试程序设计测试程序设计 l测试程序(应用程序)可以通过驱动提供的接口函数来操作设备文件结点来控制设备l6.1 设备文件lFPGA扩展板的设备文件为“fpga_board_x” l在应用程序中通过以下指令打开设备文件:open(/dev/fpga_board_x, O_RDWR); x可以具体指定为0,1,2,3,4396.2 操作命令字 l操作命令字是一些符号,通过ioctl系统调用,将这些符号传递到底层驱动程序,告诉驱动程序将要执行的操作 lFPGA扩展板上有五个部件:分别是灯,键盘,拨码开关,A/D控制器,D/A控制器,相应的

13、操作对象可以使用对象选择命令字来表示:LED、KEYBOARD、SWBOARD、DAC和ADC 40l如果需要操作扩展板上灯,键盘,拨码开关,可使用以下程序 :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_board_2, O_RDWR);ioctl(fd_key,,KEYBOARD);ioctl(fd_sw,SWBOARD);ioctl(fd_led,LED);41lselect

14、系统调用:是用在访问多个设备文件,但又不想阻塞于任何一个设备文件时使用 l异步通知:是应用程序中通过向系统注册一个信号,并且将该信号与某一处理函数相关联,当中断产生时,激发该信号,然后系统调用与该信号相关联的处理函数 lFPGA扩展板中只有键盘,拨码开关,A/D控制器才能使用异步通知,当使用异步通知前需要开启中断42lKEYBOARD对象lKEYBOARD对象命令字 l使用方式:l键盘的操作模式有查询和中断方式两种 ioctl(fd, KEYBOARD, KEYBOARD_READ_KEYVALUE)ioctl(fd, KEYBOARD, KEYBOARD_READ_IFLAG)ioctl(f

15、d, 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)43lADC对象 lA/D控制器有两个输入通道,并且每个通道的工作模式都有两种选择:l模式一. 即时输入方式 l模式二. 自动缓冲采集 l采集频率设置unsigned short feq;i

16、octl(fd ADC, ADC_SET_FREQUENCY); /*通知底层驱动以下write操 作是设置频率*/feq = 1; write(fd, &feq, sizeof(feq); /*频率的数值将通过write操作传递到底层驱动*/44l板级对象 l有一些命令字是针对整个FPGA扩展板的,包括如下: 命令字描述INIT_FPGA初始化FPGA扩展板各模块INTERRUPT_ENABLE响应FPGA扩展板发出的中断请求INTERRUPT_DISABLE不允许响应FPGA扩展板发出的中断请求457. GUI程序设计 l着重介绍如何为FPGA扩展板设计具有图形用户介面的应用程序

17、建立回调函数 监控I/O 绘制图形 46Key&Led 界面47DA控制界面48AD控制界面49l完成界面后,还需完成以下工作:l响应ADC发出的中断。l为控件的事件添加回调函数。l绘制图形。 50l建立回调函数 l以普通按钮控件为例,在Glade的Properties窗口的Signal下拉菜单中,为按钮的clicked事件添加回调函数 51l监控I/O l这一步我们需要控制AD控制器对外部信号的采集 l对ADC的控制方式,这里选择模式二自动缓冲采集 lGDK+中包含更加简便的方法来监测IO gint gdk_input_add( gint source_fd,GdkInputCondition condition,GdkInputFunction function,gpointer data)52l绘制图形 l建立一个pixmap,并且将该pixmap的背景色置为白色,drawingarea1为绘图区域控件,代码如下: pixmap = gdk_pixmap_new(drawingarea1-window,drawingar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论