数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码)

举报
李锐博恩 发表于 2021/07/15 09:00:01 2021/07/15
【摘要】 目录 前言 模60计数器 verilog设计代码如下: ISE综合 模24的8421BCD码计数器 原理 verilog HDL代码 测试文件 仿真波形 数字时钟计数器 verilog HDL代码 测试代码 仿真波形 ISE综合 前言 这是我刚开始写博客时候写的了,本身结构很丑,我于2018/8/2 15:26重新整理了下结构,就不删了...

目录

前言

模60计数器

verilog设计代码如下:

ISE综合

模24的8421BCD码计数器

原理

verilog HDL代码

测试文件

仿真波形

数字时钟计数器

verilog HDL代码

测试代码

仿真波形

ISE综合


前言

这是我刚开始写博客时候写的了,本身结构很丑,我于2018/8/2 15:26重新整理了下结构,就不删了,然后我又重新整理了一份博文,和这个一样,但要比这个清晰,贴出地址:数字时钟计数器(Verilog HDL语言描述)(仿真和综合),可以看这篇以及相关的那几个小模块部分。

简单的数字时钟计数器,其实现方法也是通过计数器的级联,由两个模60计数器和一个模24计数器子模块共同构成,下面的这段代码采用结构性描述方法,U1,U2,U3为调用的两个模60计数器和一个模24计数器子模块,模60计数器实现分秒的计数,模24计数器实现小时的计数。

在进行设计数字时钟计数器之前,分别介绍模60计数器count60以及8421BCD计数器count24。

模60计数器

