2)摘自《开拓者 Nios II开拓指南》关注官方微旗子暗记公众年夜众号,获取更多资料:正点原子
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/index.html
第二十七章开拓者FPGA开拓板GUI综合实验

本章将通过一个综合实例,向大家展示FPGA强大的并行处理能力以及与Nios II的协同处
理,并且可以测试开拓板的大部分功能。该实验代码非常多,涉及uC/GUI、图像缩放处理、
音频播放、OV5640摄像头图像显示、手写画笔等非常多的内容,个中大部分功能在前面的实
验中都有实现过,故本章不对代码进行讲解,只先容程序的设计思路与实现的功能。
本章包括以下几个部分:
27.1 开拓者开拓板 GUI 综合实验简介
27.2 实验任务
27.3 硬件设计
27.4 软件设计
27.5 下载验证
开拓者开拓板GUI综合实验简介
大家收到的开拓板,默认固化的便是本次GUI综合测尝尝验的程序,开拓板必须连接LCD
屏,才能显示UI界面以及测试开拓板的外设,本次实验支持正点原子推出的所有的LCD屏。
开拓者FPGA开拓板综合实验除上电自检外,统共有14大功能,分别是:按键测试、LED测
试、蜂鸣器、数码管、串口、红外遥控、EEPROM、环境光、RTC实时时钟、音乐播放、ADDA、
手写画笔、摄像头和网络通信。
按键测试:一个按键测试运用,可以测试板载的4个按键的好坏。
LED测试:一个LED测试运用,可以测试板载的4个LED的好坏。
蜂鸣器:一个蜂鸣器测试运用,可以测试蜂鸣器的好坏。
数码管:一个数码管测试运用,可以测试数码管的好坏。
串口:一个串口通信数据环回运用,通过串口助手完成和开拓板的串口通信的功能。
红外遥控:一个红外遥控测试运用,可以测试板载的红外遥控的好坏。
EEPROM:向EEPROM中写入数据,写入完成后读出数据,通过比较写入的数据和读出的数
据是否同等,来判断EEPROM读写是否精确。
环境光:一个环境光传感器测试运用,读出并显示环境光传感器的光强度和间隔值。
RTC实时时钟:一个RTC实时时钟测试运用,读出并显示当前的日期与韶光。
音乐播放:音频旗子暗记从板载的LINE_IN接口输入,通过喇叭和PHONE接口(连接耳机)进
行播放,可以测试板载的音频芯片和喇叭的好坏。
ADDA:一个ADDA测试运用,通过DA和AD转换,测试板载ADDA的好坏。
手写画笔:在LCD屏上留下触摸后的轨迹,可以用来绘画和写字。
摄像头:通过连接OV5640摄像头,进行视频图像的实时显示。
网络通信:通过以太网的SMI接口(Serial Management Interface,串行管理接口),
读取当前网口和其它网络设备的连接状态。
以上是综合实验的14个功能简介,个中大部分功能在前面的实验中都有实现过,如果大
家有不明白的地方,可以参考前面的内容。在简介部分中,我们仅先容新增的Qsys IP核和接
口,即缩放IP核(Scaler II – Edge Adaptive)和SMI接口。
缩放IP核(Scaler II – Edge Adaptive)
缩放IP核是Qsys系统供应的用于视频图像处理的IP核,该IP核支持输入视频流分辨率到
输出视频流分辨率的放大和缩小。我们知道,不同尺寸的LCD屏,它们的分辨率是不同的,即
使是相同尺寸的LCD屏,分辨率也可能不同,为了使综合实验能够兼容不同分辨率的LCD屏,
我们在综合实验中,添加了缩放IP核,便于兼容不同分辨率的LCD屏。
缩放IP核可选的算法有附近算法、双线性算法、双三次算法、多项式算法和边缘自适应
算法。附近算法比较于其它几种算法,其缩放效果较差,但是花费的逻辑资源是最少的;而
其它几种算法虽然缩放效果更好,但是所花费的逻辑资源也是相对较多的。考虑到综合实验
驱动的外设比较多,功能繁芜,并且开拓者FPGA开拓板上的逻辑资源有限,因此本次实验使
用的缩放算法是逻辑资源花费最少的附近算法,同时其显示效果也能够知足我们的哀求。
缩放IP核的配置界面如下图所示:
图 27.1.1 缩放IP核配置界面
⚫ Bits per symbol:选择symbol的位数,常日是一个字节
⚫ Symbols in parallel:选择并行发送的symbol个数
⚫ Symbols in sequence:选择按顺序发送数据的个数,常日为1
⚫ Enable runtime control of output frame size and edge/blur thresholds:使能运行时掌握
帧输出大小和边缘/模糊阈值。
⚫ Maximum input frame width:选择输入最大帧的宽度
⚫ Maximum input frame height:选择输入最大帧的高度
⚫ Maximum output frame width:选择输出最大帧的宽度
⚫ Maximum output frame height:选择输出最大帧的高度
⚫ 4:2:2 video data:选择帧格式是否为4:2:2格式
⚫ No blanking in video:如果输入视频在转换到 Avalon-ST 视频协议时不包含垂直消隐,
则打开使能
⚫ Scaling algorithm:选择缩放算法。Nearest Neighbor(附近算法)、Bilinear(双线性算
法)、Bicubic(双三次算法)、Polyphase(多项式算法)和 Edge Adaptive(边缘自适
应算法)。
其它一些不常用的参数保持默认即可,这里不作过多的先容。
下表是缩放IP核常用的寄存器描述。
表 27.1.1 缩放IP核寄存器描述
由上表可知,地址0掌握着缩放IP核是否使能;地址3和地址4掌握输出视频的分辨率(宽
度和高度)。在获取到LCD屏的ID后,也就知道了LCD屏的分辨率,我们只须要将缩放IP核输
出的分辨率设置成LCD屏的分辨率即可,从而实现兼容不同分辨率的LCD屏。
Qsys系统中供应了很多VIP(Video and Image Processing,视频图像处理)的IP核,比
如:图像缩放、图像灰度校正等IP核。这些IP核在发送和吸收视频数据时,都要按照Avalon
ST的视频标准进行传输,Avalon-ST的视频标准定义了传输的旗子暗记线,如图 27.1.2所示:
图 27.1.2 Avalon-ST视频格式旗子暗记线
图中为两个VIP IP核通过Avalon-ST的视频标准传输数据的示意图,从图中可以看到
Avalon-ST视频标准的端口旗子暗记,接下来我们先容下这些端口旗子暗记分别代表什么含义。
startofpacket:开始包,用于表示一帧视频传输的开始,高电平有效。
endofpacket:结束包,用于表示一帧视频传输的结束,高电平有效。
data:视频流数据。
empty:可选的空标志旗子暗记,当单次传输超过一个像素点的时候,会增加一个空标志信
号,用于表示哪些数据是无效的。
valid:有效旗子暗记,用于表示data是否有效。
ready:准备完成旗子暗记,当ready旗子暗记拉高时,此时发送端开始发送数据。
Avalon-ST视频包传输时序图如所示:
图 27.1.3 Avalon-ST视频包传输时序图
由上图可知,在时钟(clock)的驱动下,当发送端检测到ready旗子暗记为高电平时,此时
开始传输数据,发送端拉高开始包旗子暗记(startofpacket)和数据有效旗子暗记(valid),此时
第一次传输数据。须要把稳的是,图中一个时钟周期传输的数据量为24位,分3个通道传输,
对应缩放IP的设置为:Bits per symbol设置为8,Symbols in parallel设置为3。当单帧数
据传输结束后,此时拉高结束包旗子暗记(endofpacket)。
VIP IP核传输数据遵照Avalon-ST的视频标准,同时为了适配不同的视频流传输,这个标
准也是一个可配置的协议,包含视频包、掌握包和用户包,我们称之为VIP视频协议。VIP视
频协议规定,在传输视频包之前,必须先传输掌握包,而用户包是可选的,一样平常用来传输和
用户干系的内容,如帧ID信息、音频等。
包的类型是由包的ID来指定的,包起始传输的D0[3:0]即为包的类型,用于表示后面传输
的类型为视频包、掌握包或者用户包。包传输ID与包传输类型的对应关系由下表所示:
表 27.1.2 包类型定义
在包传输的类型中,常用的便是掌握包和视频包,从名字中我们就可以看出,掌握包主
要用来传输一些配置信息的,而视频包用来传输视频数据,掌握包数据的详细定义如下表所
示:
表 27.1.3 掌握包数据定义
下图为扫描办法与详细值的对应关系。
图 27.1.4 扫描办法定义
图中Interlacing表示隔行扫描,Progressive为逐行扫描,本次实验所利用的为逐行扫
描,以是参数要设置为4’b0010。
由此可知,我们在利用缩放IP核时,必须按照VIP视频协议来传输数据,协议规定了传输
数据时包括掌握包和视频包,同时在传输掌握包和视频包之前,要先传输包类型ID,作为包
类型的标志。而在传输掌握包和视频包时,要符合Aavlon-ST的视频流标准,终极我们缩放IP
核才能实现输入视频流分辨率到输出视频流分辨率的调度。
在先容完缩放IP核后,接下来我们再来学习下SMI管理接口。
SMI管理接口
SMI串行管理接口,也被称作MDC/MDIO接口,可以用来读写PHY的寄存器。在“以太网通
信实验”章节中,实际上我们只用到了以太网的MII接口,并没有利用MDC/MDIO接口。
RTL8201CP芯片的参数可以通过MDC/MDIO接口来配置,由于其默认的参数就可以实现MII接口
的自适应10M/100M收发数据,因此可不必对芯片做配置。我们本次网络通信实验完成的功能
是读取网口和其它网络设备的连接状态,这个就须要通过MDC/MDIO接口来完成。
SMI串行管理接口包括MDC和MDIO两条旗子暗记线,MDC是时钟旗子暗记,由主机(FPGA)发送给从
机(PHY芯片),最大不超过2.5MHz;MDIO是双向数据旗子暗记,和IIC接口有些类似,但是其传
输的时序有些差异。SMI接口的写时序图和读时序图分别如图 27.1.5和图 27.1.6所示:
图 27.1.5 SMI接口写时序
图 27.1.6 SMI接口读时序
Preamble:前导码,DMIO至少保持32个时钟周期的高电平,用于同步PHY芯片。
ST(Start of Frame):2位帧开始旗子暗记,利用“01”作为帧开始旗子暗记。
OP(Operation Code):2位操作码,即读写掌握旗子暗记,10:读;01:写。
PHYAD(PHY Address):5位物理地址,由PHY芯片引脚的9、10、12、13、15决定。
REGAD(Register Address):5位寄存器地址。
TA(Turnaround):2位的TA,在读命令中,MDIO在此时由MAC驱动改为PHY驱动,并等待
一个时钟周期准备发送数据;在写命令中,不须要MDIO方向发生变革,则只是等待两个时钟
周期准备写入数据。
DATA:16位数据,在读命令中,PHY芯片将读到的寄存器的数据写到Data中;在写命令
中,MAC将要写入寄存器的值写入Data中。
IDLE:空闲状态,此时MDIO处高阻状态。
PHY芯片是在MDC时钟的上升沿采集和输出MDIO数据的,为了担保数据的可靠传输,FPGA
在MDC的低落沿更新和采集MDIO的数据。
须要把稳的是,PHY Address由PHY芯片引脚的9、10、12、13、15决定,这几个引脚一方
面表示PHY芯片的物理地址,另一方面也用于指示连接状态的LED灯,如果通过RJ45接口,连
接其它网络设备的话,虽然硬件上引脚接地,也可能涌现高电平的情形。开拓者FPGA开拓板
连接其它网络设备后,PHY地址为9。
PHY芯片的寄存器比较多,表 27.1.4和表 27.1.5列出了程序中用到的两个寄存器,至于
其它寄存器的详细信息可以参考RTL8201CP的数据手册。
表 27.1.4 寄存器地址1详细信息
这里我们紧张读取寄存器地址1的Bit[2],来获取当前PHY芯片有没有和其它网络设备进
行连接。
表 27.1.5 寄存器地址3详细信息
寄存器地址3可以用来读取当前PHY芯片是否为RTL8201。
实验任务
本章我们要在开拓者FPGA开拓板上,搭配LCD屏,完成一个综合测尝尝验,包括上电自检
以及14个运用功能,运用功能分别是:按键测试、LED测试、蜂鸣器、数码管、串口、红外遥
控、EEPROM、环境光、RTC实时时钟、音乐播放、ADDA、手写画笔、摄像头和网络通信,该实
验可以测试开拓板的大部分功能。
硬件设计
首先,我们把综合实验的功能实现划分为两部分,“外设的驱动”和“用户界面的绘
制”。个顶用户界面的绘制比较繁芜,适宜用软件来实现,即在嵌入式处理器Nios II中采取
C措辞来设计。而驱动外设的选择性比较灵巧,对付通信速率或者处理速率哀求较高的外设来
说,必须利用硬件来实现,即采取Verilog HDL来设计,如OV5640摄像头图像的采集以及LCD
屏的显示;对付其它通信速率或者处理速率哀求较低的外设来说,既可以利用硬件来实现,
也可以利用软件来实现。
利用硬件来驱动外设的话,会花费比较多的逻辑资源,而采取软件驱动外设只需花费很
少的逻辑资源,只在固化程序时,受限于EPCS Flash存储器的存储资源。Qsys系统搭建Nios
II处理器以及缩放IP核,会花费比较多的逻辑资源,受限于FPGA逻辑资源的大小,本次实验
将部分通信速率较低的外设利用Nios II处理器来驱动,而别的的外设驱动利用硬件来实现。
在软硬件划分之后,我们来看一下全体系统的实现方案,如图 27.3.1所示。OV5640摄像
头图像采集及LCD显示对处理速率的哀求较高,因此和图像显示干系的功能利用硬件来实现。
OV5640摄像头的数据先写入FIFO,然后SDRAM桥掌握模块通过Qsys系统天生的SDRAM掌握器,
写入显存SDRAM中。须要把稳的是,OV5640摄像头的图像数据无法直接通过SDRAM掌握器写入
SDRAM中,因此本次实验通过SDRAM桥掌握模块和SDRAM掌握器实现SDRAM的读写操作。
用户界面的绘制由Nios II处理器来完成,为了提高UI界面的开拓效率,UI界面的绘制我
们将在Nios II中采取uC/GUI来实现,这样将会大大提高UI界面的开拓效率以及降落UI 界面
绘制的繁芜度。与此同时,显存SDRAM也用作UI绘制过程中的显存,SDRAM桥掌握模块会根据
Nios II处理器的掌握,从SDRAM中读出UI界面或者摄像头的图像数据,并终极转换成VIP协议
的视频流,连接至Qsys系统中的缩放IP核;图像数据经缩放IP核后,输出调度分辨率之后的
图像,然后转换成FIFO接口的数据以便于LCD驱动模块来读取,终极将图像数据显示在LCD液
晶屏上。
由系统框图可知,红外吸收驱动模块、数码管驱动模块、ADDA驱动模块以及触摸驱动模
块是由硬件来实现的,Nios II处理器通过Avalon-MM端口来写入和读出模块中的数据,比如
红外吸收到的数据、数码管显示的数值等。
图 27.3.1 GUI综合实验系统框图
全体系统的设计方案确定之后,我们还须要完成用户界面的设计。根据实验任务的要
求,用户界面该当包含上电自检界面、主界面以及14个运用功能的子界面。这里只列出LCD主
界面的显示图,如图 27.3.2所示:
图 27.3.2 LCD显示主界面
上面的UI设计我们将在Nios II中采取uC/GUI来实现,这部分内容会在接下来的软件设计
中谈论,我们先对照着图 27.3.1来看一下底层硬件中各个模块的设计思路。
OV5640驱动模块
OV5640驱动模块(ov5640_dri)紧张卖力摄像头的配置、图像采集,并输出图像数据,
其模块接口定义如下图所示:
图 27.3.3 OV5640驱动模块及其接口定义
模块的输入端为8位的图像数据(cam_data),输出端为写使能旗子暗记(wr_en)和写16位
图像数据旗子暗记(wr_data),图像数据为RGB565格式,写使能和写数据旗子暗记连接到FIFO模块
(ov5640_fifo)。除此之外,模块还输出了摄像头初始化完成旗子暗记(cam_init_done)和摄
像头的ID标志(ID_flag),这个标志可以用来判断当前连接的摄像头是否为OV5640,如果不
是的话,即没有检测到OV5640摄像头,ID_flag为低电平。
OV5640驱动模块内部例化了3个子模块,分别为OV5640配置模块
(i2c_ov5640_rgb565_cfg)、OV5640 I2C驱动模块(i2c_dri_ov5640)和图像采集模块
(cmos_capture_data),如下图所示:
图 27.3.4 OV5640驱动模块框图
图像采集模块卖力将输入的8位数据转成16位的RGB565数据;OV5640配置模块寄存了
OV5640须要配置的寄存器地址和数据,在开始配置之前,先对摄像头的ID进行读取,从而判
断出开拓板是否连接OV5640摄像头;OV5640 I2C驱动模块(i2c_dri_ov5640)卖力驱动摄像
头的配置总线,即SCCB总线,由于本次实验增加了读取摄像头ID的功能,而SCCB接口的读操
作和IIC接口的读操作有些许差别,因此OV5640 I2C驱动模块在IIC驱动模块上做了一些修
改,即将读操作的重新开始(restart),改为先停滞后开始。
须要把稳的是,通过SCCB接口读取摄像头的ID时,由于配置接口的SCL和SDA旗子暗记线没有
接上拉电阻,因此在Quartus II软件中,须要将这两根旗子暗记线连接上拉电阻。
管脚设置成弱上拉的步骤如下:打开工程的管脚分配界面,在界面端口设置信息的空缺处
右击,选择Customize Columns,如图 27.3.5所示:
图 27.3.5 管脚分配界面
双击左侧的Weak Pull-Up Resistor,将其添加至右侧的列表中(如果已经涌如今右侧列
表中,可忽略此步骤),并点击【OK】按钮,如下图所示:
图 27.3.6 添加弱上拉的选项
此时在管脚分配界面可以看到Weak Pull-Up Resistor的选项,在对应cam_scl端口和
cam_sda端口,设置成On即可。如下图所示:
图 27.3.7 设置成弱上拉
为了适配不同LCD屏的显示,本次实验添加了缩放IP核,缩放之前的分辨率固定为
800x480,因此,摄像头输出的图像分辨率设置为800x480。
SDRAM桥掌握模块
SDRAM桥掌握模块(sdram_bridge_control)一方面卖力从FIFO模块(ov5640_fifo)中
读出OV5640的图像数据,写入SDRAM中,写入的频率由OV5640 FIFO模块缓存的数据个数决
定;另一方面也卖力从SDRAM中读出数据,读出数据的频率由fifo_2_st模块(FIFO数据转
Avalon-ST数据流模块)输出的fifo缓存个数决定。其模块接口定义如下图所示:
图 27.3.8 SDRAM桥掌握模块及其接口定义
我们在前面说过,SDRAM既作为OV5640摄像头图像的显存,也作为UI界面的显存,实际上
图像显存和UI界面的显存,占用的地址空间是不一样的。当Nios II处理器发送掌握旗子暗记显示
OV5640摄像头数据时,SDRAM桥掌握模块读取图像的显存地址;而当Nios II处理器发送掌握
旗子暗记显示UI界面时,SDRAM桥掌握模块读取UI界面的显存地址,因此,当UI界面和摄像头图像
须要切换显示时,只须要修正读取SDRAM的地址,就可以实现快速的切换显示。
SDRAM桥掌握模块无论读取的是摄像头图像数据的显存地址,还是UI界面的显存地址,最
终都是要经由缩放IP核改变像素的分辨率。为了方便下一级模块将16位数据转成Avalon-ST的
数据流,我们在SDRAM桥掌握模块对读出的16位像素数据做了一层封装,将16位数据封装成19
位数据,这19位数据从高位到低位依次为开始包旗子暗记(source_sop)、结束包旗子暗记
(source_eop)、数据有效旗子暗记(source_valid)和16位数据(source_data)。
FIFO数据转Avalon-ST数据流模块(fifo_2_st)
FIFO数据转Avalon-ST数据流模块紧张卖力的是,将SDRAM桥掌握模块输出的数据先写入
FIFO,然后从FIFO中读出数据时,并转成Avalon-ST格式的数据流。其模块接口定义如下图所
示:
图 27.3.9 FIFO转ST数据流模块接口及定义
该模块内部例化了FIFO模块,输入的数据之以是先经由FIFO缓存,是由于要先等待下一
级模块输出ready(准备完成)旗子暗记,才能给下一级模块输出数据,同时该模块将输入的19位
数据转成Avalon-ST的数据流格式,即开始包旗子暗记(st_source_sop)、结束包旗子暗记
(st_source_eop)、数据有效旗子暗记(st_source_valid)和16位数据(st_source_data)。
Avalon-ST数据流转VIP格式数据流
由于缩放IP模块输入的数据必须为VIP格式数据流,因此该模块紧张对Avalon-ST格式的
数据流进行封装,即添加包类型以及掌握包。其模块接口定义如下图所示:
图 27.3.10 ST转VIP格式模块接口及定义
我们在简介部分中有向大家先容,VIP视频协议规定,在传输视频包之前,必须先传输控
制包,包的类型是由包的ID来指定的,包起始传输的D0[3:0]即为包的类型,用于表示后面传
输的类型为视频包、掌握包或者用户包。
ST格式转VIP格式模块在传输视频包之前,先发送掌握包类型(ID),ID=4’hF;然后发
送掌握包的内容,即输入视频的宽度为800,高度为480,图像扫描办法为逐行扫描;接下来
发送视频包的类型(ID),ID=4’h0;末了发送视频包,即有效的图像数据。在发送包类型
(ID)的时候要拉高包开始旗子暗记(dout_startofpacket),掌握包和视频包末了一位数据发
送完成后,拉高包结束旗子暗记(dout_endofpacket)。
须要把稳的是,在缩放IP核的配置界面(软件设计部分会先容)中,设置的数据位宽为
24位,即RGB888的数据格式,而输入的数据为RGB565格式,因此在输出数据的时候,各个颜
色分量的低位补1,以知足缩放IP核的格式哀求,终极该模块输出的旗子暗记连接至Qsys系统的缩
放IP核模块。
VIP数据流转Avalon-ST格式数据流
缩放IP核模块输入的数据为VIP数据流格式,那么输出调度分辨率之后的数据同样也为
VIP数据流格式,因此VIP数据流转ST数据流模块实际上是对数据进行解包,其模块接口定义
如下图所示:
图 27.3.11 VIP转ST数据流模块及定义
该模块可以算作是ST格式转VIP格式模块的逆过程,将输出的Avalon-ST格式数据连接至
下一级模块。
Avalon-ST数据流转FIFO模块(fifo_2_st)
Avalon-ST数据流转FIFO模块紧张将输入的ST数据流存入FIFO,根据FIFO中的数据个数来
掌握读取ST数据流的速率,FIFO中的读操作接口连接至LCD驱动模块,其模块接口定义如下图
所示:
图 27.3.12 ST数据流转FIFO模块接口及定义
LCD顶层驱动模块
LCD驱动模块卖力驱动LCD屏,包括MCU屏和LCD屏,其模块接口定义如下图所示:
图 27.3.13 LCD顶层驱动模块
图中有两组LCD端口旗子暗记,一组连接至顶层模块的端口旗子暗记,另一组连接至Qsys模块的端
口旗子暗记,个中Qsys模块的LCD端口旗子暗记紧张用于读取LCD屏的ID,以及对MCU LCD屏进行初始
化。由于MCU LCD屏的初始化比较繁芜,须要配置的寄存器非常多,以是这部分内容非常适宜
软件来实现,而LCD屏的显示对处理速率哀求较高,因此利用硬件来实现。
LCD顶层模块例化了以下四个模块,分别是LCD旗子暗记选择模块(lcd_signal_sel)、RGB
LCD屏驱动模块(rlcd_driver)、MCU LCD屏驱动(mlcd_driver)和时钟分频模块
(clk_div)。如下图所示:
图 27.3.14 LCD顶层模块框图
LCD旗子暗记选择模块紧张对顶层模块的LCD端口旗子暗记进行连接的选择,当LCD初始化未完成
时,将顶层模块的LCD端口旗子暗记连接至Qsys模块;当LCD初始化完成,并且读到的ID为RGB LCD
屏的ID时,将顶层模块的LCD端口旗子暗记连接至RGB LCD屏驱动模块;否则连接至MCU LCD屏驱动
模块。
时钟分频模块根据输入的LCD屏的ID,选择输出不同的时钟频率,这是由于不同分辨率的
RGB LCD屏和MCU LCD屏,对应LCD的时钟频率不同。
RGB LCD驱动模块卖力驱动RGB LCD屏,同时根据输入的RGB LCD屏的ID,来选择利用不同
的参数,如行同步像素数、行同步后沿像素数等。
MCU LCD驱动模块卖力驱动MCU LCD屏,同样也须要根据输入的MCU LCD屏的ID,来选择使
用不同的寄存器地址与寄存器参数。
触摸屏驱动模块
触摸屏驱动模块完成对触摸屏按键的检测与触摸点坐标的获取,其模块接口定义如下图
所示:
图 27.3.15 触摸屏驱动模块接口及定义
触摸屏驱动模块支持正点原子推出的所有电阻屏和电容屏,该模块根据输入的LCD屏的
ID,来对触摸屏实行不同的配置和获取触摸点坐标。当检测到屏幕被按下后,会拉高
touch_done旗子暗记,如果touch_valid一贯为高电平,则表示触摸屏一贯被按下,Nios II通过
Avalon-MM接口来获取坐标值。图中page_paint_flag为Nios II输出的手写画笔界面的标志,
便于电阻屏连续检测触摸点坐标。
触摸屏驱动模块例化了三个子模块,如图 27.3.16所示。个中GT系列芯片配置模块
(touch_gt_cfg)用于初始化触摸屏(GT系列芯片包括4.3寸屏幕和10.1寸屏幕芯片),即通
过IIC接口对GT芯片进行配置,并在配置完成后拉高配置完成旗子暗记(cfg_done)。而电容触摸
驱动模块(touch_ctrl)卖力掌握所有电容触摸屏驱动的全体流程,包括掌握触摸屏初始化
的开始、检测触摸屏是否被按下以及读取触摸点的坐标。电阻触摸驱动模块(xpt2046)卖力
驱动电阻触摸屏,须要把稳的是,电容触摸屏的驱动采取的是IIC协议,而电阻触摸屏采取的
是SPI协议。
图 27.3.16 触摸屏模块框图
GT系列芯片配置模块例化了以下三个模块,分别是旗子暗记切换模块(signal_switch)、
IIC驱动模块(i2c_dri_m)和i2c参数配置模块(i2c_reg_cfg),如图 27.3.17所示。
图 27.3.17 GT系列芯片配置模块框图
这里的IIC驱动模块和“EEPROM读写实验”中所利用的IIC驱动模块有些差异,在
“EEPROM读写实验”中,IIC驱动模块只支持单次读写,并不支持连续的读写。由于触摸屏的
初始化参数比较多,并且在读取触摸点坐标时也会对IIC接口进行连续的读操作,因此本次实
验在此根本上,增加了对IIC接口连续读写的功能,单次操作连续读写的次数由reg_num进行
设置,这样将会大大提高IIC读写的速率。当IIC单个地址读写完成后,IIC驱动模块会输出一
个单次完成的脉冲旗子暗记(once_done);当IIC单次操作完成后(连续地址读写完成),会输
出一个IIC操作完成的脉冲旗子暗记(i2c_done)。
IIC参数配置模块寄存了触摸屏初始化参数,由于本次试验FPGA的逻辑资源花费很多,而
RAM资源花费的较少,因此本次试验将GT系列的配置参数全部放在mif文件里,即存储在ROM
中。
由于电容屏驱动模块的读写操作和IIC参数配置模块的初始化操作都会用到IIC接口,因此这两个模块输出的端口旗子暗记须要先做一个选择,再连接到IIC的驱动模块中,旗子暗记选择的功
能是由旗子暗记切换模块实现的。这个模块实现的方法也比较大略,根据输入的cfg_switch旗子暗记
的高低电平进行选择。当cfg_switch为高电平时,将IIC参数配置模块的IIC操作端口旗子暗记连
接至IIC驱动模块;当cfg_switch为低电平时,将电容屏驱动模块的IIC操作端口旗子暗记连接至
IIC驱动模块。
在硬件设计部分中,紧张向大家先容了SDRAM桥掌握模块的读写、缩放IP核输入数据的格
式转换与输出数据的格式转换、LCD屏幕显示驱动以及触摸驱动,而其它外设的驱动模块在前
面的实验中都有详细的讲解,这里不再重复赘述。须要解释的是,Nios II处理器通过
Avalon-MM端口来写入和读出模块中的数据,比如红外吸收到的数据、数码管显示的数值等。
在先容完各功能模块后,接下来我们在软件设计部分先容一下如何实现UI界面的绘制,
以及如何利用触摸屏来实现与用户的交互。
软件设计
综合实验的UI界面比较繁芜,包括上电自检界面、主界面以及14个运用功能子界面。为
了提高UI界面的开拓效率,UI界面的绘制我们将在Nios II中采取uC/GUI来实现。Nios II除
了卖力完成用户界面的绘制外,还根据触摸屏输入的触摸点坐标来实现相应的功能,为了做
到触摸点坐标的实时相应,本次实验触摸屏的驱动是在硬件中利用Verilog措辞实现,Nios
II通过Avalon-MM端口来获取触摸驱动模块输出的触摸点的坐标。由于FPGA的逻辑资源有限,
Nios II处理器也卖力驱动部分外设。
Qsys系统搭建
在先容完触摸驱动模块和SDRAM桥掌握模块之后,接下来我们来先容下Qsys系统环境的搭
建,如图 27.4.1所示:
图 27.4.1 Qsys系统的搭建
Qsys系统利用的IP核,绝大多数在我们前面的实验中都有涉及,个中avalon_mm_bridge
为自定义的IP核,Nios II处理器通过Avalon-MM端口来写入和读出硬件模块中的数据;
sdram_bridge为Avalon-MM Pipeline Bridge IP核,通过SDRAM掌握器来突发读写SDRAM;
pio_mdc和pio_mdio为以太网的MDC/MDIO管理接口,用于读取以太网的和其它网络设备的连接
状态;pio_cs、pio_clk、pio_mosi、pio_miso为SD卡的端口旗子暗记,用于对SD卡进行读写测
试;pio_page_paint_flag为手写画笔界面的标志,方便触摸驱动模块对连续触摸进行检测;
缩放IP核(alt_vip_cl_scl_0)用于放大和缩小图像的分辨率,以兼容不同分辨率的屏幕。
这里我们紧张先容下缩放IP核(alt_vip_cl_scl_0),其配置界面如图 27.4.3所示:
图 27.4.3 缩放IP核配置页面
Bits per symbol(symbol的位数)设置为8,Symbols in parallel(并行发送的symbol
个数)设置为3,Symbols in sequence(按顺序发送数据的个数)设置为1,则发送数据的位
宽为24(83)位。
由于本次实验须要根据LCD屏ID来调度缩放比,因此使能运行时掌握帧输出大小。
缩放IP核固定输入分辨率为800x480,最大输出分辨率为1280x800(10.1寸RGB LCD
屏)。
输入视频在转换到Avalon-ST视频协议时不包含垂直消隐,因此勾选No Blanking invideo。
由于FPGA的逻辑资源有限,因此缩放算法这里选择对逻辑资源花费最少的附近算法
(Nearest Neighbor),别的配置保持默认即可。
Nios II软件设计
在先容完Qsys系统的搭建之后,末了我们再来先容一下Nios II软件设计部分。
Nios II紧张卖力绘制上电自检界面、主界面以及14个运用功能子界面,除此之外,还需
要判断用户的触摸操作和部分外设的驱动。上电自检界面如图 27.4.4所示:
图 27.4.4 上电自检界面
在前面学习了uC/GUI干系的章节之后,相信对大家来说,绘制上图中的用户界面是比较
随意马虎的。图中紧张利用GUI_DispStringAt()函数绘制字符串,而对外设的测试方法,如
EEPROM、SD卡、AP3216C,则是向某个或某段地址写入固定值,然后读出数据,比较读出的值
和写入的值是否同等,如果同等则外设测试精确,否则外设测试出错。RTC实时时钟的测试方
法和其它外设有些差异,这里是通过读取RTC实时时钟的秒寄存器,如果在一秒韶光内,秒寄
存器数值加1,则测试精确(如果数值为59,则加1后为0),否则测试缺点。
在开拓板上电自检完成后,接下来会进入主界面,主界面如图 27.4.5所示:
图 27.4.5 LCD显示主界面
这里须要强调的是,主界面的绘制并不是先绘制背景图片,再绘制运用图标和笔墨,而
是全体主界面是一幅图片,直接把图片绘制出来,便是上图中LCD显示的主界面。这里紧张是
考虑到过多的字体和图片在终极固化程序时,会占用大量EPCS Flash的存储资源,而开拓板
的片外存储资源是有限的,因此将主界面作为一副图片显示在主界面上。
接下来我们看下main函数的代码,理解下Nios II实行的过程,由于main函数的代码较
长,这里只贴上部分代码。
170 int main()
171 {
172 alt_u8 key,key_pre;
173 alt_u8 i;
174
175 alt_u8 led_button;
176 alt_u8 led_num;
177
178 alt_u8 grade=vol/8; //音频的音量级别
179 alt_u8 page_5640_done = 0; //ov5640子页面绘制完成页面
180
181 MY_LCD_Init(); //LCD初始化
182
183 IOWR_ALTERA_AVALON_PIO_DATA(PIO_OV5640_EN_BASE, 0); //显示GUI界面
184 GUI_Init(); //uC/GUI初始化
185 GUI_UC_SetEncodeUTF8(); //设置汉字编码格式
186 GUI_SetFont(&GUI_FontChinese_WRYH32);
187
188 lcdgui.width = lcddev.height;
189 lcdgui.height = lcddev.width;
190 height_ave32 = lcdgui.height/32;
191 width_ave8 = lcdgui.width/8;
192
193 switch(lcddev.id){
194 case 0x9341:{
195 IOWR(ALT_VIP_CL_SCL_0_BASE,3,320); //设置缩放后图像宽度
196 IOWR(ALT_VIP_CL_SCL_0_BASE,4,240); //设置缩放后图像高度
197 break;
198 }
199 case 0x5310:{
200 IOWR(ALT_VIP_CL_SCL_0_BASE,3,480); //设置缩放后图像宽度
201 IOWR(ALT_VIP_CL_SCL_0_BASE,4,320); //设置缩放后图像高度
202 break;
203 }
204 case 0x5510:{
205 IOWR(ALT_VIP_CL_SCL_0_BASE,3,800); //设置缩放后图像宽度
206 IOWR(ALT_VIP_CL_SCL_0_BASE,4,480); //设置缩放后图像高度
207 break;
208 }
209 case 0x1963:{
210 IOWR(ALT_VIP_CL_SCL_0_BASE,3,800); //设置缩放后图像宽度
211 IOWR(ALT_VIP_CL_SCL_0_BASE,4,480); //设置缩放后图像高度
212 break;
213 }
214 case 0x4342:{
215 IOWR(ALT_VIP_CL_SCL_0_BASE,3,480); //设置缩放后图像宽度
216 IOWR(ALT_VIP_CL_SCL_0_BASE,4,272); //设置缩放后图像高度
217 break;
218 }
219 case 0x7084:{
220 IOWR(ALT_VIP_CL_SCL_0_BASE,3,800); //设置缩放后图像宽度
221 IOWR(ALT_VIP_CL_SCL_0_BASE,4,480); //设置缩放后图像高度
222 break;
223 }
224 case 0x7016:{
225 IOWR(ALT_VIP_CL_SCL_0_BASE,3,1024); //设置缩放后图像宽度
226 IOWR(ALT_VIP_CL_SCL_0_BASE,4,600); //设置缩放后图像高度
227 break;
228 }
229 case 0x1018:{
230 IOWR(ALT_VIP_CL_SCL_0_BASE,3,1280); //设置缩放后图像宽度
231 IOWR(ALT_VIP_CL_SCL_0_BASE,4,800); //设置缩放后图像高度
232 break;
233 }
234 default: ;
235 }
236
237 IOWR(ALT_VIP_CL_SCL_0_BASE,0,1); //启动缩放模块
238 IOWR_ALTERA_AVALON_PIO_DATA(PIO_LCD_INIT_DONE_BASE,1); //初始化完成
239
240 init_tp_interrupt(); //触摸屏中断初始化
241 init_touch_key_interrupt(); //触摸按键中断初始化
242 init_uart_interrupt(); //串口中断初始化
243 init_paint_interrupt(); //手写画笔中断初始化
244 disable_paint_interrupt(); //初始化关闭画笔结束中断
245
246 gui_draw_sys_test_page(); //画系统测试界面
247 gui_draw_home_page(); //画主界面
248
249 while(1)
……
在LCD屏初始化完成后,获取到LCD屏的ID,此时根据LCD屏的ID,来设置缩放IP核输出分
辨率,使能缩放IP核并拉高LCD初始化完成旗子暗记,如代码中第193至第238行所示。接下来绘制
开拓板的上电自检界面,自检界面完成后,进入主界面,如代码中第246行和第247行代码所
示。进入主界面后,接下来开始根据用户的触摸操作,来切换显示各个运用子界面,这部分
内容由while循环来完成。
我们这里只大略先容下main函数的程序,理解下Nios程序的实行过程,还须要把稳的是
当触摸屏被按下后,触摸屏驱动模块有可能检测到单个触摸点坐标触发多次,此时程序会多
次进入触摸中断函数tp_interrupt(),导致功能缺点的情形。为了避免这一情形,在触摸屏
驱动模块中加入了对触摸点坐标的判断,如果触摸屏一贯被按下没有松开,并且当前触摸点
坐标和上一次触摸点坐标同等的话,则忽略当前触摸点的坐标。
除此之外,新出发点开拓板的GUI综正当式只是在开拓者开拓板GUI综正当式做了大略的修
改,由于两块FPGA开拓板上的外设有所差异,因此我们在draw_page.h文件中定义了开拓板的
类型,如下所示:
#define BOARD_TYPE 1 //0:新出发点 1:开拓者
当BOARD_TYPE = 1时,表示实行开拓者的程序;当BOARD_TYPE = 0时,表示实行新出发点
的程序。其余开拓者GUI程序改成适配新出发点开拓板,也不仅仅修正这一个参数,同时还须要
修正主界面的显示图片。
下载验证
接下来我们把程序下载至开拓者开拓板上,验证我们所完成的GUI综合实验的功能。
要测试开拓者FPGA开拓板综合实验的全部功能,大家得自备1张SD卡、1根网线、OV5640
摄像头。不过,就算没有外接这些模块,综合实验还是可以正常运行的,只是有些限定而
已。
针对LCD屏这里再补充一点,GUI综合实验必须连接LCD屏才能看到显示效果,该实验基于
图像缩放算法来适配不同分辨率的LCD屏幕,图像缩放之前的原始分辨率大小为800480,而
2.8寸屏幕和3.5寸屏幕分辨率较低,以是缩放之后,字体的显示效果会比高分辨率屏幕的显
示效果差,为了得到更好的显示效果,建议大家连接4.3寸及以上的屏幕。
这里以4.3寸RGB LCD屏为例,大家拿出开拓板,先接上12V1A电源适配器给开拓板供
电,RGB LCD屏和开拓板是通过40P的FPC排线相连接,如下图所示:
图 27.5.1开拓者FPGA开拓板与4.3寸RGB屏连接示意图
末了,按下电源开关,给开拓板上电,此时开拓板右下角的蓝色电源灯会亮,同时开拓
板会对EEPROM、SD卡、AP3216C和RTC做读写测试,如下图所示:
图 27.5.2 开拓者FPGA开拓板开机自检界面
如果开拓板在上电前连接了SD卡(SD卡槽在开拓板背面),在测试成功后显示OK;如果
没有连接SD卡的话,会提示Error。
接下来进入到主界面之后,就可以通过点击屏幕的图标进行各项功能测试了。主界面如
下图所示:
图 27.5.3 RGB LCD液晶屏主界面
主界面有1个页面,统共是14个图标。每个图标代表一大功能,主界面顶部是状态栏,
用于显示“正点原子”四个字和当前韶光。在任何界面下,都可以通过按下TPAD触摸按键返
回上一级,直至返回主界面。PS:TPAD便是开拓者FPGA开拓板上的一个触摸按键,即右下角
的白色骷髅头。
如果大家的开拓板连接了VGA显示器的话,在开拓板上电之后,VGA显示器会显示出彩
条。须要解释的是,LCD屏处于任何GUI界面,VGA显示器都会一贯显示彩条的,如下图所示。
图 27.5.4 开拓者开拓板VGA显示画面
在先容完主界面后,接下来我们开始先容各个功能。
1、按键测试
点击主界面的按键测试图标,进入如图 27.5.5所示的界面:
图 27.5.5 按键测试界面
上图中,左侧的图片是我们点击按键测试后进入的子界面,可以看到,图中共四个按键
图标,分别对应开拓者开拓板上的KEY0~KEY3按键。当我们按下开拓板上个中的一个按键后,
界面上对应的按键图标会变成赤色背景,如上图中右侧图片所示;松开按键后,按键图标又
会规复成黄色背景。
当我们想退出按键测试界面时,只须要按下开拓板上的TPAD触摸按钮即可。
2、LED测试
点击主界面的LED测试图标,进入如图图 27.5.6所示的界面:
图 27.5.6 LED测试界面
上图中,左侧的图片是我们点击LED测试后进入的子界面,图中从左往右共4个LED图标,
分别对应开拓板上的DS0~DS3,图标下方的按钮用来掌握开拓板上的LED灯的亮灭。当我们点
击界面上的个中一个按钮后,界面上对应的LED图标会变成蓝色(如上图中右侧图片所示),
同时开拓板上的LED灯会点亮;再次点击按钮后,界面上对应的LED图标规复成白色,同时开
发板上的LED灯会熄灭。
3、蜂鸣器
点击主界面的蜂鸣器图标,进入如图 27.5.7所示的界面:
图 27.5.7 蜂鸣器测试界面
上图中,左侧的图片是我们点击蜂鸣器后进入的子界面,点击界面上的“打开”按钮,
此时可以听到开拓板上的蜂鸣器在鸣叫,并且按钮会显示成“关闭”(如上图中右侧图片所
示);点击界面上的“关闭”按钮,蜂鸣器即可停滞鸣叫。
4、数码管
点击主界面的数码管图标,进入如图 27.5.8所示的界面:
图 27.5.8 数码管测试界面
上图中,左侧的图片是我们点击数码管后进入的子界面,图中有三个按钮,分别是
“-”、“打开”和“+”按钮。我们点击界面上的“打开”按钮,此时可以看到开拓板上的
数码管显示数字,并且界面上同样也会显示数码管显示的数字(如上图中右侧图片所示),
点击界面上的“+”和“-”按钮可以对数字进行加减,点击“关闭”按钮即可关闭数码管的
显示。
5、串口
我们开拓者FPGA开拓板板载两个串口,一个是USB串口,另一个是RS232串口,我们这里
测试的是USB串口。在开始测试之前,我们须要将USB线一端连接电脑,另一端与开拓板上的
USB_232口相连接,须要把稳的是,大家在第一次做串口实验时,须要安装USB的串口驱动程
序,该程序位于资料盘的“6_软件资料\1_软件\CH340驱动(USB串口驱动)_XP_WIN7共用”文
件夹下。串口测试须要在电脑中打开串口调试助手才能完成通信,我们资料盘中供应了几种
调试助手,本次测试利用的是“XCOM”调试助手,该软件位于“6_软件资料\1_软件\串口调
试助手\XCOM(ALIENTEK官方推举)”文件夹下。我们本次串口通信的波特率为115200,串口
打开和设置完成后的界面如图 27.5.9所示。
图 27.5.9 串口打开界面
不同电脑的不同USB口串口号可能会不一样,大家可以根据自己的电脑进行选择,我们这
里选择的是COM5:USB-SERIAL CH340。
点击主界面的串口图标,进入如图 27.5.10所示的界面:
图 27.5.10 串口测试界面
上图是我们点击串口后进入的子界面,我们点击界面上的“发送”按钮,串口调试助手
即可吸收到开拓板发送的数据,如下图所示:
图 27.5.11 串口助手吸收到数据
这个时候,我们点击串口调试助手的“发送”按钮,开拓板界面上会显示吸收到的数
据,如下图所示:
图 27.5.12 串口测试界面
6、红外遥控
点击主界面的串口图标,进入如图 27.5.13所示的界面:
图 27.5.13 红外遥控测试界面
上图中,左侧的图片是我们点击红外遥控后进入的子界面,图中第一栏是遥控器的键
值,第二栏是遥控器的符号。此时按下遥控器的按键(利用遥控器之前须要先将遥控器后部
的塑料绝缘片拔出),界面上会显示出遥控器的键值和符号(如上图中右侧图片所示)。
7、EEPROM
EEPROM是板载的电可擦除可编程只读存储器,是一种常用的非易失落性存储器,点击主界
面的EEPROM图标,进入如图 27.5.14所示的界面:
图 27.5.14 EEPROM测试界面
上图中,左侧的图片是我们点击EEPROM后进入的子界面,点击“测试”按钮后,FPGA开
始向EEPROM的地址0写入数据0,数据写完后从地址0中读取数据,并将读取的数据显示在页面
中的读数据上;接着FPGA向EEPROM中的地址1中写入数据1,同样是写完后将数据读取出来,
并显示在界面上,直至写至EEPROM的地址99开始停滞(如上图中右侧图片所示)。比较写入
的数据和读出的数据是相同的,解释本次EEPROM测试成功。
8、环境光
环境光传感器(AP3216C)是一个能够丈量环境光强度和间隔的整合型光感测距传感器。
点击主界面的环境光图标,进入如图 27.5.15所示的界面:
图 27.5.15 AP3216C测试界面
上图是我们点击环境光后进入的子界面,界面中第一栏是环境光的强度,第二栏是间隔
值。环境光传感器(U7)位于开拓板的左下角位置(靠近数码管),通过增加光照和靠近环境
光传感器,可以在界面上看到光照值和间隔值的实时变革。
9、时钟
点击主界面的时钟图标,进入如图 27.5.16所示的界面:
图 27.5.16 时钟测试界面
上图是我们点击时钟后进入的子界面,界面中显示了日期、韶光、温度信息,并且在上
方区域,有一个指针式时钟显示。
同样,按下TPAD触摸按钮返回至主界面。
10、音乐播放
点击主界面的音乐播放图标,进入如图 27.5.17所示的界面:
图 27.5.17 音乐播放界面
上图是我们点击音乐播放后进入的子界面,界面中有三个按钮,分别是“-”、“打开”
和“-”按钮。首先点击“打开”按钮,启动音频播放的功能,然后利用音频线一端连接开拓
板上的LINE_IN接口,另一端与播放设备相连接(电脑或者手机的耳机接口),此时开拓板上
的喇叭会播放手机或者电脑播放的音乐,如果将耳机连接至开拓板上的PHONE接口,在耳机中
同样可以听到音乐。
11、ADDA
点击主界面的ADDA(模数/数模转换)图标,进入如图 27.5.18所示的界面:
图 27.5.18 ADDA测试界面
上图中,左侧的图片是我们点击ADDA后进入的子界面,板载的ADDA芯片同时具有模数和
数模转换的功能,点击“测试”按钮后,DA输出的数字量从0累加至255(如上图中右侧图片
所示),此时AD采集到的仿照电压值从0累加至约3.3V解释测试成功。
12、手写画笔
点击主界面的手写画笔图标,进入手写画笔的界面。通过在白板界面滑动手指可以看到
留下的轨迹,如图 27.5.19所示。
图 27.5.19 手写画笔测试界面
同样,按下TPAD触摸按钮返回至主界面。
13、摄像头
此运用支持的摄像头模块为ALIENTEK OV5640-AF这款500W像素的CMOS摄像头模块,在进
入摄像头运用之前,须要先将OV5640插在开拓板上的Camera扩展接口上(摄像头镜头方向朝
外),点击主界面的摄像头图标,进入图 27.5.20所示的界面:
图 27.5.20 摄像头采集画面
上图是我们点击摄像头后进入的子界面,接下来就可以从界面中看到摄像头采集到的画
面,按下TPAD触摸按钮返回至主界面。
14、网络通信
此运用可以读取开拓板的网口是否连接网线,点击主界面的网络通信图标,进入图
27.5.21所示界面。
图 27.5.21 以太网测试界面
上图是我们点击网络通信后进入的子界面,如果此时未连接网线的话,界面中会提示
“请连接网线!
”,如果已经连接了网线,界面中会提示“Check OK!
”。