基于FPGA的LED点阵显示屏的设计

更新时间:2024-06-17 23:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

南昌航空大学学士学位论文

绪 论

1.1 研究意义

作为大型平板显示设备的一种,LED显示屏以其使用寿命长、维护费用低、功耗低等特点在显示领域占有重要的位置。特别在近年,带有红、绿、蓝三基色以及灰度显示效果的全彩LED显示屏,以其丰富多彩的显示效果而倍受业界关注,成为LED显示屏市场近年增长幅度比较大的产品。寿命、单位面积亮度、三基色的偏差程度、点距、对比度、灰度等级(包括灰度级数和线性度)、扫描频率等指标性能是衡量或横向比较大型显示设备好坏的标准。而这些指标性能的优劣,很大程度上决定于扫描控制器的性能。因此对大屏幕全彩LED显示扫描控制方法的研究有着重要的意义。

随着显示屏尺寸的扩大、亮度要求的增加,数据传输和控制的时间也会增加,如果仍然采用单片机作为控制器,将会影响显示效果,严重时可能无法正常工作,然而,这时若采用可编程逻辑器件作为控制器,则可解决这一难题。一方面,随着微电子技术的发展和生产工艺的提高,器件的性能大有很大的提高,出现了高性能的现场可编程逻辑器件(FPGA),FPGA具有处理速度高、可靠性高、高容量和集成度高等特点,在大屏幕显示系统设计中使用FPGA可以满足现在的LED大屏幕系统对于处理视频数据的高速要求,同时改善电路的性能,缩小系统的体积。设计中使用硬件描述语言进行电路设计,可以随时根据设计需要进行修改,而不必对硬件进行修改,它使系统的设计和调试非常方便,大大的缩短了产品的开发周期,降低了开发成本,也方便以后的系统升级。

1.2 研究现状

LED照明发展非常迅速,年增长率超过60%,随着LED发光效率的不断提升,封装技术不断改进,驱动陆能和寿命的增加,LED照明技术在未来5年内会逐渐进入千家万户。在世界各国环保议题日渐重视的趋势下,LED照明产业将扮演极重要的角色,其主要应用在于室内、室外照明以及街灯等高功率产品。据悉,2009年全球照明市场约1219亿美元,LED仅占0.5%,显见其未来潜力之可观。其中,以亚太地区的市场规模为最大、约占全球33.7%之比例,居次为北美的30.1%和欧洲之27.4%。以应用产品来讨论,户外照明约占12%,则具有相当大的成长空间,尤其以占有全球38%户外照明的中国市场为最。此外,值得关注的部分是受政府政策及推广影响较为直接且快速的街灯应用可望成为照明产业中快速成长的第一棒。预估在欧美优先领起的趋势中,2010年全球可达到450万盏LED街灯的水平,并且承于国际加紧节能减碳的脚

1

南昌航空大学学士学位论文

步,一但路灯标准规格普及,中国市场可望占有世界50%以上的规模。LED驱动器技术的发展体现在两个方面:第一,离线式高功率因数校正可调光LED驱动器可替代卤素灯、白炽灯和荧光灯;第二,LED驱动器能高效替代低压卤素灯。以上两种应用需要为LED提供电能及热能保护,以增加其耐用性。其他发展趋势还包括优化驱动器以提供最佳功效,并非将电流最大化。

基于FPGA芯片控制全彩LED大屏幕图像显示系统系统设计随着数字技术的飞速发展,各种数字显示屏也随即涌现出来有LED、LCD、DLP等,各种数字大屏幕的控制系统多种多样,有用ARM+FPGA脱机控制系统,也有用PC+DVI接口解码芯片+FPGA芯片联机控制系统。尽管大尺寸液晶显示在未来的几年还有相当大的市场份额,但针对大尺寸直下式背光源的驱动和控制芯片的开发才刚刚有几年的历史。针对LED背光源的特点,可以将复杂的控制技术和信号处理技术融合到背光源技术中,目前的做法是采用FPGA,各家均有不同的算法和控制方法。随着背光技术和数字电视技术的发展,背光的控制算法及驱动方法的规范化,为了降低成本,将背光控制单元、屏显控制和电视的机芯微处理器由一个微处理器统一实现将是一种技术趋势[13][14]。

目前,美国和中国台湾地区逻辑电路设计和制造厂家大都以Verilog HDL为主,中国大陆地区目前学习使用Verilog HDL已经超过VHDL。从使用的角度看,对于集成电路(ASIC)设计人员来说,多是掌握verilog,因为在IC设计领域,90%以上的公司都是采用verilog进行IC设计。而对于PLD/FPGA设计者而言,两种语言没有太大差别。