verilog设计代码如下:


  
  1. //模60计数器模块
  2. module counter60(clk, rst_n, en, dout, co);
  3. input clk, rst_n, en;
  4. output co;
  5. output [7:0] dout;
  6. wire co10_1, co10, co6;
  7. wire [3:0] dout10, dout6;
  8. count10 U1(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1));
  9. count6 U2(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6));
  10. and U3(co, co10, co6);
  11. and U4(co10, en, co10_1);
  12. assign dout = {dout6, dout10};
  13. endmodule
  14. //模10计数器
  15. module count10(clk, rst_n, en, dout, co);
  16. input clk, rst_n, en;
  17. output co;
  18. output [3:0] dout;
  19. reg [3:0] dout;
  20. always @ (posedge clk or negedge rst_n)
  21. begin
  22. if(!rst_n)
  23. dout <= 4'b0000;
  24. else if(en == 1'b1)
  25. begin
  26. if(dout == 4'b1001)
  27. dout <= 4'b0000;
  28. else
  29. dout <= dout + 1'b1;
  30. end
  31. else
  32. dout <= dout;
  33. end
  34. assign co = dout[0] & dout[3];
  35. endmodule
  36. //模6计数器
  37. module count6(clk, rst_n, en, dout, co);
  38. input clk, rst_n, en;
  39. output co;
  40. output [3:0] dout;
  41. reg [3:0] dout;
  42. always @(posedge clk or negedge rst_n)
  43. begin
  44. if(!rst_n)
  45. dout <= 4'b0000;
  46. else if(en == 1'b1)
  47. begin
  48. if(dout == 4'b0101)
  49. dout <= 4'b0000;
  50. else
  51. dout <= dout + 1;
  52. end
  53. else
  54. dout <= dout;
  55. end
  56. assign co = dout[0] & dout[2];
  57. endmodule

ISE综合

综合工具综合而出的电路如下:

 

 

模24的8421BCD码计数器

原理

计数器实现的模制为24,clr为异步清零信号,当时钟上升沿到来或clr下降沿到来,

clr = 0时,计数器清零为0000_0000。该计数器的计数过程为,当输出信号的低4位(即 dout[3:0])从0000计数到1001后(即十进制的0 ~ 9),高4位(即dout[3:4])计数加1,当计数计到23时(即0010_0011),计数器又清零为0000_0000,然后重新开始计数。

 

verilog HDL代码


  
  1. //8421BCD码计数器,模24
  2. module counter24(clk, rst_n, en, dout);
  3. input clk, rst_n, en;
  4. output[7:0] dout;
  5. reg[7:0] dout;
  6. always@(posedge clk or negedge rst_n) //异步复位
  7. begin
  8. if(!rst_n) //复位信号有效时,输出清零
  9. dout <= 8'b00000000;
  10. else if(en == 1'b0) //计数使能无效时,输出不变
  11. dout <= dout;
  12. else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) ) //计数达到23时,输出清零
  13. dout <= 8'b00000000;
  14. else if(dout[3:0] == 4'b1001) //低位达到9时,低位清零,高位加1
  15. begin
  16. dout[3:0] <= 4'b0000;
  17. dout[7:4] <= dout[7:4] + 1'b1;
  18. end
  19. else //上述情况都没有发生,则高位不变,低位加1
  20. begin
  21. dout[7:4] <= dout[7:4];
  22. dout[3:0] <= dout[3:0] + 1'b1;
  23. end
  24. end
  25. endmodule

测试文件


  
  1.  `timescale 1ns/1ps  
  2.  module count24_tb;  
  3.      reg clk, clr, en;  
  4.      wire [7:0] dout;  
  5.      always  
  6.          begin  
  7.              #10 clk = ~clk;  
  8.          end  
  9.      initial  
  10.          begin  
  11.              clk = 1'b0;  
  12.              clr = 1'b1;  
  13.              en = 1'b0;  
  14.              #20 clr = 1'b0;  
  15.              #10 clr = 1'b1;  
  16.              #30 en = 1'b1;  
  17.              #100;  
  18.          end  
  19.            
  20.      count24 U1(.clk(clk), .clr(clr), .en(en), .dout(dout));  
  21.  endmodule  

仿真波形

在Modelsim中仿真得到的波形为:(为了能看清,截了一部分图片)

 

数字时钟计数器

verilog HDL代码

下面正式给出数字时钟计数器的verilog HDL代码:


  
  1. //数字时钟计数器
  2. module digital_clock(hour,min,sec,clk,rst_n,en);
  3. input clk,rst_n,en;
  4. output[7:0] hour, min, sec;
  5. wire co_sec1,co_sec,co_min,co_min1;
  6. counter60 u1(.clk(clk), .rst_n(rst_n), .en(en), .dout(sec), .co(co_sec1));
  7. and u2(co_sec,en,co_sec1);
  8. counter60 u3(.clk(clk), .rst_n(rst_n), .en(co_sec), .dout(min), .co(co_min1));
  9. and u4(co_min,co_sec,co_min1);
  10. counter24 u5(.clk(clk), .rst_n(rst_n), .en(co_min), .dout(hour));
  11. endmodule
  12. //模60计数器模块
  13. module counter60(clk, rst_n, en, dout, co);
  14. input clk, rst_n, en;
  15. output co;
  16. output [7:0] dout;
  17. wire co10_1, co10, co6;
  18. wire [3:0] dout10, dout6;
  19. count10 U1(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1));
  20. count6 U2(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6));
  21. and U3(co, co10, co6);
  22. and U4(co10, en, co10_1);
  23. assign dout = {dout6, dout10};
  24. endmodule
  25. //模10计数器
  26. module count10(clk, rst_n, en, dout, co);
  27. input clk, rst_n, en;
  28. output co;
  29. output [3:0] dout;
  30. reg [3:0] dout;
  31. always @ (posedge clk or negedge rst_n)
  32. begin
  33. if(!rst_n)
  34. dout <= 4'b0000;
  35. else if(en == 1'b1)
  36. begin
  37. if(dout == 4'b1001)
  38. dout <= 4'b0000;
  39. else
  40. dout <= dout + 1'b1;
  41. end
  42. else
  43. dout <= dout;
  44. end
  45. assign co = dout[0] & dout[3];
  46. endmodule
  47. //模6计数器
  48. module count6(clk, rst_n, en, dout, co);
  49. input clk, rst_n, en;
  50. output co;
  51. output [3:0] dout;
  52. reg [3:0] dout;
  53. always @(posedge clk or negedge rst_n)
  54. begin
  55. if(!rst_n)
  56. dout <= 4'b0000;
  57. else if(en == 1'b1)
  58. begin
  59. if(dout == 4'b0101)
  60. dout <= 4'b0000;
  61. else
  62. dout <= dout + 1;
  63. end
  64. else
  65. dout <= dout;
  66. end
  67. assign co = dout[0] & dout[2];
  68. endmodule
  69. //8421BCD码计数器,模24
  70. module counter24(clk, rst_n, en, dout);
  71. input clk, rst_n, en;
  72. output[7:0] dout;
  73. reg[7:0] dout;
  74. always@(posedge clk or negedge rst_n) //异步复位
  75. begin
  76. if(!rst_n) //复位信号有效时,输出清零
  77. dout <= 8'b00000000;
  78. else if(en == 1'b0) //计数使能无效时,输出不变
  79. dout <= dout;
  80. else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) ) //计数达到23时,输出清零
  81. dout <= 8'b00000000;
  82. else if(dout[3:0] == 4'b1001) //低位达到9时,低位清零,高位加1
  83. begin
  84. dout[3:0] <= 4'b0000;
  85. dout[7:4] <= dout[7:4] + 1'b1;
  86. end
  87. else //上述情况都没有发生,则高位不变,低位加1
  88. begin
  89. dout[7:4] <= dout[7:4];
  90. dout[3:0] <= dout[3:0] + 1'b1;
  91. end
  92. end
  93. endmodule

测试代码


  
  1. //数字时钟计数器的测试代码
  2. module digital_clock_tb;
  3. reg clk,rst_n,en;
  4. wire[7:0] hour,min,sec;
  5. always
  6. begin
  7. #1 clk = ~clk;
  8. end
  9. initial
  10. begin
  11. clk = 1'b0;
  12. rst_n = 1'b0;
  13. en = 1'b0;
  14. #3 rst_n = 1'b1; en = 1'b1;
  15. end
  16. digital_clock u0(.clk(clk),.rst_n(rst_n),.en(en),.hour(hour),.min(min),.sec(sec));
  17. endmodule

仿真波形

在Modelsim中仿真得到如下波形图:

 

ISE综合

用综合工具综合后的数字时钟:

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/80373163

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。