您现在的位置:首页 >> 技术文章 >> FPGA技术 >> 内容

LED点阵显示屏的FPGA实现

时间:2017-5-5 2:52:55 点击:

  核心提示:LED点阵显示屏的FPGA实现...

    LED点阵显示屏被用到很多领域,随着电子技术的发展,LED点阵书写显示屏的广泛应用是一种趋势。传统的LED点阵显示是由微处理器实现的,但是以FPGA做控制器将成为发展趋势。FPGA的结构灵活,其逻辑单元、可编程内部连线和I/O单元都可以由用户编程,可以实现复杂逻辑功能,满足各种设计需求。其速度快,功耗低,通用性强,特别适用于大型系统的设计

本课题用FPGA做为控制器,来实现LED点阵书写显示屏的功能。设计一个基于32×32点阵LED模块的书写显示屏,当光笔触及LED点阵模块表面时,先由光笔检测触及位置处LED点的扫描微亮以获取其行列坐标,再依据功能需求决定该坐标处的LED是否点亮至人眼可见的显示状态在屏上实现点亮、划亮、反显、整屏擦除、笔画擦除、连写多字、对象拖移等书写显示功能。

1.1 课题研究背景

    LED点阵显示屏被用到很多领域,随着电子技术的发展,LED点阵书写显示屏的广泛应用是一种趋势。传统的LED点阵显示是由微处理器实现的,但是以FPGA做控制器将成为发展趋势。FPGA的结构灵活,其逻辑单元、可编程内部连线和I/O单元都可以由用户编程,可以实现复杂逻辑功能,满足各种设计需求。其速度快,功耗低,通用性强,特别适用于大型系统的设计。使用FPGA还可以实现动态配置、在线系统重构(可以在系统运行的不同时刻,按需要改变电路的功能,使系统具备多种空间相关或时间相关的任务)及硬件软化、软件硬化等功能。本作品用FPGA做为控制器,来实现LED点阵书写显示屏的功能。

1.2 本课题主要研究内容

设计任务:设计并制作一个基于32×32点阵LED模块的书写显示屏,其系统结构如图1所示。在控制器的管理下,LED点阵模块显示屏工作在人眼不易觉察的扫描微亮和人眼可见的显示点亮模式下;当光笔触及LED点阵模块表面时,先由光笔检测触及位置处LED点的扫描微亮以获取其行列坐标,再依据功能需求决定该坐标处的LED是否点亮至人眼可见的显示状态(如图1中光笔接触处的深色LED点已被点亮),从而在屏上实现点亮、划亮、反显、整屏擦除、笔画擦除、连写多字、对象拖移等书写显示功能。

1)在点亮功能下,当光笔接触屏上某点LED时,能即时点亮该点LED,并在控制器上同步显示该点LED的行列坐标值(左上角定为行列坐标原点)。

2)在划亮功能下,当光笔在屏上快速划过时,能同步点亮划过的各点LED,其速度要求2s内能划过并点亮40LED

3)在反显功能下,能对屏上显示的信息实现反相显示(即:字体笔画处不亮,无笔画处高亮)。

4)在整屏擦除功能下,能实现对屏上所显示信息的整屏擦除。

4.1 LED简介

从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。32*64的点阵共有2048个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,32*64的点阵需要256个锁存器。这个数字很庞大,而且成本很昂贵,我们仅仅是32*648个汉字点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。

动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如8)的同名列共用一套列驱动器。具体就32*64的点阵来说,把所有同一列的发光管的阴极连在一起,再去驱动这一列LED (共阳接法),每一列先送出对应第1行发光管对应的数据并锁存,再选通第1行使其点亮一定的时间,然后熄灭;再送出第2行的数据并锁存,再选通第2行使其点亮相同的时间,然后熄灭……8行之后,又重新点亮第1行,反复轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形了。

采用扫描方式进行显示时,每行有一个行驱动器,各行的同名列共用一个列驱动器。显示数据通常存储在单片机的程序存储器中,按8位一个字节的形式顺序排放。显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。从控制电路到列驱动器的数据传输可以采用并行方式或串行方式。采用并行方式时,32*64LED点阵有88*8的点阵,需要8*8=64个列数据输入口,而一个89C51只有32I/O接口,还要同时驱动行数据,根本不够用;并且从控制电路到列驱动器的线路数量大,相应的硬件数目多,由此可以得出,当列数很多时,并行传输的方案是不可取的。

