《综合创新实验》由会员分享,可在线阅读,更多相关《综合创新实验(55页珍藏版)》请在金锄头文库上搜索。
1、综合创新实验提纲l1、设计任务l2、设计分析l3、FPGA设计基础l4 模块分析l5 驱动设计l6 测试程序设计l7 GUI程序设计1. 设计任务l设计题目:FGPA扩展子板系统设计l设计内容: 扩展一块FPGA子板,合理选用FPGA器件。有效使用XSBase255扩展槽资源。扩展以下硬件资源:16键键盘、8个LED灯、拨码开关、2路A/D和D/A。l设计要求 l合理选择各种元器件,包括FPGA、A/D、D/A芯片。l合理使用XSBase255开发系统扩展槽资源,设计原理图,要考虑子板和母板的安装。布局图: l软件测试要求:lLED显示lA/DlD/A lKeyPadl开关量输入 2. 设计分
2、析设计分析 l嵌入式系统项目开发流程要经历项目分析、设计和实现与维护四个阶段 l本设计: 前期准备 FPGA逻辑设计 设备驱动设计 驱动测试 GUI应用程序设计 3. FPGA3. FPGA设计基础设计基础 l可编程逻辑器件简介可编程逻辑器件简介 什么是FPGA?什么是CPLD? FPGA与CPLD的主要区别 为什么要使用CPLD/FPGA? 可编程逻辑器件有哪些? 如何使用可编程逻辑器件进行开发? 如何使用Xscale和FPGA进行开发? 3.1 VHDL语言介绍语言介绍l随着EDA技术的发展,使用硬件描述语言(HDL)设计CPLD/FPGA成为一种趋势lVHDL的程序结构特点是将一项工程设
3、计,分成外部(端口)和内部(涉及实体的内部功能实现部分) lVHDL主要用于描述数字系统的结构、行为、功能和接口,跟原理图有对应的关系 l一个简单的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_da
4、ta; /*判断是否设置了允许键盘产生中断*/ 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
5、_VAL); /*读取键值*/ copy_to_user(buff, &value, count); /*将键值返回给应用程序*/ lpoll方法分两步完成l第一步,poll方法需要将所有这些可让进程睡眠的事件队列都加入到poll_table结构的链表中 l第二步是返回一个用来描述操作是否可以立即无阻塞执行的位掩码 lPoll方法代码如下: 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
6、-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 ; return mask;lfasync方法l当应用程序修改文件描述符的FA
7、SYNC标志(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); l中断处理函数l在注册中断号中,使用如下函数: 参数filp用于传递信息给中断处理函数,中断处理函数通过参数dev_id接收l中断处理函数的代码,以键盘为例: request
8、_irq(IRQ_GPIO(GPIO_X), board_irq_handle, SA_INTERRUPT | SA_SHIRQ , INT_OWNER, filp);static 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_id; f_b_p = (FPGA_BOARD *) flip-private_dat
9、a; 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; 驱动的加载驱动的加载 l1.安装位置 l将以上的驱动程序文件放入嵌入式Linux的源代码目录中:driver/char/ l2.修改Makefilel在位于driver/char/目录下的Makefile文件中加入如下语句: obj-$(CONFIG_FPGA) += fpga_board_0.o fpga_board_1.o fp
10、ga_board_2.o fpga_board_3.o fpga_board_4.o l3.修改菜单文件l修改config.in文件,增加如下语句: dep_tristate ADS7843Touchcontroller CONFIG_FPGA $CONFIG_ARCH_XSBASE255dep_tristate FPGA_BOARD CONFIG_FPGA $CONFIG_ARCH_XSBASE255 /添加语句l4.初始化FPGA扩展板的中断引脚 l修改 include/asm-arm/arch-pxa/xsbase255.h,增加以下语句:l修改arch/arm/mach-pxa/xsb
11、ase255.c, 增加以下语句:#define IRQ_GPIO_EXTEND IRQ_GPIO(11)set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(IRQ_GPIO_EXTEND), GPIO_RISING_EDGE);l5.编译Linux内核 l进入Linux源代码目录中,执行make menuconfig,进入Linux内核配置菜单将FPGA扩展板的驱动加入内核中 l进入Character devices菜单 l选择“FPGA_BOARD” l编译内核 make depmake zImage6. 6. 测试程序设计测试程序设计 l测试程序(应用程序)可以通过驱动
12、提供的接口函数来操作设备文件结点来控制设备l6.1 设备文件lFPGA扩展板的设备文件为“fpga_board_x” l在应用程序中通过以下指令打开设备文件:open(/dev/fpga_board_x, O_RDWR); x可以具体指定为0,1,2,3,46.2 操作命令字 l操作命令字是一些符号,通过ioctl系统调用,将这些符号传递到底层驱动程序,告诉驱动程序将要执行的操作 lFPGA扩展板上有五个部件:分别是灯,键盘,拨码开关,A/D控制器,D/A控制器,相应的操作对象可以使用对象选择命令字来表示:LED、KEYBOARD、SWBOARD、DAC和ADC l如果需要操作扩展板上灯,键盘
13、,拨码开关,可使用以下程序 :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);lselect系统调用:是用在访问多个设备文件,但又不想阻塞于任何一个设备文件时使用 l异步通知:是应用程序中通过向系统注册一个信号,并且将该信号与
14、某一处理函数相关联,当中断产生时,激发该信号,然后系统调用与该信号相关联的处理函数 lFPGA扩展板中只有键盘,拨码开关,A/D控制器才能使用异步通知,当使用异步通知前需要开启中断lKEYBOARD对象lKEYBOARD对象命令字 l使用方式:l键盘的操作模式有查询和中断方式两种 ioctl(fd, KEYBOARD, KEYBOARD_READ_KEYVALUE)ioctl(fd, KEYBOARD, KEYBOARD_READ_IFLAG)ioctl(fd, KEYBOARD, KEYBOARD_READ_ICNTR)ioctl(fd, KEYBOARD, KEYBOARD_UNMASK_
15、INTERRUPT)ioctl(fd, KEYBOARD, KEYBOARD_MASK_INTERRUPT)ioctl(fd, KEYBOARD, KEYBOARD_CLEAR_IFLAG)ioctl(fd, KEYBOARD, KEYBOARD_SET_DEFAULT)lADC对象 lA/D控制器有两个输入通道,并且每个通道的工作模式都有两种选择:l模式一. 即时输入方式 l模式二. 自动缓冲采集 l采集频率设置unsigned short feq;ioctl(fd ADC, ADC_SET_FREQUENCY); /*通知底层驱动以下write操 作是设置频率*/feq = 1; writ
16、e(fd, &feq, sizeof(feq); /*频率的数值将通过write操作传递到底层驱动*/l板级对象 l有一些命令字是针对整个FPGA扩展板的,包括如下: 命令字描述INIT_FPGA初始化FPGA扩展板各模块INTERRUPT_ENABLE响应FPGA扩展板发出的中断请求INTERRUPT_DISABLE不允许响应FPGA扩展板发出的中断请求7. GUI程序设计 l着重介绍如何为FPGA扩展板设计具有图形用户介面的应用程序 建立回调函数 监控I/O 绘制图形 Key&Led 界面DA控制界面AD控制界面l完成界面后,还需完成以下工作:l响应ADC发出的中断。l为控件的事件添加回调
17、函数。l绘制图形。 l建立回调函数 l以普通按钮控件为例,在Glade的Properties窗口的Signal下拉菜单中,为按钮的clicked事件添加回调函数 l监控I/O l这一步我们需要控制AD控制器对外部信号的采集 l对ADC的控制方式,这里选择模式二自动缓冲采集 lGDK+中包含更加简便的方法来监测IO gint gdk_input_add( gint source_fd,GdkInputCondition condition,GdkInputFunction function,gpointer data)l绘制图形 l建立一个pixmap,并且将该pixmap的背景色置为白色,dr
18、awingarea1为绘图区域控件,代码如下: pixmap = gdk_pixmap_new(drawingarea1-window,drawingarea1-allocation.width,drawingarea1-allocation.height,-1);gdk_draw_rectangle (pixmap, drawingarea1-style-white_gc, TRUE, 0, 0, drawingarea1-allocation.width, drawingarea1-allocation.height);思考l思考现代电子设计中,为何很多产品设计中使用ARM处理器和FPGA的组合方式?l总结嵌入式系统开发的流程。l简述设备驱动开发的要点。l简述GUI应用程序设计的要点。