1.3 研究内容

本课题为基于Altera公司FPGA芯片的电子显示屏的研究,配备相应的PC机软件,可实现合拢、开帘、上下左右移动等显示形式,并可显示时钟。具体内容:1.FPGA系统设计;2.显示接口电路的设计;3.时钟接口电路的设计;4. FPGA系统与PC机通讯接口(RS232)的设计。

2

南昌航空大学学士学位论文

第二章 系统组成及工作原理

2.1 系统组成

本设计要求使用Altera公司的FPGA芯片完成32*16点阵式LED点阵显示屏的显示,配备相应的PC机软件,实现上位机与下位机的通信,下位机实现合拢、开帘、上下左右移动等显示形式,并可显示时钟。基于FPGA的LED点阵显示屏的系统 框图如图2-1所示:

上位机 串口时钟模块 通信 FPGA 控制系统 图2.1 系统总体框图 图2-1 系统总体框图

点阵显示模块 FPGA控制模块控制时钟模块、点阵显示模块、上位机通信模块的协同工作,并分析、处理接收的数据。

时钟模块完成对时钟芯片的读写,包括时钟初始化和时钟信息读取,最终用数码管显示时钟。

点阵显示模块实现LED点阵的驱动和显示功能。驱动部分使用移位寄存器74HC595和移位寄存器 74HC164 组成,74HC595 负责列扫描数据,74HC164 负责行扫描数据。行扫描采用三极管放大电流,加大扫描强度,提高点阵屏亮度。LED点阵是由8个大小为 32mm*32mm 的 8*8 共阳点阵组成32*16 点阵,可以显示两个汉字,点阵屏可拆装,采用圆孔铜排针,连接性能非常好。串口通信部分通过RS232串口实现。用户可以通过上位机软件发送待显示的数据给FPGA控制系统。

2.2 工作原理

本设计的工作原理为:采用FPGA为核心控制模块,通过接收上位机数据控制LED点阵显示信息。同时通过键盘来控制显示方式,并且在数码管上显示实时时钟。软件部分根据各芯片的时序图进行模块编程,消除了竞争和冒险。

3

南昌航空大学学士学位论文

第三章 基于FPGA的LED点阵硬件设计

3.1 方案论证与比较

3.1.1 FPGA芯片选择

当今主要设计和生产厂家有Xilinx、Altera、Lattice、Atmel等公司。其中Xilinx、Altera规模最大,市场占有率也最高。其中Altera更适合教学使用,对于初学者来说入门门槛比较低。同时,Altera公司给学习者提供很好的服务和支持。工艺方面,Xilinx和Altera生产的FPGA都是基于SRAM的工艺的,需要在使用时外接一个片外存储以保存程序。上电时,FPGA将外部存储器中的数据读入片内RAM,完成配置后,进入工作状态;掉电后恢复为白片,内部逻辑消失。这样不仅能反复使用,还无需专门的FPGA编程器,只需通用的EPROM、PROM编程器即可。本设计采用较为普遍的Altera公司的EP2C8Q208C芯片。这块芯片不仅内部资源丰富,而且支持NIOS,无论在性价比还是将来进行功能拓展上都占据优势。 3.1.2 串行通信模块

输入接口模块提供PC上位机到FPGA核心板传输数据的接口。输入接口是通过串口即RS232以及JTAG下载线来实现从PC上位机传输数据至下位机。上位机使用字模提取工具将待显示的数据发送至下位机, JTAG下载线实现PC和NiosⅡ系统间的通信。FPGA核心板与LED显示模块之间的通信也是通过RS232串口实现的。 3.1.3 LED点阵屏及驱动电路

本设计采用32×16LED点阵屏由8块8×8LED点阵拼接而成,每一块点阵都有8行8 列,因此总共有16根行控制线和32根列控制线。

方案一:在LED点阵驱动电路中,采用1片4线/16线译码器74HC154作为行驱动,选用2片74HC154占用15个FPGA的I/O口(包括两个enable端)。

方案二:使用两个移位寄存器74HC595(带存储器) 和两个移位寄存器 74HC164 驱动16*16的点阵,74HC595 负责列扫描数据,74HC164 负责行扫描数据。行扫描采用三极管放大电流,加大扫描强度,提高点阵屏亮度。最终只需要制作两块同样的板子拼凑成32*16LED点阵。

方案比较及确定:

