当前位置:   article > 正文

数字时钟计数器(Verilog HDL语言描述)(仿真和综合)_verilog数字时钟设计报告

verilog数字时钟设计报告

目录

前言

主题

Verilog HDL设计代码

测试代码

仿真波形

ISE中综合

RTL Schematic

Technology Schematic


前言

数字时钟计数器和我的前一篇博文:级联模60计数器(Verilog HDL语言描述)(仿真与综合)的级联思路几乎一样。

数字时钟计数器的秒、分用的是模60计数器,而时用的是模24计数器,所以呢,这篇博文可以先参考上两篇博文:

模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)

数字时钟计数器就是调用这两个模块组成的,思路我就不在写了,繁琐。直接看级联模60计数器就好了,反正都是级联的。

主题

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

我建议看完我的前几篇博文再看这篇,因为这篇博文的模块都是调用前面的,且我都疲惫了,懒着写注释了。

我的测试代码很简单,就是让它计数而已,计数看看对不对。

仿真波形

贴出来第一张是为了看开头部分仿真图

然后就是秒计数到59,分加1:

再者就是分计数到59,时加1:

可见,设计功能正确。

ISE中综合

RTL Schematic

展开

再展开

可见,从这个过程中,知道一个大的模块是由各个小的模块组成的,不在赘述了。

Technology Schematic

这个图是FPGA中的电路图,已经看不清楚了,没关系,仅供参考,也不是给你细看的,它体现了FPGA内部这个电路是如何构成的,是由FPGA的LUT以及其他原件,它特有的方式实现了各种电路,可见是很强大了。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/562146
推荐阅读
  

闽ICP备14008679号