FPGA点阵显示论文.docx
《FPGA点阵显示论文.docx》由会员分享,可在线阅读,更多相关《FPGA点阵显示论文.docx(9页珍藏版)》请在冰豆网上搜索。
FPGA点阵显示论文
桂林电子科技大学
点阵显示器
学院(系):
专业:
学号:
学生姓名:
指导教师:
摘要
主要研究基于VHDL的Led点阵数字滚动显示。
首先描述了基于现场可编程门阵(FPGA)的硬件电路,以及点阵显示数字的原理;然后在单个8X8LED发光二极管点阵上滚动数字的原理;最后给出了描述其功能的VHDL语言程序设计方法。
通过编程、调试、仿真、下载正确地实现了数字滚动显示扫描结果,其硬件系统的实验验证也获得了与软件模拟仿真结论相吻合的结果。
关键词:
LED点阵;FPGA;VHDL语言;数字滚动显示
Abstract
PrimaryresearchisbasedonVHDL,LedScrollingdotmatrixnumbers.Firstdescribedbasedonfieldprogrammablegatearray(FPGA)hardwarecircuit,aswellastheprinciplenumbersdotmatrixdisplay;andtheninasingle8X8LEDscrollingLEDdotmatrixontheprinciplesofnumbers;Finally,theVHDLdescriptionlanguageprogramofitsfunctionsdesign.Throughprogramming,debugging,simulation,downloadthecorrectcharacterscrollachievedscanresults,theexperimentalverificationofitshardwareandsoftwarearealsoobtainedfindingsconsistentwithsimulationresults.
Keywords:
LEDdot-matrix;FPGA;VHDLlanguage;numberscrollingdispla
目录
第一章前言
1.1本设计的研究背景和研究目的
受到体育场馆用LED显示屏需求快速增长的带动,近年来,中国LED显示屏应用逐步增多。
目前,LED已经广泛应用在银行、火车站、广告、体育场馆之中。
而随着世博会的临近,LED显示屏将广泛的应用在体育场馆以及道路交通指示中,LED显示屏在体育广场中的应用将出现快速增长。
目前,国内从事LED显示屏生产的企业众多,同时,受到外资企业LED显示屏价格过高的影响,在中国LED显示屏市场上多以本土企业为主。
目前,本土LED显示屏生产企业除供应国内需求外,还不断把产品出口到国外市场。
而近年来,受到成本压力的影响,国际上一些知名的LED显示屏企业也逐步把生产基地移到了中国,如巴可在北京设立了显示屏生产基地,Lighthouse在惠州也拥有生产基地,Daktronics、莱茵堡都在国内设立了生产工厂。
随着国际LED显示屏生产大厂不断把生产基地转移至国内,加之国内众多的LED显示屏本土企业,中国正在成为全球LED显示屏的主要生产基地。
因此研究LED数字滚动显示屏的设计方法具有重要的理论和现实意义。
随着我国经济的高速发展,对公共场合发布信息的需求日益增长,利用LED点阵滚动显示数字的出现正好适应了这一市场需求,已经成为信息传播的一种重要手段。
采用传统方法设计的数字滚动显示器,通常需要使用单片机、存储器和制约逻辑电路来进行PCB板级的系统集成。
尽管这种方案有单片机软件的支持较为灵活,但是由于受硬件资源的限制,未来对设计的变更和升级,总是难以避免要付出较多研发经费和较长投放市场周期的代价。
随着电子设计自动化(EDA)技术的进展,基于可编程FPGA器件进行系统芯片集成的新设计方法,也正在快速地到代基于PCB板的传统设计方式。
因此,本设计的研究是很有必要的,之所以基于FPGA设计是因为现场可编程门阵列(FPGA)设计周期小,灵活度高,适合用于小批量系统,提高系统的可靠性和集成度。
并且采用编写灵活的VHDL语言编写主程序。
1.2LED点阵显示特点
(1)可以显示各种数字、文字、图表、曲线、图形;
(2)采用纯红、高绿作双基色发光器件,发光亮度高,色彩鲜艳、丰富;
(3)显示效果清晰、稳定、功耗低、寿命长;
(4)优质铝合金结构,磨沙、银镜或钛金不锈钢包边。
尺寸和规格可根据需要灵活组合;
(5)支持各种计算机网络,编辑软件丰富、易用;
(6)适用于室内、外所有信息发布及广告宣传场所。
如:
银行、证券交易所、商场、市场、宾馆、洒楼、电信、邮政、医院、车站、机场等。
1.3FPGA设计的特点
FPGA通常被认为是ASIC实现的一种替代手段.一般ASIC包括三种,既全定制、半定制(含标准单元和门阵列)以及可编程器件。
对于前两种,需要支付不可重复使用的工程费用NRE(NonrecurringEngineering),主要用于芯片的流片、中测、分析的工程开销,一次费用一般在1万至数万美元以上。
如果一次不成功、返工、甚至多次返工,NRE费用将要上升。
成本高、风险大,而通常对每个ASIC品种的需求量往往不大,NRE费用分摊到每个产品上价太高,用户无法接受。
而对于可编程器件PLD(ProgrammableLogicDevice)正是可以解决上述问题的新型ASIC,PLD以其操作灵活、使用方便、开发迅速、投资风险小等突出优点,特别适合于产品开发初期、科研样品研制或小批量的产品.FPGA是一种新型的PLD,其除了具有PLD的优点外,其规模比一般的PLD的规模大。
目前,Xilinx推出的XC4025可以达到25000门的规模,Altera公司的FLEX10K100系列芯片可达到十万门的规模,完全可以满足用户的一般设计需要。
FPGA的主要特点是:
寄存器数目多,采用查找表计数,适合时序逻辑设计。
但是互连复杂,由于互连采用开关矩阵,因而使得延时估计往往不十分准确。
FPGA也有其自身的局限性,其一就是器件规模的限制,其二就是单元延迟比较大。
所以,在设计者选定某一FPGA器件后,要求设计者对器件的结构、性能作深入的了解,在体系结构设计时,就必须考虑到器件本身的结构及性能,尽可能使设计的结构满足器件本身的要求.这样就增加了设计的难度。
离开对FPGA结构的详细了解,设计人员就不可能优化设计。
因而设计人员必须了解FPGA器件的特性和限制,熟悉FPGA的结构。
在了解FPGA结构特点的基础上,就可以利用VHDL语言描写出高效的电路描述实现性能优化的电路。
第二章系统设计
2.1设计任务与要求
2.1.1设计任务
(1)设计一个8×8的LED点阵显示器;
(2)在设计过程中,EDA试验箱进行仿真调试。
2.1.2设计要求
(1)输出预定义“091222333”九个数字;
(2)输出数字循环显示;
(3)操作方便、可维护性高;
(4)程序简捷,便于修改。
2.2设计原理
2.2.1总体设计方案
方案一:
本设计所使用的8×8的点阵,EDA实验箱上有其接口电路,列选信号为SEL0,SEL1,SEL2,SEL3,经4线16线译码器输出16列,从左起为第一列,列选信号是由一个4位向量SEL[3..0]控制;行选信号为H0~H15,是由16个行信号组成的,每一行由一个单独的位来控制,高电平有效。
例如“0000”表示第0列,“00000001”表示第一行的点亮。
由于列是由一个向量决定,而每一时刻的值只能有一个固定的值,因而只能使某一列的若干个点亮,因此就决定了只能用逐列扫描的方法。
例如要使第一列的2,4,6,8,行亮,则列为“0001”、行为“10101010”就可以实现了。
方案二:
VHDL程序设计的是硬件,他和编程语言的最大区别是它可以“并发执行”。
本设计可以将LED显示屏要的显示内容抽象成一个二维数组(数组中的‘1’对映点阵显示屏上面的亮点),用VHDL语言设计一个进程将这个数组动态显示在LED显示屏上,再利用另一个进程对这个数组按一定频率进行数据更新,更新的方式可以有多种。
因为两个进程是同时进行的(并发执行),如果对数组中的数字数据按滚动的方式更新,则可实现数字的滚动显示。
如图2-1为该方案原理图。
图2-1方案二原理图
2.2.2方案的比较
方案一很容易实现,而且占用FPGA的资源较少。
但是由于其实现方式的局限性,该方案只能实现数字的滚动显示。
方案二中将LED点阵抽象成了一个二维数组。
可以设计一些比较复杂的算法来控制这个数组,使设计的系统不但可以滚动显示汉字,还可以扩展一些其它的显示效果。
但是方案二中对数组的处理部分对FPGA芯片的资源消耗太大。
所以最终选择方案一。
2.2.3点阵模块
数字显示的原理
数字0-9点阵显示代码的形成
如下图所示,假设显示数字“0”因此,形成的列代码为 00H,00H,3EH,41H,3EH,00H,00H;只要把这些代码分别送到相应的列线上面,即可实现“0”的数字显示。
送显示代码过程如下所示
先送列扫描码然后再送行扫描数据
00003E41413E0000
图2-2点阵显字
2.2.4程序调试
modulekk(out,sbit,res,clk);
outputreg[7:
0]out;
outputreg[7:
0]sbit;
inputres;
inputclk;
regclk1;
reg[9:
0]i;
reg[9:
0]state;
reg[29:
0]counter0;
reg[29:
0]counter1;
initialbegini=0;out=8'b0000_0000;sbit=8'b1111_1111;end
always@(posedgeclk)
begin
if(!
res)begincounter0=0;counter1=0;state=0;end
else
begin
if(counter0>=40000000)
begincounter0=0;state=state+1;if(state>=9)state=0;end
elsecounter0=counter0+1;
if(counter1>=10000)
begincounter1=0;clk1=~clk1;end
elsecounter1=counter1+1;
end
end
always@(posedgeclk1)
begin
casex(state)
0:
begini=i+1;if(i==1)beginout=8'b1111_1111;sbit=8'b1111_1110;end//0
if(i==2)beginout=8'b1100_0011;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1101_1011;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1101_1011;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1101_1011;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1101_1011;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1101_1011;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1100_0011;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
1:
begini=i+1;if(i==1)beginout=8'b1111_1111;sbit=8'b1111_1110;end//9
if(i==2)beginout=8'b1100_0011;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1101_1011;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1101_1011;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1100_0011;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1101_1111;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1101_1011;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1100_0011;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
2:
begini=i+1;if(i==1)beginout=8'b1111_1111;sbit=8'b1111_1110;end//1
if(i==2)beginout=8'b1110_0111;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1110_0011;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1110_0111;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1110_0111;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1110_0111;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1110_0111;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1100_0011;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
3:
begini=i+1;if(i==1)beginout=8'b1111_1111;sbit=8'b1111_1110;end//2
if(i==2)beginout=8'b1110_0001;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1110_1101;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1110_1111;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1110_0001;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1111_1101;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1110_1101;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1110_0001;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
4:
begini=i+1;if(i==1)beginout=8'b1110_0001;sbit=8'b1111_1110;end//2
if(i==2)beginout=8'b1110_1101;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1110_1111;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1110_0001;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1111_1101;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1110_1101;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1110_0001;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1111_1111;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
5:
begini=i+1;if(i==1)beginout=8'b1111_1111;sbit=8'b1111_1110;end//2
if(i==2)beginout=8'b1110_0001;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1110_1101;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1110_1111;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1110_0001;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1111_1101;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1110_1101;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1110_0001;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
6:
begini=i+1;if(i==1)beginout=8'b1111_1111;sbit=8'b1111_1110;end//3
if(i==2)beginout=8'b1100_1111;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1011_0111;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1011_1111;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1000_1111;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1011_1111;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1011_0111;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1100_1111;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
7:
begini=i+1;if(i==1)beginout=8'b1100_1111;sbit=8'b1111_1110;end//3
if(i==2)beginout=8'b1011_0111;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1011_1111;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1000_1111;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1011_1111;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1011_0111;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1100_1111;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1111_1111;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
8:
begini=i+1;if(i==1)beginout=8'b1111_1111;sbit=8'b1111_1110;end//3
if(i==2)beginout=8'b1100_1111;sbit=8'b1111_1101;end
if(i==3)beginout=8'b1011_0111;sbit=8'b1111_1011;end
if(i==4)beginout=8'b1011_1111;sbit=8'b1111_0111;end
if(i==5)beginout=8'b1000_1111;sbit=8'b1110_1111;end
if(i==6)beginout=8'b1011_1111;sbit=8'b1101_1111;end
if(i==7)beginout=8'b1011_0111;sbit=8'b1011_1111;end
if(i==8)beginout=8'b1100_1111;sbit=8'b0111_1111;end
if(i>=9)i=0;
end
default:
beginout=8'bz;sbit=8'bz;end
endcase
end
endmodule