首先,考虑占用I/O口数量,方案一使用了15个I/O口,而方案二只使用了5个。 其次,考虑制作成本,一片74HC154大约四元,而74HC595和74HC164只需0.7元。 再次,考虑软件编程,采用译码方式(方案一)驱动可以简化代码,而采用移位

4

南昌航空大学学士学位论文

方式(方案二)驱动可拓展性更强。

最后,考虑功耗,两种方案使用的是coms芯片功耗已经非常小。

综合以上分析,本设计采用方案二,不仅大大的减少了I/O资源的占用,而且缩减了制作成本。

3.1.4时钟芯片

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM。同时,可以提供秒分时、日期、年月信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM指示决定采用24或12小时格式。

3.2 FPGA控制模块

该部分电路是系统控制和数据处理的核心,主要由电源接口及开关及相应的时钟振荡电路和复位电路组成。 3.2.1 电源接口及开关电路

图 3-1 电源接口及开关电路

如图3-1所示,其中F1为限流1.1A的F110保险管,在电源的保护上起到了很大的作用。 3.2.2 复位电路

如图3-2所示,该复位电路可以实现对系统的初始化作用。当没有按下时,KEY读取到高电平。按下键时,KEY拉低。一次复位后产生一脉冲信号,下降沿时触发芯片复位。

5

南昌航空大学学士学位论文

图3-12 DS1302有关日历、时间的寄存器

小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。

秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。

控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。

(2)DS1302有关RAM的地址

DS1302中附加31字节静态RAM的地址如图3-13所示。

图3-13 静态RAM

2.读写时序说明

DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

11

南昌航空大学学士学位论文

要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如图3-14。

图3-14 控制字(即地址及命令字节)

控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据; 位5至位1(A4~A0):指示操作单元的地址;

位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图3-15所示。

图3-15 数据读写时序

图3-15 数据读写时序

12

南昌航空大学学士学位论文

3 .RTC时钟电路

3.5.2时钟显示电路

本设计主要采用六位独立的数码管分别显示时钟。电路如图3-16所示。数码管可分为共阳和共阴。本设计采用共阳数码管。每一个数码管通过一个9012三极管放大电流。9012为PNP型三极管,当SEL端出现低电平时,数码管被选通。反之,当SEL拉高时,数码管不显示。

图3-17 数码管显示

图3-16 时钟电路

13

南昌航空大学学士学位论文

第四章 基于FPGA的LED点阵显示的软件设计

4.1 Verilog HDL编程语言及编译器概述

4.1.1 Verilog HDL语言综述

FPGA的编程语言常用的有二种,一种是VHDL,一种是Verilog HDL。

Verilog HDL是一种非常容易掌握的硬件描述语言,而VHDL语言是一个规模庞大的语言,在使用它之前完全学会它是很难的。Verilog是专门为复杂数字系统的设计仿真而开发的,本身就非常适合复杂数字逻辑电路和系统的仿真和综合。由于Verilog在其门级描述的底层,也就是在晶体管开关的描述方面比VHDL有更强的功能,所以,即使是VHDL的设计环境,在底层实质上也是由Verilog HDL描述的器件库所支持的[1]。Verilog适合系统级(system)、算法级(alogrithem)、寄存器传输级(RTL)、逻辑级(logic)、门级(gata)、电路开关级(switch)设计,而SystemVerilog 是Verilog语言的扩展和延伸,更适用于可重用的可综合IP和可重用的验证用IP设计,以及特大型(千万门级以上)基于IP的系统级设计和验证。

Verilog HDL作为一种高级的硬件描述编程语言,与C语言的风格有许多类似之处。其中有许多语句,如if语句、case语句和C语言中的对应语句十分相似。

4.1.2 Quartus II 软件综述

Altera公司的Quartus II设计软件提供了完整的多平台设计环境,能够直接满足特定设计需要,为可编程芯片系统(SOPC)提供全面的设计环境。Quartus II软件含有FPGA和CPLD设计所有阶段的解决方案,如图4-1所示。

图4-1 Quartus II设计流程

14

南昌航空大学学士学位论文

Quartus II设计工具支持基于VHDL、Verilog HDL和图形的设计,其内部嵌有VHDL、Verilog HDL逻辑综合器。Quartus II 可以利用第三方的综合工具进行逻辑综合,也可以利用第三方的仿真工具(如Modelsim)进行仿真。此外Quartus II与MATLAB和DSP Builder 结合,可以进行基于FPGA的DSP系统开发。使用Quartus II内嵌的SOPC Builder,配合Nios II IDE集成开发环境,可以开发Nios II嵌入式软核处理器[2]。