采用串行传输的方法,控制电路可以只用2根线:数据线、时钟线。将行数据一位一位传往行驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给行驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两个部分。对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下,留给显示的时间就太少了,以致影响到LED的亮度。

解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。即在显示本行数据的同时,传送下一行的数据。为了达到重叠处理的目的,列数据的显示驱动电路就需要具有锁存功能。经过上述分析,可以归纳出列驱动器电路应具备的主要功能:对数据准备来说,它应能实现串入并出的移位功能;对数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打人并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。同时为了LED显示的亮度,采用8行扫描,每个汉字上面有216列驱动器驱动,列驱动器的位置应该是在第1行跟第9行,即每个16*16的汉字点阵是有48*8的点阵组成的阵列,扫描的时候同时扫描显示第1行跟第9行,第二次扫描的时候显示第2行跟第10行,以此类推,最后显示第8行跟第16行,如图所示:

     整个S1状态的设计代码如下所示:

·坐标计算模块:

               case(x[31:0])

               32'b00000000_00000000_00000000_00000001:xc<=0; //显示输入的值的地址

               32'b00000000_00000000_00000000_00000010:xc<=1;

               32'b00000000_00000000_00000000_00000100:xc<=2;

               32'b00000000_00000000_00000000_00001000:xc<=3;

               32'b00000000_00000000_00000000_00010000:xc<=4;

               32'b00000000_00000000_00000000_00100000:xc<=5;

               32'b00000000_00000000_00000000_01000000:xc<=6;

               32'b00000000_00000000_00000000_10000000:xc<=7;             

               32'b00000000_00000000_00000001_00000000:xc<=8;

               32'b00000000_00000000_00000010_00000000:xc<=9;

               32'b00000000_00000000_00000100_00000000:xc<=10;

               32'b00000000_00000000_00001000_00000000:xc<=11;

               32'b00000000_00000000_00010000_00000000:xc<=12;

               32'b00000000_00000000_00100000_00000000:xc<=13;

               32'b00000000_00000000_01000000_00000000:xc<=14;

               32'b00000000_00000000_10000000_00000000:xc<=15; 

               32'b00000000_00000001_00000000_00000000:xc<=16;

               32'b00000000_00000010_00000000_00000000:xc<=17;

               32'b00000000_00000100_00000000_00000000:xc<=18;

               32'b00000000_00001000_00000000_00000000:xc<=19;

               32'b00000000_00010000_00000000_00000000:xc<=20;

               32'b00000000_00100000_00000000_00000000:xc<=21;

               32'b00000000_01000000_00000000_00000000:xc<=22;

               32'b00000000_10000000_00000000_00000000:xc<=23;                                              

               32'b00000001_00000000_00000000_00000000:xc<=24;

               32'b00000010_00000000_00000000_00000000:xc<=25;

               32'b00000100_00000000_00000000_00000000:xc<=26;

               32'b00001000_00000000_00000000_00000000:xc<=27;

               32'b00010000_00000000_00000000_00000000:xc<=28;

               32'b00100000_00000000_00000000_00000000:xc<=29;

               32'b01000000_00000000_00000000_00000000:xc<=30;

               32'b10000000_00000000_00000000_00000000:xc<=31;                

               endcase

·亮灯模块

begin

          if(enable==1'b1)//控制点亮LED点阵。。。。。

          begin

               if(interrupt==1'b1)

               begin

               light<=1'b1;

               x_out<=x;

               end

          else begin

               light<= light;

               x_out<= x_out;           

               end           

          end

     else begin

          light<=1'b0;

          x_out<=33'd0;   

          end

     end      

·数码管坐标显示模块

begin

          if(enable==1'b1)//输出到数码管,用于数码管的显示

          begin

          LED_x<=xc;

          LED_y<=yc;

          end

     else begin

          LED_x<=8'd0;

          LED_y<=8'd0;

          end

     end     

 

 

Tags:LED点阵 
作者:LED点阵 来源:LED点阵
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做(www.hslogic.com) © 2018 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment