集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 3661|回复: 7

雾盈FPGA笔记之(二十)显示三位数字的通用数码管程序

[复制链接]
雾盈 发表于 2016-8-10 19:59:51 | 显示全部楼层 |阅读模式
本帖最后由 雾盈 于 2016-8-28 13:42 编辑

显示三位数字的通用数码管程序

雾盈                2016-8-10


雾盈FPGA笔记汇总目录

        我们先不讲数码管的原理,我们先说步骤,从步骤中把其中的原理都讲清楚。
        为了让数码管显示,有哪些步骤?

        第一步、数据转换

        让十进制数字能够在数码管上显示出来 ,例如128
        Ones = (data_In )% 10  ;
        Ones =  128 % 10  =  8  
        Tens =  (data_In /10 )% 10  ;
        Tens =  128/10%10 = 2  
        Hundres = (data_in /100 ) % 10 ;
        Hunders =  128 /100 % 10 = 1  
        更多位数的十进制数字以此类推。
那我们可不可以总结出一个小公式,这样也算有了一个小算法啊对不对,
算了,想了一会儿发现,其实这个已经够简练了,再 整个算法就复杂了。= =
谁有简单的方式可以分享一下。
   
        第二步、分频一个片选扫描时钟

        因为选择让哪个数码管显示是由片选信号SEL 决定的。Sel是个三位位宽的38译码器。

000 表示 选中 第一个数码管
001 表示 选中 第二个数码管
011 表示 选中 第四个数码管
以此类推。

        但是,你也看出来了,sel控制的信号一次只能选中一个数码管,为了让多位数码管同时显示,怎么办呢?
        于是,我们要用到这个扫描时钟,这个时钟不能频率太高,太高扫描速度太快,你根本不能看到数码管显示。
也不能频率太低,太低的话,你看到的数码管就不是同时亮了,而是有间隔延迟的亮灭。
        一般我们会根据经验选择1kHz - 10 kHz 的分频时钟驱动sel去扫描数码管。

        第三步、数码管数据的查找表

        数码管的原理图如下



一个数码管由8个led灯构成(包括小数点),让每个led 保持高电平或者低电平就可以显示不同的字母或数字。
这样就会有0-F 对应的显示查找表。代码如下:

  1. case( seg_data )
  2.                                 0: seg = 8'hc0;
  3.                                 1: seg = 8'hf9;
  4.                                 2: seg = 8'ha4;
  5.                                 3: seg = 8'hb0;
  6.                                 4: seg = 8'h99;
  7.                                 5: seg = 8'h92;
  8.                                 6: seg = 8'h82;
  9.                                 7: seg = 8'hf8;
  10.                                 8: seg = 8'h80;
  11.                                 9: seg = 8'h90;
  12.                                 10: seg = 8'h88;
  13.                                 11: seg = 8'h83;
  14.                                 12: seg = 8'hc6;
  15.                                 13: seg = 8'ha1;
  16.                                 14: seg = 8'h86;
  17.                                 15: seg = 8'h8e;         
  18.              endcase
复制代码

 


到这里,数码管最核心的三个部分讲完了,其它就是根据不同的功能,增加不同的程序了。