4.1.3 ModelSim 仿真软件综述

ModelSim由Mentor Graphics 公司的子公司Model Tech公司开发,是业界最优秀的HDL语言仿真器。它提供最友好的调试环境,是唯一的单内核支持VHDL和Verilog混合仿真的仿真器,是进行FPGA/SOPC设计的RTL级和门级电路仿真的首选。ModelSim最大的特点是其强大的调试功能,先进的数据流窗口,可以迅速地追踪到产生不定或者错误状态的原因;性能分析工具帮助分析性能瓶颈,加速仿真;代码覆盖率检查确保测试的完备;多种模式的波形比较功能;可以实现与Matlab的Simulink的联合仿真。

4.2 系统软件总体结构

图4-2 系统软件总体模块结构

15

南昌航空大学学士学位论文

4.3 LED点阵显示模块

4.3.1 LED点阵显示驱动

LED点阵显示模块完成对行扫描和列选择。将16位的行数据移位进入74HC164的寄存器中,将32位的列数据移位进入74HC595中。当完成一行的扫描输出一个脉冲信号isdone。由于人眼暂留时间,只有当画面刷新频率大于50Hz时才不会出现闪烁现象。更新行数据最大周期Tmax=1/50/16=1.25ms。程序中利用计数器cnt作为行移位标志,当计数器计数到19999时移位一次,T=(19999+1)/20000000=1ms,(系统使用20MHz晶振),所以本设计刷新周期为1ms。

以下代码为LED显示模块的端口例化程序: module displ_led(

input clk, input rst,

input [15:0] row_data,

input [31:0] data, output rclk, output sclk, output ser, output AB, output s_clk, output isdone );

AB,s_clk用于驱动74HC164;ser,sclk,rclk用于驱动74HC595。当输入 data=32'h55_55_F0_0A、row_data=16'b1111_1111_1111_1110时功能仿真波形如图4-3所示,相隔8个时钟周期ser更新一次数据,并且sclk产生一脉冲将列数据移位一次。移完所有32位数据时,rclk产生一脉冲信号将列数据锁存。同时isdone产生一脉冲用于与其他模块进行交互。

图4-3 点阵显示驱动仿真波形

16

南昌航空大学学士学位论文

4.3.2 行数据控制模块

行数据控制模块主要实现控制显示的上下移位功能。以下程序为此模块的例化程序:

module row_control(

input clk, input rst, input key_up,

input key_down,

);

input key_stop, output [15:0] row_data

其中,key_up表示上键标志信号,key_down表示下键标志信号,key_stop为停止移位标志信号,row_data为行数据输出。静态显示时,只要进行逐行扫描,第i位出现‘0’时,则选通第i行。所以当按下停止键时,则直接输出16'b1111_1111_1111_1110。当有其他键按下时则触发移位。移位时,首先启动计数器,当每计满9,999,999(即0.5s)时,行数据移位一次。如图4-4所示,仿真key_up键按下时,row_data每0.5s循环右移一次。

4.3.3 列数据控制模块

列数据控制模块主要实现左右移动、开帘、合拢四种显示方式的控制。 以下为模块的例化程序: module column_control(

input clk, input rst,

图4-4 行数据控制仿真波形

17

南昌航空大学学士学位论文

input key_left, input key_right, input key_stop, input [31:0] rdata, output [31:0] data );

其中,key_left表示左键标志信号,key_right表示右键标志信号,key_stop为停止移位标志信号,在没有读取到按键时显示方式为循环开帘和合拢。rdata为原列数据,data为移动后的列数据。移位速度为1/20s,如图4-5所示,当key_left键按下时,rdata=32'h05_05_A0_A0,每0.05s循环移位一次。

图4-5 列数据左移仿真波形

4.4 按键模块

一位按键模块debounce如图4-6所示,模块包括电平检查模块和延迟模块。

设计思路:

(1)一旦检测到有按键按下(高电平到低电平变化),电平检查模块就会拉高 H2L_Sig电平,然后拉低。

(2)10ms延迟模块检测到H2L_Sig为高电平时,就会利用10ms过滤H2L_Sig,拉高 输出。

(3)当按键被释放时,电平检测模块会拉高L2H_Sig,然后拉低。

图4-6 一位按键模块

18

南昌航空大学学士学位论文

(4)10ms延迟模块检查到L2H_Sig为高电平时,就会利用10ms过滤H2L_Sig,然后拉低输出。

组合按键则是组合五个独立按键模块,如图4-7所示。

