单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:4701|回复:0
打印上一主题下一主题

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

[复制链接]
跳转到指定楼层
楼主
ID:546381发表于 2019-5-28 17:15|只看该作者|只看大图回帖奖励
六位八段数码管,最后两位自加首先循环,同时在到特定的数字调用蜂鸣器“哔~”


源程序如下:
  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, 下载次数: 10)


评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网