0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA学习系列:18. 数码管的设计

FPGA学习交流 2018-06-18 19:24 次阅读

设计背景:

数码管是一种半导体发光器件,其基本单元是发光二极管数码管在我们的许多设计中都又用到,数码管的显示原理简单和显示效果清晰在我们的工业中的到了广泛的应用。

数码管的应用很广泛,涉及众多领域,我们就拿数显仪表这个领域来讲,数显仪表是数字式显示仪表的简称,显示器常用的有LED、LCD为显示元件。

设计原理:

本次的设计是设计一个数码管的显示模,其设计原理图如下:

image.png

数码管显示分为的动态和静态显示,为了让人眼可以看清数码管的显示,我们一般驱动数码管的频率为1K - 10K 之间。

顾名思义,七段数码管就是使用七段点亮的线段来拼成常见的数字和某些字母,这种显示方式我们在数字电路中非常容易见到。再加上右下角显示的小数点,实际上一个显示单元包括了8根信号线。根据电路设计的不同,这些信号线可能高有效也可能低有效。我们通过FPGA控制这些线段的亮灭,达到显示效果。

对于多个数码管的显示模块,将每一个都连接到FPGA的管脚会耗用大量FPGA的管脚资源。因此我们同样引入一种类似矩阵键盘的扫描方式。任何时刻我们只使用8根信号点亮一个数码管,但是8个数码管是随着时钟步调交替点亮的,只要时钟的速度够快,我们观察到数码管就好像几个同时点亮一样。

我们的开发板使用的动态显示来循环扫描显示。其原理图如下所示:

image.png

如图所示,我们的开发板使用的是六位共阳极数码管,六个PNP型三极管分别作为六组数码管电源的输入开关,也就是我们常说的位选信号,PNP三极管为低电平导通,所以我们的位选信号低有效。在这里,为了节约FPGA的IO资源,我们把六个位选信号连接到了三八译码器74HC138D。

从我们的板子硬件原理图上我们可以看清,我们的数码管是红阳极,就是是给一个低电平就是点亮数码管的一个段,那么8段全部给8b0000000那么数码管显示的就是8这个数字了,我们用的是循环显示,是通过sel引脚来选择哪一个数码管亮,也就是说我们的sel的三位为3b000的时候也就是选择第一个数码亮,3b001第二个数码管亮依次类推。

设计架构图:

image.png

设计代码:

顶层模块

0moduleseg_x(clk,rst_n,sel,seg7);//顶层端口

1 inputclk; //输入

2 inputrst_n;

3 output[2:0]sel; //输出

4 output[7:0]seg7;

5

6 wire[23:0]num;

7

8 num_in num_in( //例化输入模块

9 .clk(clk),

10 .rst_n(rst_n),

11 .num(num)

12 );

13

14 seg seg( //例化数码管模块

15 .clk(clk),

16 .rst_n(rst_n),

17 .sel(sel),

18 .seg7(seg7),

19 .data_in(num)

20 );

21endmodule

设计模块

0moduleseg(clk,rst_n,sel,seg7,data_in);//端口定义

1

2 inputclk;

3 inputrst_n;

4 input[23:0]data_in;//输入6个灯的数据

5

6 outputreg[2:0]sel;

7 outputreg[7:0]seg7;

8

9 parameters0 =3'b000;

10 parameters1 =3'b001;

11 parameters2 =3'b010;

12 parameters3 =3'b011;

13 parameters4 =3'b100;

14 parameters5 =3'b101;

15

16 `defineT1ms 50_000 //定义1k的计数值

17 //`define T1ms 5

18 reg[15:0]count;

19 wireflag;

20 always@(posedgeclk ornegedgerst_n)

21 if(!rst_n)

22 begin

23 count <=15'b0;

24 end

25 else

26 if(count ==`T1ms-1)//计数到1MS

27 begin

28 count <=15'b0;

29 end

30 else

31 begin

32 count <=count +1'b1;

33 end

34

35 assignflag =(count ==`T1ms-1)?1'b1:1'b0;//标志位赋值