以下为五位组合按键模块的实例化程序: module key_interface (

input CLK,

input RSTn,

图4-7 组合按键模块

input [4:0]Key_In, );

其中,五位Key_In输入连接至I/O端口,五位Key_Out主要传输给行列控制模块。

output [4:0]Key_Out

19

南昌航空大学学士学位论文

4.5 串口通信模块

4.5.1 串口接收模块

如图4-8所示,串口接收模块由电平检测模块、波特率定时模块和接收控制模块组成。

图4-8 串口接收模块

其中,detect_module模块的输入是连接至引脚rx,它主要检测一帧数据的第0位,也就是起始位,然后产生一个高脉冲经 H2L_Sig 给 rx_control_module模块 ,以表示一帧数据接收工作已经开始。

rx_bps_module模块是产生波特率定时的功能模块。它是配置波特率的模块。 当rx_control_module模块拉高Count_Sig, bps_module模块经BPS_CLK对rx_control_module模块产生定时。本设计使用9600bps传输速率。传输一位数据的周期是 0.000104166666666667s 。以20Mhz时钟频率要得到上述的定时需要设置的计数次数N:

N = 0.000104166666666667 / ( 1 / 20Mhz ) = 2083

如果从零开始算起 2083 - 1 亦即 2082 个计数。然而,采集数据要求“在周期的中间”,那么结果是 2082 / 2 ,结果等于 1041。基本上 rx_bps_module模块只有在 Count_Sig拉高的时候,模块才会开始计数。

rx_control_module模块是核心控制模块。针对串口的配置主要是1帧11位的数据,重视八位数据位,无视起始位、校验位和结束位。当RX_En_Sig拉高,这个模块就开始工作,它将采集来自RX_Pin_In的数据,当完成一帧数据接收的时候,就会产生一个高脉冲给 RX_Done_Sig。

20

南昌航空大学学士学位论文

data[23:0] data[23:20] data[19:16] data[15:12] 位代表(从左边数起) 第一位 数字 | 数码管 第二位 数字 | 数码管 第三位 数字 | 数码管 data[11:8] data[7:4] data[3:0]

第四位 数字 | 数码管 第五位 数字 | 数码管 第六位 数字 | 数码管

表4-2 data分配表

26

南昌航空大学学士学位论文

第五章 调试及结果分析

5.1 硬件调试及结果分析

调试过程主要分为以下几个步骤:

第一步,首先在硬件电路没有上电的情况下,检查PCB板线路是否无误。对照硬件电路原理图,PCB板图,用万用表的蜂鸣档检查每条线路是否都导通。检查+5V、-5V的电源线是否全部连接好,电源和地是否有短路,每个芯片插座的电源端是否都连接在一起,每个芯片插座的地端是否都连接在一起。通过细致的检查,发现有些过孔和元件引脚有虚焊的现象,用烙铁重新焊接,再用万用表的蜂鸣档从连通的起始端每个触点逐个检查,确保线路连通,发现问题则相应地进行解决。要注意的是,电源和地一定不能短路。若短路,应仔细检查线路,并作相应改动。

第二步,检测LED点阵好坏。将万用表调至蜂鸣档,对照点阵的原理图红笔连正极,黑笔接负极,观察是否有相应坐标的LED点亮。

第三步,断开电源线,把所有芯片全部插到芯片插槽中,接通电源,用手触摸每块芯片,看是否发烫。结果没有芯片发烫或烧坏,说明电路供电正常。

5.2 系统软硬件联调

第一步:连接好LED点阵模块,将驱动点阵显示“好”字的程序下载到FPGA中,运行程序。发现显示微弱,而且是乱码,使用示波器分别测量74HC164和74HC595的时钟端,发现波形与理想波形产生偏差,重新计算后修改程序再测量时得到正确波形,但是仍然不显示。将电路板换成单片机控制来驱动发现可以正常显示,所以排除电路问题。通过翻阅资料比较单片机与FPGA的不同之处,则考虑到I/O口类型不同,高低电压值存在差别,于是在74HC164的数据输入端与地之间接上一个104电容后,正常显示“好”字。

第二步:将串口接收模块下载到FPGA中,运行程序。 通过串口小助手发送数据,在一位数码管上显示数据,说明串口接收模块正常工作。

第三步:将LED点阵显示加上串口接收模块的程序下载到FPGA中,通过串口小助手发送的十六进制的数据在LED点阵屏上正常显示。

第四步: 将按键控制led灯点亮的程序下载到FPGA中,运行程序。通过按键可以控制led灯的亮和灭,说明按键模块正确。

