2874|0

693

帖子

7

TA的资源

版主

楼主
 

(FPGA实验五):Verilog HDL语言数码管时钟(时分秒) [复制链接]

10枚芯币 * 回复本帖可获得 2 枚芯币奖励! 每人限 1 次(中奖概率 30%)
本帖最后由 bqgup 于 2019-4-26 19:51 编辑
Verilog HDL语言写得数码管时钟

  1. module smg(
  2.                         input ext_clk_50M,
  3.                         inout reg div_clk_1K,
  4.                         output reg[7:0]wei_xuan,
  5.                         output reg[7:0]duan_xuan
  6.                         );

  7. reg [31:0]cnt;
  8. reg [31:0]cnt1;//time
  9. reg div_clk_1Hz;

  10. reg [7:0]sec;
  11. reg [7:0]min;
  12. reg [7:0]h;

  13. reg [2:0]duan_num;


  14. always [url=home.php?mod=space&uid=775551]@[/url] (posedge ext_clk_50M)//scan clk

  15. if(cnt == 32'd10_000)
  16. begin
  17.         cnt <= 32'd0;
  18.         div_clk_1K <= ~div_clk_1K;
  19. end
  20. else cnt <= cnt + 32'd1;

  21. always @ (posedge ext_clk_50M)//time clk

  22. if(cnt1 == 32'd25_000_000)
  23. begin
  24.         cnt1 <= 32'd0;
  25.         div_clk_1Hz <= ~div_clk_1Hz;
  26. end
  27. else cnt1 <= cnt1 + 32'd1;
  28. ////////////////////////////////////////////////////////////////
  29. always @(posedge div_clk_1Hz)

  30. if(sec == 8'd59)
  31. begin
  32.          sec <= 8'd0;
  33.          min <= min + 8'd1;
  34.          if(min == 8'd59)
  35.          begin
  36.                 min <= 8'd0;
  37.                 h <= h + 8'd1;
  38.                 if(h == 8'd23)
  39.                 h <= 8'd0;
  40.          end
  41. end

  42. else sec <= sec + 8'd1;
  43. ////////////////////////////////////////////////////////////////

  44. always @ (posedge div_clk_1K)
  45. if(duan_num == 3'b110) duan_num <= 3'b0;
  46. else duan_num <= duan_num + 3'b1;

  47. always @ (sec or min or h or duan_num)//encoder
  48.         if(duan_num == 3'b001)
  49.         begin
  50.                 wei_xuan <= 8'b0111_1111;
  51.                 case(sec % 10)
  52.                                 
  53.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  54.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  55.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  56.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  57.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  58.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  59.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  60.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  61.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  62.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  63.                 endcase
  64.         end
  65.         else if(duan_num == 3'b010)
  66.         begin
  67.                 wei_xuan <= 8'b1011_1111;
  68.                 case(sec / 10)
  69.                                 
  70.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  71.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  72.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  73.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  74.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  75.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  76.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  77.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  78.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  79.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  80.                 endcase
  81.         end
  82.         else if(duan_num == 3'b011)
  83.         begin
  84.                 wei_xuan <= 8'b1110_1111;
  85.                 case(min % 10)
  86.                                 
  87.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  88.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  89.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  90.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  91.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  92.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  93.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  94.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  95.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  96.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  97.                 endcase
  98.         end
  99.         
  100.         else if(duan_num == 3'b100)
  101.         begin
  102.                 wei_xuan <= 8'b1111_0111;
  103.                 case(min / 10)
  104.                                 
  105.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  106.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  107.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  108.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  109.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  110.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  111.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  112.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  113.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  114.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  115.                 endcase
  116.         end
  117.         else if(duan_num == 3'b101)//h
  118.         begin
  119.                 wei_xuan <= 8'b1111_1101;
  120.                 case(h % 10)
  121.                                 
  122.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  123.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  124.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  125.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  126.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  127.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  128.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  129.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  130.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  131.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  132.                 endcase
  133.         end
  134.         
  135.         else if(duan_num == 3'b110)//h
  136.         begin
  137.                 wei_xuan <= 8'b1111_1110;
  138.                 case(h / 10)
  139.                                 
  140.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  141.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  142.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  143.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  144.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  145.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  146.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  147.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  148.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  149.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  150.                 endcase
  151.         end
  152. endmodule
复制代码




代码写完使用JTAG(联合测试行动组)下载观看效果

HDL语言数码管时钟.mp4 (1.15 MB, 下载次数: 11)

数码管的效果是这样:




效果是这样的,看起来有点不太符合我们日常的观看习惯,我们对代码做个修改,让效果看起来更舒适。
  1. module smg(
  2.                         input ext_clk_50M,
  3.                         inout reg div_clk_1K,
  4.                         output reg[7:0]wei_xuan,
  5.                         output reg[7:0]duan_xuan
  6.                         );

  7. reg [31:0]cnt;
  8. reg [31:0]cnt1;//time
  9. reg div_clk_1Hz;

  10. reg [7:0]sec;
  11. reg [7:0]min;
  12. reg [7:0]h;

  13. reg [3:0]duan_num;


  14. always @ (posedge ext_clk_50M)//scan clk

  15. if(cnt == 32'd10_000)
  16. begin
  17.         cnt <= 32'd0;
  18.         div_clk_1K <= ~div_clk_1K;
  19. end
  20. else cnt <= cnt + 32'd1;

  21. always @ (posedge ext_clk_50M)//time clk

  22. if(cnt1 == 32'd25_000_000)
  23. begin
  24.         cnt1 <= 32'd0;
  25.         div_clk_1Hz <= ~div_clk_1Hz;
  26. end
  27. else cnt1 <= cnt1 + 32'd1;
  28. ////////////////////////////////////////////////////////////////
  29. always @(posedge div_clk_1Hz)

  30. if(sec == 8'd59)
  31. begin
  32.          sec <= 8'd0;
  33.          min <= min + 8'd1;
  34.          if(min == 8'd59)
  35.          begin
  36.                 min <= 8'd0;
  37.                 h <= h + 8'd1;
  38.                 if(h == 8'd23)
  39.                 h <= 8'd0;
  40.          end
  41. end

  42. else sec <= sec + 8'd1;
  43. ////////////////////////////////////////////////////////////////

  44. always @ (posedge div_clk_1K)
  45. if(duan_num == 4'b1000) duan_num <= 4'b0;
  46. else duan_num <= duan_num + 4'b1;

  47. always @ (sec or min or h or duan_num)//encoder
  48.         if(duan_num == 4'b0001)
  49.         begin
  50.                 wei_xuan <= 8'b0111_1111;
  51.                 case(sec % 10)
  52.                                 
  53.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  54.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  55.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  56.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  57.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  58.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  59.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  60.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  61.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  62.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  63.                 endcase
  64.         end
  65.         else if(duan_num == 4'b0010)
  66.         begin
  67.                 wei_xuan <= 8'b1011_1111;
  68.                 case(sec / 10)
  69.                                 
  70.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  71.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  72.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  73.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  74.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  75.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  76.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  77.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  78.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  79.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  80.                 endcase
  81.         end
  82.         else if(duan_num == 4'b0011)
  83.         begin
  84.                 wei_xuan <= 8'b1110_1111;
  85.                 case(min % 10)
  86.                                 
  87.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  88.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  89.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  90.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  91.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  92.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  93.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  94.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  95.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  96.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  97.                 endcase
  98.         end
  99.         
  100.         else if(duan_num == 4'b0100)
  101.         begin
  102.                 wei_xuan <= 8'b1111_0111;
  103.                 case(min / 10)
  104.                                 
  105.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  106.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  107.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  108.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  109.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  110.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  111.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  112.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  113.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  114.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  115.                 endcase
  116.         end
  117.         else if(duan_num == 4'b0101)//h
  118.         begin
  119.                 wei_xuan <= 8'b1111_1101;
  120.                 case(h % 10)
  121.                                 
  122.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  123.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  124.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  125.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  126.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  127.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  128.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  129.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  130.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  131.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  132.                 endcase
  133.         end
  134.         
  135.         else if(duan_num == 4'b0110)//h
  136.         begin
  137.                 wei_xuan <= 8'b1111_1110;
  138.                 case(h / 10)
  139.                                 
  140.                         8'd0: duan_xuan <= 8'b1100_0000;//0

  141.                         8'd1: duan_xuan <= 8'b1111_1001;//1

  142.                         8'd2: duan_xuan <= 8'b1010_0100;//2

  143.                         8'd3: duan_xuan <= 8'b1011_0000;//3

  144.                         8'd4: duan_xuan <= 8'b1001_1001;//4

  145.                         8'd5: duan_xuan <= 8'b1001_0010;//5

  146.                         8'd6: duan_xuan <= 8'b1000_0011;//6

  147.                         8'd7: duan_xuan <= 8'b1111_1000;//7

  148.                         8'd8: duan_xuan <= 8'b1000_0000;//8

  149.                         8'd9: duan_xuan <= 8'b1001_0000;//9
  150.                 endcase
  151.         end
  152.         else if(duan_num == 4'b0111)//-
  153.         begin
  154.                 wei_xuan <= 8'b1111_1011;
  155.                 duan_xuan <= 8'b1011_1111;//-
  156.                
  157.         end
  158.         else if(duan_num == 4'b1000)//-
  159.         begin
  160.                 wei_xuan <= 8'b1101_1111;
  161.                 duan_xuan <= 8'b1011_1111;//-
  162.                
  163.         end
  164. endmodule
复制代码



修改完的效果如下所示,个人感觉看出来比较舒服:


8位数码管.mp4 (1.16 MB, 下载次数: 9)

最后分享一下工程,方便大家使用下载:


4.4、数码管动态显示(时分秒).rar (1.15 MB, 下载次数: 35)

4.5、数码管动态显示(时分秒8段).rar (1.17 MB, 下载次数: 68)

欢迎大家讨论交流。


TIM图片20190426194806.jpg (1.5 MB, 下载次数: 0)

TIM图片20190426194806.jpg
此帖出自创意市集论坛
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表