Power2ClkDivider.v 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. `timescale 1ns / 1ps
  2. module Power2ClkDivider (
  3. clk_i,
  4. rst_i,
  5. valid_i,
  6. signal_o,
  7. rising_edge_o,
  8. falling_edge_o
  9. );
  10. //================================================================================
  11. //
  12. // PARAMETER/LOCALPARAM
  13. //
  14. //================================================================================
  15. parameter DIVISOR_POWER = 2;
  16. //================================================================================
  17. //
  18. // PORTS
  19. //
  20. //================================================================================
  21. input clk_i;
  22. input rst_i;
  23. input valid_i;
  24. output reg signal_o;
  25. output reg rising_edge_o;
  26. output reg falling_edge_o;
  27. //================================================================================
  28. //
  29. // REG/WIRE
  30. //
  31. //================================================================================
  32. wire clk_div_flag;
  33. //================================================================================
  34. //
  35. // CODING
  36. //
  37. //================================================================================
  38. //initial begin
  39. // if (DIVISOR_POWER < 1) begin
  40. // $error("parameter DIVISOR_POWER of module power2_clk_divider must be greater then 0");
  41. // $stop;
  42. // end
  43. //end
  44. generate
  45. if (DIVISOR_POWER < 2) begin
  46. assign clk_div_flag = 1'b1;
  47. end else begin
  48. reg [DIVISOR_POWER-2:0] clk_div_cnt;
  49. always @(posedge clk_i or posedge rst_i) begin
  50. if (rst_i) begin
  51. clk_div_cnt <= {DIVISOR_POWER{1'b1}};
  52. end else if (valid_i) begin
  53. clk_div_cnt <= clk_div_cnt + 1;
  54. end else begin
  55. clk_div_cnt <= {DIVISOR_POWER{1'b1}};
  56. end
  57. end
  58. assign clk_div_flag = &clk_div_cnt;
  59. end
  60. endgenerate
  61. always @(posedge clk_i or posedge rst_i) begin
  62. if (rst_i) begin
  63. signal_o <= 1'b0;
  64. rising_edge_o <= 1'b0;
  65. falling_edge_o <= 1'b0;
  66. end else if (valid_i) begin
  67. if (clk_div_flag) begin
  68. signal_o <= ~signal_o;
  69. end
  70. rising_edge_o <= ~signal_o & clk_div_flag;
  71. falling_edge_o <= signal_o & clk_div_flag;
  72. end else begin
  73. signal_o <= 1'b0;
  74. rising_edge_o <= 1'b0;
  75. falling_edge_o <= 1'b0;
  76. end
  77. end
  78. endmodule