基于FPGA的数码管驱动设计(静态显示)

1.项目介绍

  学习LED数码管的工作原理和编程方法,掌握LED数码管的设计应用。

2.设计要求

  利用LED数码管,在数码管上显示0-F字样。系统框图如下图所示。其中,data_in[3:0]为按键输入,seg_n[7:0]为数码管的段选端,sel_n[7:0]为数码管的位选端。

3.实验原理

(1)什么是数码管

  数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。它是由8个发光二极管构成,并按照一定的图形及排列封转在一起的显示器件。因为发光二极管的电流是3mA-10mA,故需添加限流电阻。数码管引脚如下图所示

  上图两个com引脚实际是连在一起的,其他引脚的公共端,称为位选,位选的高低电平决定改数码管能否点亮,其他管脚为段选信号,决定数码管上哪个二极管发光。

(2)数码管基本构造

  数码管连接方式不同分为共阴极数码管和共阳极数码管。共阴极就是7段的显示字码共用一个电源的负极,是高电平点亮,共阳极就是7段的显示字码共用一个电源的正极,是低电平点亮。只要控制其中各段LED的亮灭即可显示相应的数字、字母或符号。

  共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已,共阴为所有的LED负极接在一起,共阳为为所有的LED正极接在一起。如下图为1位数码管的共阴极和共阳极原理图:

(3)数码管显示原理

  要是数码管显示数字,有两个条件:1.是要在公共端加合适的电源(一般每颗LED还需串上合适的电阻,起限流作用);2.要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。这样才能显示的。

例如下图的共阳极数码管,须在公共端接上VCC,(a,b,c,d,e,f,g,dp)端接到控制器的引脚上;如果要使其中一个LED亮时,对应的控制器引脚输出低电平,即可点亮LED等。

(4)数码管驱动方式

根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。

  1)静态驱动也称直流驱动,静态驱动是指每个数码管的每一个段码都由一个I/O端口进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多。如驱动5个数码管静态显示则需要5×8=40根I/O口来驱动,要知道一个89S51单片机可用的I/O口才32个呢。故实际应用时必须增加驱动器进行驱动,增加了硬体电路的复杂性。

  2)动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp "的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。-当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

  通过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且功耗更低。