36

37 reg[2:0]state;

38 reg[3:0]num;

39 always@(posedgeclk ornegedgerst_n)

40 if(!rst_n)

41 begin

42 sel <=3'b0;

43 state <=3'b0;

44 num <=4'b0;

45 end

46 else

47 begin

48 case(state)

49 s0:begin

50 if(flag)

51 state <=s1;//亮第一个灯,给24位数据的 4

52 else

53 begin

54 sel <=3'b000;

55 num <=data_in[23:20];

56 end

57 end

58 s1:begin

59 if(flag) ////亮第2个灯,给24位数据 4

60 state <=s2;

61 else

62 begin

63 sel <=3'b001;

64 num <=data_in[19:16];

65 end

66 end

67 s2:begin

68 if(flag) //亮第3个灯,给24位数据的 4

69 state <=s3;

70 else

71 begin

72 sel <=3'b010;

73 num <=data_in[15:12];

74 end

75 end

76 s3:begin

77 if(flag) //亮第4个灯,给24位数据的4

78 state <=s4;

79 else

80 begin

81 sel <=3'b011;

82 num <=data_in[11:8];

83 end

84 end

85 s4:begin

86 if(flag) //亮第5个灯,给24位数据的4

87 state <=s5;

88 else

89 begin

90 sel <=3'b100;

91 num <=data_in[7:4];

92 end

93 end

94 s5:begin

95 if(flag) //亮第6个灯,给24位数据的4

96 state <=s0;

97 else

98 begin

99 sel <=3'b101;

100 num <=data_in[3:0];

101 end

102 end

103 default:state <=s0;

104 endcase

105 end

106

107 always@(*) //数码管的译码模块

108 begin

109 case(num)

110 0:seg7 =8'b1100_0000;

111 1:seg7 =8'b1111_1001;

112 2:seg7 =8'b1010_0100;

113 3:seg7 =8'b1011_0000;

114 4:seg7 =8'b1001_1001;

115 5:seg7 =8'b1001_0010;

116 6:seg7 =8'b1000_0010;

117 7:seg7 =8'b1111_1000;

118 8:seg7 =8'b1000_0000;

119 9:seg7 =8'b1001_0000;

120 10:seg7 =8'b1000_1000;

121 11:seg7 =8'b1000_0011;

122 12:seg7 =8'b1100_0110;

123 13:seg7 =8'b1010_0001;

124 14:seg7 =8'b1000_0110;

125 15:seg7 =8'b1000_1110;

126 default:;

127 endcase

128 end

129endmodule

输入模块

0modulenum_in(clk,rst_n,num);//端口定义

1 inputclk;

2 inputrst_n;

3

4

5 output[23:0]num;

6

7 assignnum =24'h123456;//给输入一个值,便于下次直接调用

8

9

10

11endmodule

测试模块