第五步:将按键控制点阵显示方式的程序下载到FPGA中,运行程序。同过按键可以改变显示方式。上、下、左、右键分别控制向上、下、左、右移动,说明移位程

27

南昌航空大学学士学位论文

序正确。

第六步:将数码管显示程序下载到FPGA中,发现数码管六位显示数据,但是显示都是七段数码管全部点亮,而且闪烁感强烈。发现计数值错误,修改后能正常显示且无闪烁。

第七步:将时钟显示程序下载到FPGA中,发现数码管六位显示数据正常,但是显示数据错位,推断为程序中接口部分程序错误,检查后发现错误,修改后能正常显示时分秒数据并不断更新。

第八步:组合所有程序下载到FPGA中,运行程序后。系统成功显示。 软硬件调试均成功,基本完成本次设计课题。其具体电路如图5.1所示:

图5-1 实物硬件图

其中,左下边一块是时钟显示模块电路与核心板,右边两块LED点阵屏。

28

南昌航空大学学士学位论文

总结与体会

这次毕业设计从原理图设计,PCB板图的设计,总体电路的完成,到最后的软件硬件的联调。虽然出现了一些问题,但经过老师的悉心指导和同学们的帮助,并结合学过的理论知识,将出现的问题一一解决。毕业设计的实践性很强,通过毕业设计,使得我们对专业课程的理论认识上升到实践阶段,提高了我们的动手能力与综合所学知识并应用到实践的能力。一个学期的毕设,有成功,有失败。成功激励着我们不断前进,而失败使我们获得宝贵的经验,这些经验不经过实践是无法得到的。这次毕业设计最大的收获就是能够学以致用,理论与实践相结合,并能根据实践加深对理论的理解,提高了自己发现问题、分析问题、解决问题的能力,获益匪浅。

本次设计采用FPGA作为控制核心,虽然在实现功能上是可以通过单片机来实现,但是面对将来复杂的应用时,单片机不仅I/O数量上少,而且处理速度上远不如FPGA。本次毕设只是起到抛砖引玉的作用。

经过近四个月的努力,从方案的设计之初查阅各种文献资料,绘制原理图,绘制PCB板图,焊接电路板,对电路板进行检查,硬件电路的调试,到最后的整体软硬件调试的成功,失败教训与成功的喜悦,一个问题几天的冥思苦想与解决问题后的释怀,这些经历在很大程度上提高了我们综合分析问题、解决问题的能力。在这次课题的完成过程中,不仅加深了对已学专业理论知识的理解,而且还学到了许多新知识,拓展了知识面,大大地提高了动手、分析问题能力和解决问题的能力。这使我们具备了一定的将理论转化为实际的能力,对以后走向社会工作岗位是大有裨益的。

29

南昌航空大学学士学位论文

参考文献

[1].王蓉,刘玉玲,余飞鸿.LED光源照明微投影仪系统设计[J].光学仪器,2006 ,28 (2):22.

[2].王勇.彩色显像管对比度测试标准[J].真空电子技术,2004,3:43.

[3].(美)K.科夫曼著;沈树群,张艳,吴京松译.基于Verilog 语言的实用FPGA 设计[M] 科学出版社,2004

[4].刘永军.单片机控制LED点阵显示原理及Proteus仿真[J].北京:电脑知识与技 术,2010.27

[5].徐志军,徐光辉.CPLD/FPGA的开发与应用[M].北京:电子工业出版社,2002. [6].潘松、黄继业编.EDA技术实用教程[M].北京:科学出版社,2006年版。

[7].梁志明.基于FPGA的大屏幕全彩LED扫描控制器设计[J].北京:液晶与显示 2008,4

[8].罗中华.LED信息显示屏系统的设计[D].南昌:南昌大学硕士论文,2008

[9].张建军,陈钟荣.基于可编程逻辑器件的LED显示屏控制系统设计[J].北京:液晶与显示,2006,21(4)

[10].夏宇闻.Verilog数字系统设计教程[M].北京:北京航空航天大学出版社,2009 [11].何立民.单片机应用系统设计[M].北京:北京航空航天大学出版社,1990. [12].任晓东.CPLD/FPGA高级应用开发指南[M].北京:电子工业出版社,2003. [13].郑喜凤,尹柱霞,严飞.LED显示控制系统中SDRAM 控制器的设计[J].液晶与显示,2009 ,24 (3) :4232428.

[14].张齐,郑金辉,李登红,等.基于FPGA的LED显示屏逐点检测系统的设计与实现[J]. 液晶与显示,2008,23(5):6052610.