4. 设计实现

  1 module tube_static_v1(
  2     input     wire        [3:0]        data_in,
  3     output     reg        [7:0]        seg_n,
  4     output     wire        [7:0]        sel_n
  5 );
  6     
  7     parameter       NUM0 = 8'b1100_0000,
  8                     NUM1 = 8'b1111_1001,    
  9                     NUM2 = 8'b1010_0100,    
 10                     NUM3 = 8'b1011_0000,    
 11                     NUM4 = 8'b1001_1001,    
 12                     NUM5 = 8'b1001_0010,    
 13                     NUM6 = 8'b1000_0010,    
 14                     NUM7 = 8'b1111_1000,    
 15                     NUM8 = 8'b1000_0000,    
 16                     NUM9 = 8'b1001_0000,
 17                     NUMA = 8'b1000_1000,
 18                     NUMB = 8'b1000_0011,
 19                     NUMC = 8'b1100_0110,
 20                     NUMD = 8'b1010_0001,
 21                     NUME = 8'b1000_0110,
 22                     NUMF = 8'b1000_1110;
 23     
 24     assign sel_n = 8'b0000_0000;
 25     
 26     always@(*)begin
 27         case(data_in)
 28             4'b0000: seg_n = NUM0;
 29             4'b0001: seg_n = NUM1;
 30             4'b0010: seg_n = NUM2;
 31             4'b0011: seg_n = NUM3;
 32             4'b0100: seg_n = NUM4;
 33             4'b0101: seg_n = NUM5;
 34             4'b0110: seg_n = NUM6;
 35             4'b0111: seg_n = NUM7;
 36             4'b1000: seg_n = NUM8;
 37             4'b1001: seg_n = NUM9;
 38             4'b1010: seg_n = NUMA;
 39             4'b1011: seg_n = NUMB;
 40             4'b1100: seg_n = NUMC;
 41             4'b1101: seg_n = NUMD;
 42             4'b1110: seg_n = NUME;
 43             4'b1111: seg_n = NUMF;
 44             default: seg_n = 8'd0;
 45         endcase
 46     end
 47     
 48 
 49 
 50 //共阳型数码管,数码管显示0-f对应的段选输出信号
 51 //    parameter     NUM0 = 8'hc0,
 52 //                    NUM1 = 8'hf9,    
 53 //                    NUM2 = 8'ha4,    
 54 //                    NUM3 = 8'hb0,    
 55 //                    NUM4 = 8'h99,    
 56 //                    NUM5 = 8'h92,    
 57 //                    NUM6 = 8'h82,    
 58 //                    NUM7 = 8'hf8,    
 59 //                    NUM8 = 8'h80,    
 60 //                    NUM9 = 8'h90,
 61 //                    NUMA = 8'h88,
 62 //                    NUMB = 8'h83,
 63 //                    NUMC = 8'hc6,
 64 //                    NUMD = 8'ha1,
 65 //                    NUME = 8'h86,
 66 //                    NUMF = 8'h8e;
 67 
 68 //共阴型数码管,数码管显示0-f对应的段选输出信号    
 69 //    parameter       NUM0 = 8'b1100_0000,
 70 //                    NUM1 = 8'b1111_1001,    
 71 //                    NUM2 = 8'b1010_0100,    
 72 //                    NUM3 = 8'b1011_0000,    
 73 //                    NUM4 = 8'b1001_1001,    
 74 //                    NUM5 = 8'b1001_0010,    
 75 //                    NUM6 = 8'b1000_0010,    
 76 //                    NUM7 = 8'b1111_1000,    
 77 //                    NUM8 = 8'b1000_0000,    
 78 //                    NUM9 = 8'b1001_0000,
 79 //                    NUMA = 8'b1000_1000,
 80 //                    NUMB = 8'b1000_0011,
 81 //                    NUMC = 8'b1100_0110,
 82 //                    NUMD = 8'b1010_0001,
 83 //                    NUME = 8'b1000_0110,
 84 //                    NUMF = 8'b1000_1110;
 85 
 86 
 87 //共阴型数码管,数码管显示0-f对应的段选输出信号        
 88 //parameter          NUM0 = 8'b0011_1111,
 89 //                NUM1 = 8'b0000_0110,    
 90 //                NUM2 = 8'b0101_1011,    
 91 //                NUM3 = 8'b0100_1111,    
 92 //                NUM4 = 8'b0110_0110,    
 93 //                NUM5 = 8'b0110_1101,    
 94 //                NUM6 = 8'b0111_1101,    
 95 //                NUM7 = 8'b0000_0111,    
 96 //                NUM8 = 8'b0111_1111,    
 97 //                NUM9 = 8'b0110_1111,
 98 //                NUMA = 8'b0111_0111,
 99 //                NUMB = 8'b0111_1100,
100 //                NUMC = 8'b0011_1001,
101 //                NUMD = 8'b0101_1110,
102 //                NUME = 8'b0111_1001,
103 //                NUMF = 8'b0111_0001;
104 
105 
106 
107 //共阴型数码管,数码管显示0-f对应的段选输出信号    
108 //parameter         NUM0 = 8'h3f,
109 //                NUM1 = 8'h06,    
110 //                NUM2 = 8'h5b,    
111 //                NUM3 = 8'h4f,    
112 //                NUM4 = 8'h66,    
113 //                NUM5 = 8'h6d,    
114 //                NUM6 = 8'h7d,    
115 //                NUM7 = 8'h07,    
116 //                NUM8 = 8'h7f,    
117 //                NUM9 = 8'h6f,
118 //                NUMA = 8'h77,
119 //                NUMB = 8'h7c,
120 //                NUMC = 8'h39,
121 //                NUMD = 8'h5e,
122 //                NUME = 8'h79,
123 //                NUMF = 8'h71;
124 
125 endmodule 

参考资料如下:

posted @ 2021-07-25 11:32  豌豆茶  阅读(1572)  评论(0编辑  收藏  举报