当前位置:   article > 正文

verilog实现半整数分频(简单版)_2.5分频verilog

2.5分频verilog

大家好,最近写了一下半整数分频的verilog代码(半整数是指含有0.5的小数,如2.5, 3.5, 4.5, 6.5,等等),进行了仿真和验证,下面将代码附上,需要请自取。

一、上代码

  1. `timescale 1ns / 1ps
  2. ///
  3. module CLK_DIV_HALF
  4. #(
  5. parameter Multiple = 7//Multiple表示的是倍频*27表示是3.5倍分频。
  6. )
  7. (
  8. input sys_rst,
  9. input sys_clk,
  10. output clk_div ,
  11. output [15:0] cnt,
  12. output clk_P,
  13. output clk_N
  14. );
  15. reg [15:0] cnt=16'b0;
  16. always@(posedge sys_clk)
  17. begin
  18. if(sys_rst) //复位信号,高有效
  19. begin
  20. cnt <= 16'b0;
  21. end
  22. else
  23. if(cnt == (Multiple -1))
  24. begin
  25. cnt <=16'b0;
  26. end
  27. else
  28. begin
  29. cnt <= cnt + 1'b1 ;
  30. end
  31. end
  32. //----------------------------------//
  33. reg clk_P=1'b0;
  34. always@(posedge sys_clk)
  35. begin
  36. if(sys_rst) //复位信号,高有效
  37. begin
  38. clk_P <= 1'b0;
  39. end
  40. else
  41. if(cnt == 16'd0 || cnt == Multiple/2+1)
  42. begin
  43. clk_P <= 1'b1 ;
  44. end
  45. else
  46. begin
  47. clk_P <= 1'b0 ;
  48. end
  49. end
  50. //--------------------------------//
  51. reg clk_N=1'b0;
  52. always@(negedge sys_clk)
  53. begin
  54. if(sys_rst) //复位信号,高有效
  55. begin
  56. clk_N <= 1'b0 ;
  57. end
  58. else
  59. if( cnt == Multiple/2+1)
  60. begin
  61. clk_N <=1'b1;
  62. end
  63. else
  64. begin
  65. clk_N <= 1'b0 ;
  66. end
  67. end
  68. //--------------------------------//
  69. assign clk_div = clk_P | clk_N ;
  70. endmodule

二、上仿真代码

  1. `timescale 1ns / 1ps
  2. //
  3. module CLK_DIV_HALF_TB;
  4. // Inputs
  5. reg sys_rst;
  6. reg sys_clk;
  7. // Outputs
  8. wire clk_div;
  9. wire [15:0] cnt;
  10. wire clk_P;
  11. wire clk_N;
  12. // Instantiate the Unit Under Test (UUT)
  13. CLK_DIV_HALF uut (
  14. .sys_rst(sys_rst),
  15. .sys_clk(sys_clk),
  16. .clk_div(clk_div),
  17. .cnt(cnt),
  18. .clk_P(clk_P),
  19. .clk_N(clk_N)
  20. );
  21. initial begin
  22. // Initialize Inputs
  23. sys_rst = 1;
  24. sys_clk = 0;
  25. // Wait 100 ns for global reset to finish
  26. #100;sys_rst = 0;
  27. forever #500 sys_clk=~sys_clk;
  28. // Add stimulus here
  29. end
  30. endmodule

三、上仿真结果

图1:仿真结果3.5倍分频

 

由图可知,本代码通过上升沿和下降沿产生的两个时钟分频信号clk_P和clk_N,并进行“或”运算得到了3.5倍的分频效果。其中半整数分频中无法实现50%占空比效果。

下面对上述仿真结果进行解释:

①sys_clk是系统时钟,本代码中作为被分频时钟。

②clk_div是分频后时钟。

③cnt是计数器,作为分频计数使用。

④sys_rst是复位信号,高有效。

⑤clk_P是上升沿有效的时钟,clk_N是下降沿有效的时钟信号。

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

闽ICP备14008679号