查看: 2472|回复: 1

【学习笔记Ⅳ】数码管的正确打开方式

[复制链接]
  • TA的每日心情
    难过
    2018-9-25 15:55
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2016-8-20 19:10:55 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 叫我小杜可好 于 2016-8-20 19:16 编辑

    背景

      在电子系统中,通常都需要有输出设备来输出或显示一定的信息,以指示当前系统运行的状态。在以单片机和ARM为主的电子系统中,液晶屏是理想的输出设备。而FPGA则因为其独特的硬件结构,如果用RTL级电路来驱动彩色液晶屏来显示一定的数据,势必是非常不划算的选择,而且驱动也极为复杂。数码管作为一种能够直观显示一定数据信息的输出设备,具有驱动简单,显示直观的特点,尤其适合作为FPGA系统的输出设备。
    目的


      通过数码管完成一个0~999999S的秒表设计
    原理


      数码管所谓的动态扫描,就是利用人眼的视觉暂留特性,在人眼能分辨的变化速度以外,快速分时的点亮各个数码管对应的段。因为分别点亮所有数码管一次所用时间小于人眼的视觉暂留,因此,在人们眼里看来,这些数码管都是同时持续点亮的,并不会有闪烁的感觉。
    smg.jpg 实物图


    原理图

    原理图
    原理图


    代码
    1. `timescale 1ns / 1ps
    2. //////////////////////////////////////////////////////////////////////////////////
    3. // Company: UJS
    4. // Engineer: Doby
    5. //
    6. // Create Date:    14:07:42 08/19/2016
    7. // Design Name:         SMG
    8. // Module Name:    SMG
    9. // Project Name:         SMG
    10. // Target Devices:          EP4CE10F17C8
    11. // Tool versions:
    12. // Description:
    13. //
    14. // Dependencies:
    15. //
    16. // Revision:
    17. // Revision 0.01 - File Created
    18. // Additional Comments:
    19. //
    20. //////////////////////////////////////////////////////////////////////////////////
    21. module SMG(
    22.                                 input                wire                        clk,
    23.                                 input                wire                        rst,
    24.                                 
    25.                                 output        reg[6:0]                seg,
    26.                                 output        reg[3:0]                ant
    27.                                 );
    28. //---------------0-9999之间任意进制计数器设计---------
    29. //---在下面个十百千位输入0-9的数字即可------------------
    30.                                 parameter        GE=4'd8;//个位
    31.                                 parameter        SHI=4'd9;//十位
    32.                                 parameter        BAI=4'd9;//百位
    33.                                 parameter        QIAN=4'd8;//千位
    34.                                 parameter        COLCK_FRQ=32'd49_999_9;
    35. //---------------数码管第四位变化-----
    36.                                 reg[6:0]                seg1;
    37.                                 reg[31:0]        cnt_seg1;
    38.                                 reg[3:0]                seg1_reg;
    39.                                 
    40.                                 always@(posedge        clk)
    41.                                         if(!rst)
    42.                                                 cnt_seg1<=32'd0;
    43.                                         else        if(cnt_seg1==COLCK_FRQ)
    44.                                                 cnt_seg1<=15'd0;
    45.                                         else        
    46.                                                 cnt_seg1<=cnt_seg1+1'b1;
    47.                                 
    48.                                 
    49.                                 always@(posedge        clk)
    50.                                         if(!rst)
    51.                                                 seg1_reg<=4'b0;
    52.                                         else        if(seg1_reg==GE&&cnt_seg1==COLCK_FRQ)
    53.                                                 seg1_reg<=4'b0;
    54.                                         else        if(cnt_seg1==COLCK_FRQ)
    55.                                                 seg1_reg<=seg1_reg+1'b1;
    56.                                 
    57.                                 always@(posedge        clk)
    58.                                         if(!rst)
    59.                                                 seg1<=7'b1111111;
    60.                                         else        
    61.                                                 case(seg1_reg)
    62.                                                   4'd0:seg1<=7'b100_0000;
    63.                                                   4'd1:seg1<=7'b111_1001;
    64.                                                   4'd2:seg1<=7'b010_0100;
    65.                                                   4'd3:seg1<=7'b011_0000;
    66.                                                   4'd4:seg1<=7'b001_1001;
    67.                                                   4'd5:seg1<=7'b001_0010;
    68.                                                   4'd6:seg1<=7'b000_0010;
    69.                                                   4'd7:seg1<=7'b111_1000;
    70.                                                   4'd8:seg1<=7'b000_0000;
    71.                                                   4'd9:seg1<=7'b001_0000;
    72.                                                 endcase
    73. //---------------数码管第三位变化-----
    74.                                 reg[6:0]                seg2;
    75.                                 reg[3:0]                seg2_reg;                                                        
    76.                                 
    77.                                 always@(posedge        clk)
    78.                                         if(!rst)
    79.                                                 seg2_reg<=4'b0;
    80.                                         else        if(seg1_reg==GE&&seg2_reg==SHI&&cnt_seg1==COLCK_FRQ)
    81.                                                 seg2_reg<=4'b0;
    82.                                         else        if(seg1_reg==GE&&cnt_seg1==COLCK_FRQ)
    83.                                                 seg2_reg<=seg2_reg+1'b1;
    84.                                 
    85.                                 always@(posedge        clk)
    86.                                         if(!rst)
    87.                                                 seg2<=7'b1111111;
    88.                                         else        
    89.                                                 case(seg2_reg)
    90.                                                   4'd0:seg2<=7'b100_0000;
    91.                                                   4'd1:seg2<=7'b111_1001;
    92.                                                   4'd2:seg2<=7'b010_0100;
    93.                                                   4'd3:seg2<=7'b011_0000;
    94.                                                   4'd4:seg2<=7'b001_1001;
    95.                                                   4'd5:seg2<=7'b001_0010;
    96.                                                   4'd6:seg2<=7'b000_0010;
    97.                                                   4'd7:seg2<=7'b111_1000;
    98.                                                   4'd8:seg2<=7'b000_0000;
    99.                                                   4'd9:seg2<=7'b001_0000;
    100.                                                 endcase
    101. //---------------数码管第二位变化-----
    102.                                 reg[6:0]                seg3;
    103.                                 reg[3:0]                seg3_reg;                                                        
    104.                                 
    105.                                 always@(posedge        clk)
    106.                                         if(!rst)
    107.                                                 seg3_reg<=4'b0;
    108.                                         else        if(seg1_reg==GE&&seg2_reg==SHI&&seg3_reg==BAI&&cnt_seg1==COLCK_FRQ)
    109.                                                 seg3_reg<=4'b0;
    110.                                         else        if(seg1_reg==GE&&seg2_reg==SHI&&cnt_seg1==COLCK_FRQ)
    111.                                                 seg3_reg<=seg3_reg+1'b1;
    112.                                 
    113.                                 always@(posedge        clk)
    114.                                         if(!rst)
    115.                                                 seg3<=7'b1111111;
    116.                                         else        
    117.                                                 case(seg3_reg)
    118.                                                   4'd0:seg3<=7'b100_0000;
    119.                                                   4'd1:seg3<=7'b111_1001;
    120.                                                   4'd2:seg3<=7'b010_0100;
    121.                                                   4'd3:seg3<=7'b011_0000;
    122.                                                   4'd4:seg3<=7'b001_1001;
    123.                                                   4'd5:seg3<=7'b001_0010;
    124.                                                   4'd6:seg3<=7'b000_0010;
    125.                                                   4'd7:seg3<=7'b111_1000;
    126.                                                   4'd8:seg3<=7'b000_0000;
    127.                                                   4'd9:seg3<=7'b001_0000;
    128.                                                 endcase
    129. //---------------数码管第1位变化-----
    130.                                 reg[6:0]                seg4;
    131.                                 reg[3:0]                seg4_reg;                                                        
    132.                                 
    133.                                 always@(posedge        clk)
    134.                                         if(!rst)
    135.                                                 seg4_reg<=4'b0;
    136.                                         else        if(seg1_reg==GE&&seg2_reg==SHI&&seg3_reg==BAI&&seg4_reg==QIAN&&cnt_seg1==COLCK_FRQ)
    137.                                                 seg4_reg<=4'b0;
    138.                                         else        if(seg1_reg==GE&&seg2_reg==SHI&&seg3_reg==BAI&&cnt_seg1==COLCK_FRQ)
    139.                                                 seg4_reg<=seg4_reg+1'b1;
    140.                                 
    141.                                 always@(posedge        clk)
    142.                                         if(!rst)
    143.                                                 seg4<=7'b1111111;
    144.                                         else        
    145.                                                 case(seg4_reg)
    146.                                                   4'd0:seg4<=7'b100_0000;
    147.                                                   4'd1:seg4<=7'b111_1001;
    148.                                                   4'd2:seg4<=7'b010_0100;
    149.                                                   4'd3:seg4<=7'b011_0000;
    150.                                                   4'd4:seg4<=7'b001_1001;
    151.                                                   4'd5:seg4<=7'b001_0010;
    152.                                                   4'd6:seg4<=7'b000_0010;
    153.                                                   4'd7:seg4<=7'b111_1000;
    154.                                                   4'd8:seg4<=7'b000_0000;
    155.                                                   4'd9:seg4<=7'b001_0000;
    156.                                                 endcase                                                
    157. //---------------数码管位选----------                                       
    158.                                 reg[14:0]        cnt_an;
    159.                                 
    160.                                 always@(posedge        clk)
    161.                                         if(!rst)
    162.                                                 cnt_an<=15'd0;
    163.                                         else        if(cnt_an==15'd20000)
    164.                                                 cnt_an<=15'd0;
    165.                                         else        
    166.                                                 cnt_an<=cnt_an+1'b1;
    167.                                                 
    168.                                 always@(posedge        clk)
    169.                                         if(!rst)
    170.                                                 ant<=4'b1110;
    171.                                         else        if(cnt_an==15'd20000)
    172.                                                 ant<={ant[2:0],ant[3]};
    173.                                 
    174.                                 always@(posedge        clk)
    175.                                         if(!rst)
    176.                                                 seg<=7'b1111111;
    177.                                         else        
    178.                                                 case(ant)
    179.                                                         4'b0111:        seg<=seg4;
    180.                                                         4'b1011:        seg<=seg3;
    181.                                                         4'b1101:        seg<=seg2;
    182.                                                         4'b1110:        seg<=seg1;
    183.                                                 endcase

    184. endmodule
    复制代码
    只做了四个数码管,复制粘贴快累死宝宝了(⊙﹏⊙)
    效果


    秒表

    秒表

    回复

    使用道具 举报

  • TA的每日心情

    2021-12-7 12:35
  • 签到天数: 1354 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-8-20 23:09:24 | 显示全部楼层
    下载下来,学习和参考
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 14:32 , Processed in 0.118293 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.