基于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
参考资料如下: