当前位置:   article > 正文

使用Verilog来实现奇数分频_奇数分频器verilog

奇数分频器verilog

        通常在面试中面试官可能会问到关于奇数分频的实现,比如三分频,五分频,七分频等,根据自己推敲和理解,并且总结规律,给出自己对于奇数分频的实现。首先,为了更好理解什么是三分频,五分频,七分频等,我们假设一个输入时钟的时钟周期为1s,则三分频后的输出时钟clk_out的时钟周期则为3s,同理,五分频的为5s,七分频的为7s,为了实现奇数分频,我们首先需要两个计数器,用来数时钟周期个数,一个以时钟上升沿为起点开始数,一个以时钟下降沿为起点开始数,并用这两个计数器来设计得到clk_s和clk_x,则clk_out就等于clk_s和clk_x相与,现在似乎难理解一点,我们先通过代码进行实现,并对波形进行查看就方便理解了

先以三分频为例,先定义两个计数器

上升沿计数器cnt_s如下:

  1. always @(posedge clk or negedge rst_n)begin
  2. if(!rst_n)begin
  3. cnt_s<=0;
  4. end
  5. else if(add_cnt_s)begin //add_cnt_s表示计数开始条件
  6. if(end_cnt_s) //end_cnt_s表示计数结束条件
  7. cnt_s<=0;
  8. else
  9. cnt_s<=cnt_s+1;
  10. end
  11. end
  12. assign add_cnt_s=1; //这个让它一直计数
  13. assign end_cnt_s=add_cnt_s && cnt_s==3-1;

下降沿计数器cnt_x如下:

  1. always @(negedge clk or negedge rst_n)begin
  2. if(!rst_n)begin
  3. cnt_x<=0;
  4. end
  5. else if(add_cnt_x)begin //add_cnt_x表示计数开始条件
  6. if(end_cnt_x) //end_cnt_x表示计数结束条件
  7. cnt_x<=0;
  8. else
  9. cnt_x<=cnt_x+1;
  10. end
  11. end
  12. assign add_cnt_x=1; //这个让它一直计数
  13. assign end_cnt_x=add_cnt_x && cnt_x==3-1;

其总的设计代码如下:

  1. module sanfenpin(clk,rst_n,clk_out);
  2. input clk;
  3. input rst_n;
  4. output clk_out;
  5. reg[3:0] cnt_s;
  6. wire add_cnt_s;
  7. wire end_cnt_s;
  8. reg[3:0] cnt_x;
  9. wire add_cnt_x;
  10. wire end_cnt_x;
  11. reg clk_s;
  12. reg clk_x;
  13. wire clk_out;
  14. always @(posedge clk or negedge rst_n)begin
  15. if(!rst_n)begin
  16. cnt_s<=0;
  17. end
  18. else if(add_cnt_s)begin //add_cnt_s表示计数开始条件
  19. if(end_cnt_s) //end_cnt_s表示计数结束条件
  20. cnt_s<=0;
  21. else
  22. cnt_s<=cnt_s+1;
  23. end
  24. end
  25. assign add_cnt_s=1; //这个让它一直计数
  26. assign end_cnt_s=add_cnt_s && cnt_s==3-1;
  27. always @(negedge clk or negedge rst_n)begin
  28. if(!rst_n)begin
  29. cnt_x<=0;
  30. end
  31. else if(add_cnt_x)begin //add_cnt_x表示计数开始条件
  32. if(end_cnt_x) //end_cnt_x表示计数结束条件
  33. cnt_x<=0;
  34. else
  35. cnt_x<=cnt_x+1;
  36. end
  37. end
  38. assign add_cnt_x=1; //这个让它一直计数
  39. assign end_cnt_x=add_cnt_x && cnt_x==3-1;
  40. always @(posedge clk or negedge rst_n)begin //上升沿计数,设计clk_s
  41. if(rst_n==1'b0)begin
  42. clk_s<=0;
  43. cnt_s<=0;
  44. end
  45. else if(add_cnt_s && cnt_s==1-1)begin
  46. clk_s<=0;
  47. end
  48. else if (add_cnt_s &&cnt_s==2-1)begin
  49. clk_s<=1;
  50. end
  51. end
  52. always @(negedge clk or negedge rst_n)begin //下降沿计数,定义clk_x
  53. if(rst_n==1'b0)begin
  54. clk_x<=0;
  55. cnt_x<=0;
  56. end
  57. else if(add_cnt_x && cnt_x==1-1)begin
  58. clk_x<=0;
  59. end
  60. else if (add_cnt_x &&cnt_x==2-1)begin
  61. clk_x<=1;
  62. end
  63. end
  64. assign clk_out= clk_s & clk_x;
  65. endmodule

输入时钟和复位信号,其测试代码如下:

  1. module sanfenpin_tb;
  2. parameter cycle=10;
  3. reg clk;
  4. reg rst_n;
  5. wire clk_out;
  6. sanfenpin uut(
  7. .clk(clk),
  8. .rst_n(rst_n),
  9. .clk_out(clk_out)
  10. );
  11. initial begin
  12. clk=0;
  13. forever #(cycle/2) begin
  14. clk=~clk;
  15. end
  16. end
  17. initial begin
  18. #1;
  19. rst_n=0;
  20. #(100*cycle);
  21. rst_n=1;
  22. end
  23. endmodule

运行仿真,其波形如下:

 从波行可以看出,clk_out的周期等于三个clk的周期,说明设计符合要求,对于五分频,测试代码不用变,我们只需要使两个计数器数五个时钟周期,并且使clk_s和clk_x过两个时钟周期后跳变,如下

  1. always @(posedge clk or negedge rst_n)begin
  2. if(rst_n==1'b0)begin
  3. clk_s<=0;
  4. cnt_s<=0;
  5. end
  6. else if(add_cnt_s && cnt_s==1-1)begin
  7. clk_s<=0;
  8. end
  9. else if (add_cnt_s &&cnt_s==3-1)begin //clk_s为0和1相隔两个时钟周期,clk_x也是如此
  10. clk_s<=1;
  11. end
  12. end
  13. always @(negedge clk or negedge rst_n)begin
  14. if(rst_n==1'b0)begin
  15. clk_x<=0;
  16. cnt_x<=0;
  17. end
  18. else if(add_cnt_x && cnt_x==1-1)begin
  19. clk_x<=0;
  20. end
  21. else if (add_cnt_x &&cnt_x==3-1)begin
  22. clk_x<=1;
  23. end
  24. end

其波形图如下

 同理七分频,则相隔三个时钟周期进行跳变,运行仿真后,其波形如下:

 通过观察波形,说明设计符合要求,至此,可以总结出规律,N(为奇数)分频,需要定义两个计数器,分别以上升沿和下降沿为起始,计N个数,而clk_s和clk_x相隔(N-1)/2个clk周期后跳变,值得注意的是,上述分频的实现占空比都是百分之五十(高电平的占比),这也迎合大部分的设计要求,其次,随着分频数的增加,计数器的位宽也需要作出调整,至此,奇数分频的实现就总结完成

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

闽ICP备14008679号