后面贴上显示三位数的数码管通用程序。

  1. //=====================================================================
  2. // module name:                smg
  3. // function:                project iic_rd
  4. // create data:                from 2016-8-5 10:04:16 to  2016-8-10 17:48:14
  5. // editor:                        miao
  6. // note :                           reference the code of techer chen
  7. // Tool versions:         quartus 13.0
  8. //=====================================================================
  9. module        smg(
  10.                         //system signal
  11.                         input                                        clk                        ,         //50MHZ system clock
  12.                         input                                        rst_n                ,
  13.                         //external input
  14.                         input        [7:0]                        data_in                        ,
  15.                         // output         signal
  16.                         output        reg [2:0]                 sel                                 ,         // CS signal
  17.                         output        reg [7:0]                seg                                       // LS signal
  18.                         );
  19. //=========================================================================================================
  20. //**************************     Define parameter and internal signals          *********************************
  21. //=========================================================================================================
  22. reg                        clk_10K        ;                         // 10KHZ clock for sel
  23. reg [11:0]                count        ;                          //count for frequency division  10KHZ
  24. parameter         CNT_MAX         = 2500 - 1;                         // count 2500 times for 10KHZ

  25. reg [3:0]        seg_data        ;
  26. reg [3:0]        ones         ;
  27. reg [3:0]        tens                 ;
  28. reg [3:0]        hundreds         ;

  29. //=========================================================================================================
  30. //*********************************         frequency division 10KHZ for sel  *********************************
  31. //=========================================================================================================
  32. always @ (posedge clk or negedge rst_n)
  33. begin
  34.      if(!rst_n)
  35.         begin
  36.                         clk_10K <= 1'b0;
  37.         end
  38.      else  begin
  39.             if( count == CNT_MAX )
  40.                                 begin
  41.                                         count <= 1'b0        ;
  42.                                         clk_10K <= ~clk_10K ;
  43.                                 end
  44.                         else  begin
  45.                                         count <= count + 1'b1;
  46.                                   end
  47.              end
  48. end
  49. //=========================================================================================================
  50. //*********************************         data convert                 ***********************************
  51. //=========================================================================================================
  52. always @ (posedge clk or negedge rst_n)
  53. begin
  54.      if(!rst_n)
  55.         begin
  56.                   ones <= 4'd0                ;
  57.                   tens <= 4'd0                ;
  58.                   hundreds <= 4'd0        ;
  59.         end
  60.      else  begin
  61.             ones <= data_in % 10;
  62.                         tens <= (data_in / 10) % 10                ;
  63.                         hundreds <= (data_in /100) % 10        ;                       
  64.             end
  65. end
  66. //=========================================================================================================
  67. //*********************************         smg code                 ***********************************
  68. //=========================================================================================================

  69. // cut out the last three of sel  
  70. always @ (posedge clk_10K or negedge rst_n)
  71. begin
  72.      if(!rst_n)
  73.         begin
  74.                         sel <= 3                        ;
  75.         end
  76.      else  begin
  77.                     if( sel <= 5 )
  78.                         sel <= sel + 1'b1        ;
  79.                   else
  80.                         sel <= 3                        ;
  81.              end
  82. end

  83. // seg_data for display
  84. always @ (posedge clk or negedge rst_n)
  85. begin
  86.      if(!rst_n)
  87.         begin               
  88.                   seg_data <= 4'd0                ;
  89.         end
  90.      else  begin
  91.                    case( sel )
  92.              3:begin
  93.                 seg_data <= hundreds ;
  94.                end
  95.              4:begin
  96.                 seg_data <= tens ;
  97.                end
  98.             5:begin
  99.                 seg_data <= ones ;
  100.                end
  101.              default: seg_data <= seg_data ;            
  102.              endcase
  103.              end
  104. end

  105. // LUT for display
  106. always @ (posedge clk or negedge rst_n)
  107. begin
  108.      if(!rst_n)
  109.         begin                       
  110.                         seg <= 8'hff;
  111.                        d
  112.      else  begin
  113.            case( seg_data )
  114.                                 0: seg = 8'hc0;
  115.                                 1: seg = 8'hf9;
  116.                                 2: seg = 8'ha4;
  117.                                 3: seg = 8'hb0;
  118.                                 4: seg = 8'h99;
  119.                                 5: seg = 8'h92;
  120.                                 6: seg = 8'h82;
  121.                                 7: seg = 8'hf8;
  122.                                 8: seg = 8'h80;
  123.                                 9: seg = 8'h90;
  124.                                 10: seg = 8'h88;
  125.                                 11: seg = 8'h83;
  126.                                 12: seg = 8'hc6;
  127.                                 13: seg = 8'ha1;
  128.                                 14: seg = 8'h86;
  129.                                 15: seg = 8'h8e;         
  130.              endcase
  131.              end
  132. end


  133. endmodule
复制代码











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 雾盈 发表于 2016-8-10 20:08:26 | 显示全部楼层
代码编辑器好难用
回复 支持 1 反对 0

使用道具 举报

zhiweiqiang33 发表于 2016-8-11 09:44:11 | 显示全部楼层
写的不错 值得分享 谢谢 楼主
芙蓉王 发表于 2016-8-11 16:08:58 | 显示全部楼层
                                           谢谢分享
Sunlife 发表于 2016-8-13 17:09:12 | 显示全部楼层
                厉害
zhiweiqiang33 发表于 2016-8-16 11:56:53 | 显示全部楼层
受教,好好努力,加油;;
Esmiamor 发表于 2016-8-17 11:22:08 | 显示全部楼层
     支持。
嘿哈嘿哈哈 发表于 2023-7-23 09:08:02 | 显示全部楼层
雾盈FPGA笔记之(二十)显示三位数字的通用数码管程序
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-16 14:25 , Processed in 0.067888 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表