单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 161|回复: 0
收起左侧

数码管的动态刷新Verilog源程序

[复制链接]
strelizia 发表于 2019-5-28 17:15 | 显示全部楼层 |阅读模式
六位八段数码管,最后两位自加首先循环,同时在到特定的数字调用蜂鸣器“哔~”
0.png

源程序如下:
  1. module Project_Segled2
  2. (        
  3.         //输入端口
  4.         CLK_50M,CLK_1S,RST_N,
  5.         //输出端口
  6.         SEG_DATA,SEG_EN,FM
  7. );
  8.         
  9. //---------------------------------------------------------------------------
  10. //--        外部端口声明
  11. //---------------------------------------------------------------------------
  12. input                                         CLK_50M;                                //时钟的端口,开发板用的50M晶振
  13. input                CLK_1S;
  14. input                                                RST_N;                                //复位的端口,低电平复位
  15. output reg         [ 5:0]         SEG_EN;                                //数码管使能端口
  16. output reg         [ 7:0]         SEG_DATA;                        //数码管数据端口(查看管脚分配文档或者原理图)
  17. output reg          FM;               //控制蜂鸣器

  18. //---------------------------------------------------------------------------
  19. //--        内部端口声明
  20. //---------------------------------------------------------------------------
  21. reg                        [15:0]        time_cnt;                        //用来控制数码管闪烁频率的定时计数器
  22. reg                        [15:0]        time_cnt_n;                        //time_cnt的下一个状态
  23. reg                        [ 2:0]        led_cnt;                                //用来控制数码管亮灭及显示数据的显示计数器
  24. reg                        [ 2:0]        led_cnt_n;                        //led_cnt的下一个状态
  25. reg                                           [3:0]         gewei;                                       // 后两位的个位
  26. reg                                           [3:0]         shiwei;                                      //后两位的十位
  27. reg                                           [7:0]         GE_DATA;                                //个位数码管数据
  28. reg                                           [7:0]         SHI_DATA;                                //十位数码管数据
  29. reg                                           [3:0]         gewei_n;                                       // 后两位的个位  
  30. reg                                        beep_reg;                                //用来控制蜂鸣器发声的寄存器
  31. reg                                        beep_reg_n;                                //beep_reg的下一个状态

  32. //设置定时器的时间为1ms,计算方法为  (1*10^3)us / (1/50)us  50MHz为开发板晶振
  33. parameter SET_TIME_1MS = 16'd50_000;
  34. parameter freq = 16'd47774;
  35. initial
  36. begin
  37. gewei = 4'h5;                                                                          //初始化个位十位的值
  38. shiwei=4'h0;
  39. gewei_n=4'h5;
  40. end               

  41. //---------------------------------------------------------------------------
  42. //--        逻辑功能实现        
  43. //---------------------------------------------------------------------------
  44. //时序电路,用来给time_cnt寄存器赋值
  45. always @ (posedge CLK_50M or negedge RST_N)  
  46. begin
  47.         if(!RST_N)                                                                        //判断复位
  48.                 time_cnt <= 16'h0;                                        //初始化time_cnt值
  49.         else
  50.                 time_cnt <= time_cnt_n;                                //用来给time_cnt赋值
  51. end


  52. always @ (posedge CLK_50M)  
  53. begin
  54.         if(time_cnt == SET_TIME_1MS)                        //判断1ms时间
  55.                 time_cnt_n = 16'h0;                                        //如果到达1ms,定时计数器将会被清零
  56.         else
  57.                 time_cnt_n = time_cnt + 27'h1;        //如果未到1ms,定时计数器将会继续累加
  58. end





  59. //时序电路,用来给led_cnt寄存器赋值
  60. always @ (posedge CLK_1S or negedge RST_N)  
  61. begin
  62.         if(!RST_N )                                                                        //判断复位
  63. begin        
  64.                     gewei = 4'h5;                                                                          //初始化个位十位的值
  65.                 shiwei=4'h0;
  66. end        
  67.         else if(gewei==4'b1001)
  68. begin                 
  69.                 gewei=4'h0;
  70.                 shiwei=shiwei+1'h1;                                                           //如果个位到十就归0且让十位加一
  71. end
  72.    else if(shiwei==4'b0100)
  73. begin               
  74.                  shiwei=4'h0;                                                                        //判断十位的值如果到4就归0
  75. end
  76.    else
  77.        gewei=gewei_n;        
  78. end
  79. //组合电路,判断时间,实现控制显示计数器累加
  80. always @ (negedge CLK_1S)  
  81. begin

  82.                 gewei_n = gewei + 1'h1;                //如果到达1s,计数器进行累加
  83.         
  84.               
  85. end


  86. //时序电路,用来给gewei寄存器赋值
  87. always @ (posedge CLK_50M or negedge RST_N)  
  88. begin
  89.         if(!RST_N)                                                                        //判断复位
  90.                 led_cnt <= 3'h0;                                                //初始化led_cnt值
  91.         else
  92.                 led_cnt <= led_cnt_n;                                //用来给led_cnt赋值
  93. end

  94. //组合电路,判断时间,实现控制显示计数器累加
  95. always @ (posedge CLK_50M)  
  96. begin
  97.         if(time_cnt == SET_TIME_1MS)                        //判断1Ms时间        
  98.                 led_cnt_n = led_cnt + 1'h1;                //如果到达1ms,计数器进行累加
  99.         else
  100.                 led_cnt_n = led_cnt;                                        //如果未到1ms,计数器保持不变
  101. end
  102. //实现gewei数据到数码管码数的一致
  103. always @ (posedge CLK_50M)
  104. begin
  105.                case(gewei)
  106.                            4'b0000:GE_DATA= 8'b00111111;        //0
  107.                            4'b0001:GE_DATA= 8'b00000110;        //1
  108.                            4'b0010:GE_DATA= 8'b01011011;        //2
  109.                            4'b0011:GE_DATA= 8'b01001111;        //3
  110.                            4'b0100:GE_DATA= 8'b01100110;        //4
  111.                            4'b0101:GE_DATA= 8'b01101101;        //5
  112.                            4'b0110:GE_DATA= 8'b01111101;        //6
  113.                             4'b0111:GE_DATA= 8'b00000111;       //7
  114.                            4'b1000:GE_DATA= 8'b01111111;        //8
  115.                             4'b1001:GE_DATA= 8'b01101111;       //9
  116.                             default:GE_DATA=8'b10111111;
  117.                endcase
  118. end

  119. //实现shiwei数据到数码管数的一致
  120. always @ (posedge CLK_50M)
  121. begin
  122.                case(shiwei)
  123.                             4'b0000:SHI_DATA= 8'b00111111;        //0
  124.                            4'b0001:SHI_DATA= 8'b00000110;        //1
  125.                            4'b0010:SHI_DATA= 8'b01011011;        //2
  126.                            4'b0011:SHI_DATA= 8'b01001111;        //3
  127.                            4'b0100:SHI_DATA= 8'b01100110;        //4
  128.                            default:SHI_DATA=8'b10111111;
  129.                endcase
  130. end

  131. //组合电路,实现数码管的数字显示
  132. always @ (posedge CLK_50M)
  133. begin
  134.         case (led_cnt)  
  135.                 3'b000 : SEG_DATA = 8'b00000111;        //当计数器为0时,数码管将会显示 "7"
  136.                 3'b001 : SEG_DATA = 8'b00000110;        //当计数器为1时,数码管将会显示 "1"
  137.                 3'b010 : SEG_DATA = 8'b01100110;        //当计数器为2时,数码管将会显示 "4"
  138.                 3'b011 : SEG_DATA = 8'b00111111;        //当计数器为3时,数码管将会显示 "0"
  139.                 3'b100 : SEG_DATA = SHI_DATA;                       //当计数器为4时,数码管将会显示 "十位"
  140.                 3'b101 : SEG_DATA = GE_DATA;                       //当计数器为5时,数码管将会显示 "个位"        
  141.                 default: SEG_DATA = 8'b10111111;        
  142.         endcase         
  143. end






  144. always @ (posedge CLK_50M)
  145. begin
  146.         case (led_cnt)  
  147.                 3'b000 : SEG_EN = 6'b111110;                //当计数器为0时,数码管SEG1显示
  148.                 3'b001 : SEG_EN = 6'b111101;                //当计数器为1时,数码管SEG2显示
  149.                 3'b010 : SEG_EN = 6'b111011;                 //当计数器为2时,数码管SEG3显示
  150.                 3'b011 : SEG_EN = 6'b110111;          //当计数器为3时,数码管SEG4显示
  151.                 3'b100 : SEG_EN = 6'b101111;                //当计数器为4时,数码管SEG5显示
  152.                 3'b101 : SEG_EN = 6'b011111;          //当计数器为5时,数码管SEG6显示               
  153.                 default: SEG_EN = 6'b111111;                        
  154.         endcase         
  155. end









  156. //控制蜂鸣器
  157. always @ (posedge CLK_50M or negedge RST_N)
  158. begin
  159.         if(!RST_N)                                                                        //判断复位
  160.                 beep_reg <= 1'b0;                                                //初始化beep_reg值
  161.         else
  162.                 beep_reg <= beep_reg_n;                                //用来给beep_reg赋值
  163. end

  164. //组合电路,判断频率,使蜂鸣器发声
  165. always @ (posedge CLK_50M)
  166. begin
  167.         if(time_cnt == freq)                                                //判断分频值
  168.                 beep_reg_n = ~beep_reg;                                //改变蜂鸣器的状态
  169.         else
  170.                 beep_reg_n = beep_reg;                                //蜂鸣器的状态保持不变
  171. end
  172. always @  (posedge CLK_50M)
  173. begin
  174.   if(gewei==4'h5 && shiwei==4'h0)
  175.   FM = beep_reg;
  176. end

  177. endmodule
复制代码

所有资料51hei提供下载:
final.zip (3.37 MB, 下载次数: 2)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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