0


Verilog-实现时钟分频(1KHZ、奇、偶分频,占空比为50%)

文章目录

一、将系统时钟50MHZ分为占空比为50%的1khz时钟

  1. 本篇文章使用Xilinx公司的ISE软件
  2. 1. 频率:1HZ 周期为1/1HZ=1s。按照这个计算公式计算出频率为1khz的周期为1ms
  3. 2. 因为占空比为50%,在写代码时需要一个0.5ms的计数器
  4. PS: 占空比:占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。(在FPGA中我的理解为高电平在一个时钟周期所占的时间)
  1. <代码如下>

1khz分频代码

  1. module clk_1KHZ(clk,rst_n,clk_1khz );
  2. input clk ; //50MHZ
  3. input rst_n ;
  4. output reg clk_1khz ; //T=1ms 占空比为50%
  5. reg[17:0] cnt;
  6. always @(posedge clk or negedge rst_n)
  7. begin
  8. if(!rst_n)
  9. cnt <= 1'b0;
  10. else if (cnt == 18'd25_000 - 1)//
  11. cnt <= 18'd0;
  12. else
  13. cnt <= cnt + 1'b1;
  14. end
  15. always @(posedge clk or negedge rst_n)
  16. begin
  17. if(!rst_n)
  18. clk_1khz <= 1'b0;
  19. else if (cnt == 18'd24_999)
  20. clk_1khz <= ~clk_1khz ;
  21. else
  22. clk_1khz <= clk_1khz ;
  23. end
  24. endmodule

1khz分频-testbench

  1. module tb;
  2. // Inputs
  3. reg clk;
  4. reg rst_n;
  5. // Outputs
  6. wire clk_1khz;
  7. // Instantiate the Unit Under Test (UUT)
  8. clk_1KHZ uut (
  9. .clk(clk),
  10. .rst_n(rst_n),
  11. .clk_1khz(clk_1khz)
  12. );
  13. always #10 clk = ~clk;
  14. initial begin
  15. clk = 0;
  16. rst_n = 0;
  17. #100;
  18. rst_n=1;
  19. end
  20. endmodule

仿真图如下

image

二、偶数分频:

  • 通过计数器实现,进行N倍偶数分频,通过时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,以此循环下去。(占空比为50%) ,以下代码实现8分频,可根据实际需求改变参数输出需要的时钟。
  1. <代码如下>

偶数分频代码

  1. module clk_div_o(clk,rst_n,div_clk_out);
  2. input clk ;
  3. input rst_n ;
  4. output div_clk_out ;
  5. //偶数分频部分
  6. parameter N = 8 ;
  7. reg div_clk_out;
  8. reg [7:0] cnt ;
  9. always @ (posedge clk or negedge rst_n)
  10. begin
  11. if(!rst_n)
  12. begin
  13. cnt <= 1; //从1计数
  14. div_clk_out <= 0;
  15. end
  16. else begin
  17. if(cnt==N/2)
  18. begin
  19. div_clk_out <= ~div_clk_out;
  20. cnt <= 1;
  21. end
  22. else
  23. cnt <= cnt + 1;
  24. end
  25. end
  26. endmodule

偶数分频testbench

  1. module tb;
  2. // Inputs
  3. reg clk;
  4. reg rst_n;
  5. // Outputs
  6. wire div_clk_out;
  7. // Instantiate the Unit Under Test (UUT)
  8. clk_div_o uut (
  9. .clk(clk),
  10. .rst_n(rst_n),
  11. .div_clk_out(div_clk_out)
  12. );
  13. always #10 clk = ~clk;
  14. initial begin
  15. // Initialize Inputs
  16. clk = 0;
  17. rst_n = 0;
  18. #100
  19. rst_n = 1;
  20. end
  21. endmodule

仿真图如下:

三、奇数分频:

  • 以7分频为例。接下来会介绍两种实现方法(占空比为50%) (1)高电平:低电平 = 4 :3(即 1:0 = 4 :3) (2)低电平:高电平 = 4 :3(即 0:1 = 4 :3) 二者实现方式相同,这里只介绍第一种方法 时序图如下image 由时序图看出分别用时钟上升沿和下降沿得到高电平:低电平 = 4 :3,然后将两者相与就可以得到7分频占空比为50%的时钟<代码如下>
    奇数分频代码
  1. module clk_div_j(clk,rst_n,clk_out );
  2. input clk ;
  3. input rst_n ;
  4. output clk_out;
  5. parameter N = 7;//分频数
  6. reg [7:0] cnt_1;
  7. reg [7:0] cnt_2;
  8. reg clk_pos,clk_neg;
  9. // 1:0 4:3 &
  10. // 0:1 4:3 |
  11. always @(posedge clk or negedge rst_n) //上升沿输出clk_pos
  12. begin
  13. if(!rst_n)
  14. begin
  15. clk_pos <= 0;
  16. cnt_1 <= 1; //这里计数器从1开始
  17. end
  18. else
  19. begin
  20. if(clk_pos == 1)
  21. begin
  22. if(cnt_1 == (N+1)/2) //4
  23. begin
  24. clk_pos <= ~clk_pos;
  25. cnt_1 <= 1;
  26. end
  27. else
  28. cnt_1 <= cnt_1 + 1;
  29. end
  30. else if(cnt_1 == (N-1)/2) //3
  31. begin
  32. clk_pos <= ~clk_pos;
  33. cnt_1 <= 1;
  34. end
  35. else
  36. cnt_1 <= cnt_1 + 1;
  37. end
  38. end
  39. always @(negedge clk or negedge rst_n)
  40. //下降沿输出clk_neg
  41. begin
  42. if(!rst_n)
  43. begin
  44. clk_neg <= 0;
  45. cnt_2 <= 1;
  46. end
  47. else
  48. begin
  49. if(clk_neg == 1)
  50. begin
  51. if(cnt_2 == (N+1)/2) //4
  52. begin
  53. clk_neg <= ~clk_neg;
  54. cnt_2 <= 1;
  55. end
  56. else
  57. cnt_2 <= cnt_2+1;
  58. end
  59. else
  60. if(cnt_2 == (N-1)/2) //3
  61. begin
  62. clk_neg <= ~clk_neg;
  63. cnt_2 <= 1;
  64. end
  65. else
  66. cnt_2 <= cnt_2+1;
  67. end
  68. end
  69. assign clk_out = clk_pos & clk_neg;
  70. endmodule

奇数分频testbench

  1. module tb;
  2. // Inputs
  3. reg clk;
  4. reg rst_n;
  5. // Outputs
  6. wire clk_out;
  7. // Instantiate the Unit Under Test (UUT)
  8. clk_div_j uut (
  9. .clk(clk),
  10. .rst_n(rst_n),
  11. .clk_out(clk_out)
  12. );
  13. always #10 clk = ~clk;
  14. initial begin
  15. clk = 0;
  16. rst_n = 0;
  17. #100;
  18. rst_n = 1;
  19. end
  20. endmodule

仿真图如下:

image

本篇随笔为学习记录所用,如有错误,请各位指正批评。

标签: fpga开发

本文转载自: https://blog.csdn.net/Anzg256/article/details/130119500
版权归原作者 Anzg256 所有, 如有侵权,请联系我们删除。

“Verilog-实现时钟分频(1KHZ、奇、偶分频,占空比为50%)”的评论:

还没有评论