当前位置:   article > 正文

奇偶分频电路设计(任意占空比、50%占空比)_用数字系统做的占空比为50%的任意偶数次5分频电路

用数字系统做的占空比为50%的任意偶数次5分频电路

一、概述

分频电路一般就是以输入源时钟为参考,将其进行降频输出;分频可以使用锁相环时钟资源实现,也可以计数为基础,进行分频设计。本文主要记录后者的相关问题。

二、偶分频

1、一些概念

分频数:即降频倍数,可以为奇数也可以为偶数;如源时钟为24MHZ,它的偶分频如4分频为6MHZ、它的奇分频如3分频为8MHZ;

占空比:一个周期内高电平持续时间所占的比例,即:高电平持续时间➗周期时间

 2、偶分频实现

偶数分频容易实现,假设源时钟为clk,分频系数为N,分频输出为divout,则偶分频可以通过N计数很简单的实现;

不限定占空比:每次clk来临计数一次,N次计数完成所需时间即为N分频时钟周期时间;N次计数的前M次计数divout输出为1,后N-M次计数divout反向;即可实现占空比为M/N的N分频设计;

1/2占空比:N为偶数时,M可以直接取为N/2(仍为整数)即可实现1/2占空比的N分频设计;N为奇数时,M不是整数,因此难以直接套用偶分频的实现方式(因为计数值只能为整数,不会出现2.5这种值)

三、奇分频

假设源时钟为clk,分频系数为N(为奇数),分频输出为divout;

1、不限定占空比

不限定占空比时与偶分频类似,每次clk来临计数一次,N次计数完成所需时间即为N分频时钟周期时间;N次计数的前M次计数divout输出为1,后N-M次计数divout反向;即可实现占空比为M/N的N分频设计;

2、1/2占空比

积分频时,N为奇数时,N/2不是整数,因此难以直接套用偶分频的实现方式。此处记录了两种实现方式:

  • 分频延迟相或(与):

clk上升沿来临时计数,前(N-1)/2计数时div1输出1,随后(N+1)计数时div1输出为0;此时形成一个N分频,但是占空比为(N-1)/2N=1/2-1/2N的中间时钟;

与此同时,在clk下降沿时,令div2<=div1;即div2相比于div1延迟了半个clk周期;

divout=div1|div2,拓展了中间时钟div1的占空比为1/2;

1/2占空比,5分频电路实现代码如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer: guoliang CLL
  5. //
  6. // Create Date: 2020/02/17 13:33:35
  7. // Design Name:
  8. // Module Name: clk_5div_1
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description: test of 5 divide of clk
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module clk_5div_1(
  22. input clk,
  23. input rst_n,
  24. output divout
  25. );
  26. //
  27. reg [2:0]count;
  28. reg div1,div2;
  29. // count declaration
  30. always@(posedge clk or negedge rst_n)
  31. begin
  32. if(!rst_n)
  33. begin
  34. count <= 3'd0;
  35. end
  36. else if(count == 3'd4)
  37. begin
  38. count <= 3'd0;
  39. end
  40. else
  41. begin
  42. count <= count+1'd1;
  43. end
  44. end
  45. // divclk1 declaration
  46. always@(posedge clk or negedge rst_n)
  47. begin
  48. if(!rst_n)
  49. begin
  50. div1 <= 1'b0;
  51. end
  52. else if(count == 3'd0)
  53. begin
  54. div1 <= 1'b1;
  55. end
  56. else if(count == 3'd2)
  57. begin
  58. div1 <= 1'b0;
  59. end
  60. else
  61. begin
  62. div1 <= div1;
  63. end
  64. end
  65. // divclk2 declaration
  66. always@(negedge clk or negedge rst_n)
  67. begin
  68. if(!rst_n)
  69. begin
  70. div2 <= 1'b0;
  71. end
  72. else
  73. begin
  74. div2 <= div1;//delay 1period of div1
  75. end
  76. end
  77. // divclkout declaration
  78. assign divout = div1 | div2;
  79. endmodule

测试文件如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2020/02/17 13:54:02
  7. // Design Name:
  8. // Module Name: clk_div_tsb
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module clk_div_tsb(
  22. );
  23. //port declaration
  24. reg clk;
  25. reg rst_n;
  26. wire divout;
  27. //
  28. initial
  29. begin
  30. rst_n = 1'b1;
  31. clk = 1'b1;
  32. #20 rst_n = 1'b0;
  33. #20 rst_n = 1'b1;
  34. end
  35. always #5 clk = ~clk;
  36. // instance
  37. clk_5div_1 mdiv(
  38. //clk_5div_2 mdiv(
  39. //clk_5div_3 mdiv(
  40. .clk(clk),
  41. .rst_n(rst_n),
  42. .divout(divout)
  43. );
  44. endmodule

 仿真结果如下:

分析可知,功能正确;

RTL电路如下:

  • 双边沿计数:

 1/2奇数分频是否有另一种更简单的实现方式?如时钟上升与下降沿均进行计数时,因为是双边沿计数,就算分频数N为奇数,分频结果周期时间也是源时钟clk驱动下偶数次计数(2N)对应时间;因此1/2占空比奇分频可以类似偶数分频一样,计数N次输出divout反转一次,即可实现1/2占空比的奇分频设计;
仍为1/2占空比的5分频电路设计如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2020/02/17 14:10:15
  7. // Design Name:
  8. // Module Name: clk_5div_2
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description: correct in language but wrong in circuit
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module clk_5div_2(
  22. input clk,
  23. input rst_n,
  24. output reg divout
  25. );
  26. //
  27. reg [2:0]count;
  28. wire clk_r;
  29. // reverse clk
  30. assign clk_r = ~clk;
  31. // count declaration
  32. always@(posedge clk or posedge clk_r or negedge rst_n)
  33. begin
  34. if(!rst_n)
  35. begin
  36. count <= 3'd0;
  37. end
  38. else if(count == 3'd4)
  39. begin
  40. count <= 3'd0;
  41. end
  42. else
  43. begin
  44. count <= count + 3'd1;
  45. end
  46. end
  47. // divout declaration
  48. always@(posedge clk or posedge clk_r or negedge rst_n)
  49. begin
  50. if(!rst_n)
  51. begin
  52. divout <= 1'b0;
  53. end
  54. else if(count == 3'd4)
  55. begin
  56. divout <= ~divout;
  57. end
  58. else
  59. begin
  60. divout <= divout;
  61. end
  62. end
  63. endmodule

测试文件不变(实例化时名称不同)

行为仿真结果如下:

可以看出测试功能正确;  

但是真能这样设计分频电路吗?答案是不能,因为Verilog不仅仅是一门语言,它描述的永远更是硬件电路;满足语法要求,行为仿真验证通过的设计,并不一定能够综合;

电路综合出错:

详细分析会在Verilog中always@()语句双边沿触发(语法与综合的差异)部分进行记录;

四、参考与致谢

学习这些知识时参考了一些前辈大神的博客,他们的精彩分析以及严谨的态度让我获益匪浅,感谢他们。

在此附上参考文献:

【Verilog HDL 训练】第 11 天(分频电路)

【FPGA】分频电路设计(Verilog HDL设计)(良心博文)
 

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

闽ICP备14008679号