• verilog实现分频(奇数分频,偶数分频,且50%占空比,通用版本)


    大家好,最近写了几个分频器实现奇数分频和偶数分频效果,且占空比满足50%,代码已经经过测试,需要可自取。感谢关注。

    一、上代码

    1. `timescale 1ns / 1ps
    2. //
    3. module CLK_DIV_ODDandEVEN50P
    4. #(
    5. parameter Multiple = 11 //Multiple表示的是倍频倍数。
    6. )
    7. (
    8. input sys_rst,
    9. input sys_clk,
    10. output clk_div ,
    11. output [15:0] cnt
    12. );
    13. wire odd ;
    14. wire even ;
    15. assign odd = (Multiple[0]==1'b1)?1'b1:1'b0; //奇数判断
    16. assign even = (Multiple[0]==1'b0)?1'b1:1'b0; //偶数判断
    17. assign clk_div = (odd)?clk_odd: (even)?clk_even:0; //将奇数或者偶数分频结果输出
    18. reg [15:0] cnt=16'b0;
    19. always@(posedge sys_clk)
    20. begin
    21. if(sys_rst) //复位信号,高有效
    22. begin
    23. cnt <= 16'b0;
    24. end
    25. else
    26. if(cnt == (Multiple -1))
    27. begin
    28. cnt <=16'b0;
    29. end
    30. else
    31. begin
    32. cnt <= cnt + 1'b1 ;
    33. end
    34. end
    35. //--------奇数分频过程------start---------//
    36. reg clk_oddP=1'b0;
    37. always@(posedge sys_clk)
    38. begin
    39. if(sys_rst) //复位信号,高有效
    40. begin
    41. clk_oddP <= 1'b0;
    42. end
    43. else
    44. if(cnt <= (Multiple /2 ))
    45. begin
    46. clk_oddP <= 1'b0 ;
    47. end
    48. else
    49. begin
    50. clk_oddP <= 1'b1 ;
    51. end
    52. end
    53. reg clk_oddN=1'b0;
    54. always@(negedge sys_clk)
    55. begin
    56. if(sys_rst) //复位信号,高有效
    57. begin
    58. clk_oddN <= 1'b0 ;
    59. end
    60. else
    61. if(cnt <= (Multiple /2))
    62. begin
    63. clk_oddN <=1'b0;
    64. end
    65. else
    66. begin
    67. clk_oddN <= 1'b1 ;
    68. end
    69. end
    70. wire clk_odd ;
    71. assign clk_odd = clk_oddP | clk_oddN ; //通过或运算实现50%占空比。
    72. //--------奇数分频过程------end---------//
    73. //--------偶数分频过程------start---------//
    74. reg clk_even=1'b0;
    75. always@(posedge sys_clk)
    76. begin
    77. if(sys_rst) //复位信号,高有效
    78. begin
    79. clk_even <= 1'b0;
    80. end
    81. else
    82. if(cnt <= (Multiple /2 -1))
    83. begin
    84. clk_even <= 1'b0 ;
    85. end
    86. else
    87. begin
    88. clk_even <= 1'b1 ;
    89. end
    90. end
    91. //--------偶数分频过程------end---------//
    92. endmodule

    二、上仿真代码

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

    三、上仿真结果

    图1:10分频50%占空比效果(multiple=10)

     

    图2:11分频50%占空比效果(multiple=11)

     由图1和图2可知,仅仅通过带边变量multiple的值可以实现不同分频,且满足50%占空比。其中:

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

    ②clk_div是分频后时钟。

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

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

    感谢关注。

  • 相关阅读:
    【密码学】第三章、分组密码
    一般处理程序ashx接入微信服务器配置
    【LeetCode】1.两数之和
    简单了解一下:Node全局对象和事件监听和触发
    游戏找不到msvcr100dll怎么办,分享5个有效修复方法
    云原生应用的未来:无服务器计算的崭露头角
    Jenkins快速了解
    顾客点餐系统-----后端代码编写(基于SSM)
    Shell文件包含
    WPF 如何让xmal的属性换行显示 格式化
  • 原文地址:https://blog.csdn.net/weixin_47032674/article/details/128111038