[15].郝亚茹,王瑞光,陈宇,等.基于高效动态内存的LED显示系统设计[J].液晶与显示,2008,23(5):5822587.

30

南昌航空大学学士学位论文

致 谢

在本课题的整个设计制作过程中,得到了许多老师和同学的帮助,借此机会向他们表示诚挚的谢意。

首先感谢离去的徐精华老师。在大半个学期里,徐老师带着病痛坚持每周找学生交流,耐心地指导我们,细心地帮助我们度过每一个问题。但是,无情的病魔将我们和蔼可亲的徐老师带到了另一个世界。虽然,徐老师的离去使我的心情低落了一段时间,但是他的那份执着的精神,认真的工作态度可能影响我一辈子。逝者安息,生者奋进,徐老师的教诲学生铭记在心。

同时,感谢邹琼老师。在设计过程中,邹老师给予我宝贵的建议,帮助对本设计的原理,PCB走线方面以及电路的调试方法的认真指导,保证了本设计的设计及制作过程顺利完成。从邹老师那里学到的不仅仅是学术方面的知识,更重要的是严谨的治学态度,科学的分析问题、解决问题的思维方法。

感谢信息工程学院的各位老师,正是因为他们一丝不苟、任劳任怨的教学态度,对学生的严格要求,我们才能具有扎实的基本功来进行本次毕业设计。

还要感谢老师们为我们的毕业设计提供了良好的设计环境和仪器设备。有了这些,我们才能够高效率的完成本次设计。

最后,在我即将毕业之际对南昌航空大学信息工程学院所有老师表示深深的谢意,在您们的指导下我学到了许多理论知识,并在实践性环节中不断提升自己的动手能力,形成了良好的分析问题、解决问题的能力,衷心感谢你们!

31

南昌航空大学学士学位论文

附 录 附录A:原理图

32

南昌航空大学学士学位论文

33

南昌航空大学学士学位论文

附录B:

FPGA I/O口分配表

34

南昌航空大学学士学位论文

附录C:代码

主模块

Dianzheng.v

module dianzheng( input CLK, input RSTn, input RX_Pin_In, output AB, output s_clk, output ser, output sclk, output rclk, input [4:0] Key_In, output rst, output [7:0] smg_data, output [5:0] scan, output sclk_rtc, inout SIO ); wire isdone;

wire [31:0] rdata; rx_tx_interface u0 (

.CLK(CLK), .RSTn(RSTn), .RX_Pin_In(RX_Pin_In), .write_data(rdata[31:16]), .isdone(isdone) );

du_read u1( .CLK(CLK), .RSTn(RSTn), .du_data(rdata[15:0]), .isdone(isdone) ); wire [4:0] Key_Out; key_interface u2( .CLK(CLK), .RSTn(RSTn), .Key_In(Key_In), .Key_Out(Key_Out) ); wire [31:0] data; column_control u3( .clk(CLK), .rst(RSTn), .key_left(Key_Out[2]), .key_right(Key_Out[1]), .key_stop(Key_Out[0]), .rdata(rdata), .data(data) ); wire [15:0] row_data; row_control u4( .clk(CLK), .rst(RSTn),

35

南昌航空大学学士学位论文

.key_up(Key_Out[4]), .key_down(Key_Out[3]), .key_stop(Key_Out[0]), .row_data(row_data) ); displ_led u5( .clk(CLK), .rst(RSTn), .row_data(row_data), .data(data), .rclk(rclk), .sclk(sclk), .ser(ser), .AB(AB), .s_clk(s_clk), .isdone(isdone) ); rtc_smg u6( .CLK(CLK), .RSTn(RSTn), .scan(scan), .smg_data(smg_data), .rst(rst), .sclk(sclk_rtc), .SIO(SIO) ); Endmodule

串口接收模块例化模块 rx_tx_interface.v

module rx_tx_interface (

input CLK, input RSTn, input RX_Pin_In, output [15:0] write_data, input isdone );