0`timescale1ns/1ps//时间精度

1

2moduleseg_tb;

3 regclk; //端口定义

4 regrst_n;

5

6

7 wire[2:0]sel;

8 wire[7:0]seg7;

9

10 initialbegin

11 clk =1'b1;

12 rst_n =1'b0;

13

14 #100.1rst_n =1'b1;

15

16 #200000

17 $stop;

18

19 end

20 always#10clk =~clk;//模拟时钟

21

22 seg_x seg_x_dut( //例化顶层模块

23 .clk(clk),

24 .rst_n(rst_n),

25 .sel(sel),

26 .seg7(seg7)

27 );

28endmodule

仿真:

image.png


在仿真中我们可以看到我们的设计是正确的,第一个灯亮的是f9,也就是也就是对应数码管显示的是1,a4就是2,和我们的输入是正确的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21309

    浏览量

    593122
  • 数码管
    +关注

    关注

    31

    文章

    1827

    浏览量

    89946
收藏 人收藏

    评论

    相关推荐

    DS18B20用LCD1206和数码管显示温度

    本人初学FPGA写一个DS18B20测温用数码管和LCD162显示温度的程序,可是只能在数码管正确显示温度却不能在LCD1602正确显示,实验好多次不明原因,求大师帮助。如能解决感激不
    发表于 04-10 15:19

    Xilinx FPGA入门连载26:数码管驱动实例

    `Xilinx FPGA入门连载26:数码管驱动实例特权同学,版权所有配套例程和更多资料下载链接:http://pan.baidu.com/s/1jGjAhEm 1 数码管驱动原理先来了解一下
    发表于 11-20 11:31

    转:FPGA学习之六位数码管驱动

    FPGA学习之六位数码管驱动一、实验目的:实现六位数码管驱动,显示0-999999。二、实验环境:FPGA开发板AX301,Quartus
    发表于 05-22 18:15

    STM32数码管问题

    学习51单片机的都知道,可以有I/O口做为1个字节整体输出来控制数码管的显示,学习STM32也已经快1个多月了,但是看到所有的例程和方案里少了数码管的身影,是STM32操作不便还是另有
    发表于 03-11 05:24

    FPGA数码管驱动开发

    电路来驱动彩色液晶屏来显示一定的数据,势必是非常不划算的选择,而且驱动也极为复杂。数码管作为一种能够直观显示一定数据信息的输出设备,具有驱动简单,显示直观的特点,尤其适合作为FPGA系统的输出设备
    发表于 03-18 02:13

    FPGA数码管动态扫描详解

    设计我们要实现的功能,概括起来就是控制8个数码管,让数码管显示不同的数字。要控制8个数码管,就需要控制位选信号,即FPGA要输出一个8位的位选信号,设为seg_sel,其中seg_se
    发表于 04-29 06:35

    FPGA数码管动态扫描

    也就是说,FPGA通过控制上面中的管脚,就控制了数码管
    发表于 08-07 09:05

    【梦翼师兄今日分享】 数码管显示设计讲解

    通常需要一些显示设备来显示我们需要的信息,可以选择的显示设备更是种类繁多,玲琅满目,数码管无疑是最常用,最简单的显示设备之一。本节,梦翼师兄和大家一起学习数码管的显示原理和驱动方式,为我们以后项目的开发
    发表于 12-05 11:51

    led数码管控制灯灭设计实验--FPGA学习

    `基础理论部分led 数码管是由多个发光二极封装在一起组合的“8”字型的器件,引线内部已经完成,如下图 10.1 所示,图 10.2 为实物图。图 10.1 数码管内部结构那么我们想要控制
    发表于 10-23 11:17

    按键数码管逐渐输出5fpga数码管数字1~6

    fpga数码管数字从左到右移动,按下按键数码管逐渐输出5fpga数码管数字1~6从左到右移动(如123456–>234561->234561
    发表于 07-29 07:30

    数码管显示原理及应用

    单片机学习----数码管显示原理及应用代码规划内容:一、数码管显示原理二、如何用万用表检测数码管的引脚排列三、数码管与单片机的电气连接四、
    发表于 11-17 08:32

    FPGA零基础学习数码管驱动设计

    的。话不多说,上货。 数码管驱动设计 开发板上拥有一个六位一体的数码管,利用数码管可以显示一些数据。 · 硬件介绍 数码管共有八个段选信号,通过电阻直接与
    发表于 03-09 16:25

    数码管驱动设计-ISE操作工具

    学习FPGA设计方法及设计思想的同时,实操结合各类操作软件,会让你在技术学习道路上无比的顺畅,告别技术学习小BUG卡破脑壳,告别目前忽悠性的培训诱导,真正的去
    发表于 04-04 21:23

    FPGA零基础学习之Vivado-数码管驱动设计实验

    及打算进阶提升的职业开发者都可以有系统性学习的机会。系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,本篇为数码管驱动设计实验。话
    发表于 04-19 19:21

    学习学习点亮数码管

    你好!最近想学习学习点亮多段位数码管,谢谢版主
    发表于 06-03 21:14