/******************************/ wire [7:0]FIFO_Read_Data; wire Empty_Sig; rx_interface U1 ( .CLK( CLK ), .RSTn( RSTn ), .RX_Pin_In( RX_Pin_In ), // input - from top .Read_Req_Sig( Read_Req_Sig ), // input - from U2 .FIFO_Read_Data( FIFO_Read_Data ), // output - to U2 .Empty_Sig( Empty_Sig ) // output - to U2 ); /******************************/

36

南昌航空大学学士学位论文

wire Read_Req_Sig; wire [7:0]FIFO_Write_Data; inter_control_module U2 ( .CLK( CLK ), .RSTn( RSTn ), .Empty_Sig( Empty_Sig ), // input - from U1 .FIFO_Read_Data( FIFO_Read_Data ), // input - from U1 .Read_Req_Sig( Read_Req_Sig ), // output - to U1 .FIFO_Write_Data( FIFO_Write_Data )// output - ); /******************************/ displ U3( .CLK(CLK), .RSTn(RSTn), .FIFO_Write_Data( FIFO_Write_Data ), .write_data(write_data), .isdone(isdone) ); /******************************/

Endmodule

串口接收检测模块 detect_module.v

module detect_module (

CLK, RSTn, RX_Pin_In, H2L_Sig );

input CLK; input RSTn; input RX_Pin_In; output H2L_Sig; /******************************/ reg H2L_F1; reg H2L_F2; always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) begin H2L_F1 <= 1'b1; H2L_F2 <= 1'b1; end else begin H2L_F1 <= RX_Pin_In; H2L_F2 <= H2L_F1; end

37

南昌航空大学学士学位论文

/***************************************/ assign H2L_Sig = H2L_F2 & !H2L_F1; /***************************************/

Endmodule

波特率发生模块 rx_bps_module.v

module rx_bps_module (

CLK, RSTn, Count_Sig, BPS_CLK );

input CLK; input RSTn; input Count_Sig; output BPS_CLK; /***************************/ reg [11:0]Count_BPS; always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) Count_BPS <= 12'd0; else if( Count_BPS == 12'd2082 ) Count_BPS <= 12'd0; else if( Count_Sig ) Count_BPS <= Count_BPS + 1'b1; else Count_BPS <= 12'd0; /********************************/

assign BPS_CLK = ( Count_BPS == 12'd1041 ) ? 1'b1 : 1'b0;

/*********************************/

Endmodule

串口接收控制模块 rx_control_module.v

module rx_control_module (

CLK, RSTn, H2L_Sig, RX_Pin_In, BPS_CLK, RX_En_Sig, Count_Sig, RX_Data, RX_Done_Sig );

input CLK; input RSTn;

38

南昌航空大学学士学位论文

input H2L_Sig; input RX_En_Sig; input RX_Pin_In; input BPS_CLK; output Count_Sig; output [7:0]RX_Data; output RX_Done_Sig; /********************************************************/ reg [3:0]i; reg [7:0]rData; reg isCount; reg isDone; always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) begin i <= 4'd0; rData <= 8'd0; isCount <= 1'b0; isDone <= 1'b0; end else if( RX_En_Sig ) case ( i ) 4'd0 : if( H2L_Sig ) begin i <= i + 1'b1; isCount <= 1'b1; end 4'd1 : if( BPS_CLK ) begin i <= i + 1'b1; end 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8, 4'd9 : if( BPS_CLK ) begin i <= i + 1'b1; rData[ i - 2 ] <= RX_Pin_In; end 4'd10 : if( BPS_CLK ) begin i <= i + 1'b1; end 4'd11 : if( BPS_CLK ) begin i <= i + 1'b1; end 4'd12 : begin i <= i + 1'b1; isDone <= 1'b1; isCount <= 1'b0; end 4'd13 : begin i <= 1'b0; isDone <= 1'b0; end endcase

/********************************************************/ assign Count_Sig = isCount; assign RX_Data = rData; assign RX_Done_Sig = isDone;

39

南昌航空大学学士学位论文

/*********************************************************/

Endmodule

串口接收模块顶层控制模块 rx_top_control_module.v module rx_top_control_module (

input CLK, input RSTn, input RX_Done_Sig, input [7:0]RX_Data, output RX_En_Sig, input Full_Sig, output Write_Req_Sig, output [7:0]FIFO_Write_Data );

/*************************************/ reg [1:0]i; reg isWrite; reg isRX; always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) begin i <= 2'd0; isWrite <= 1'b0; isRX <= 1'b0; end else case( i ) 0: if( RX_Done_Sig ) begin isRX <= 1'b0; i <= i + 1'b1; end else isRX <= 1'b1; 1: if( !Full_Sig ) i <= i + 1'b1; 2: begin isWrite <= 1'b1; i <= i + 1'b1; end 3: begin isWrite <= 1'b0; i <= 2'd0; end endcase

/*************************************/ assign RX_En_Sig = isRX; assign Write_Req_Sig = isWrite; assign FIFO_Write_Data = RX_Data; /*************************************/

40

本文来源:https://www.bwwdw.com/article/qhn3.html

Top