• FPGA project : beep


    1. module beep
    2. #(
    3. parameter MAX_500MS = 25'd25_000_000 ,
    4. MAX_NOTE_7= 3'd7 ,
    5. FRE_262 = 23'd190839 ,
    6. FRE_294 = 23'd170068 ,
    7. FRE_330 = 23'd151515 ,
    8. FRE_349 = 23'd143266 ,
    9. FRE_392 = 23'd127551 ,
    10. FRE_440 = 23'd113636 ,
    11. FRE_494 = 23'd101214 ,
    12. DUT_262 = 22'd95419 ,
    13. DUT_294 = 22'd85034 ,
    14. DUT_330 = 22'd75757 ,
    15. DUT_349 = 22'd71633 ,
    16. DUT_392 = 22'd63775 ,
    17. DUT_440 = 22'd56818 ,
    18. DUT_494 = 22'd50607
    19. )(
    20. input wire sys_clk ,
    21. input wire sys_rst_n ,
    22. output reg beep
    23. );
    24. // reg signal define
    25. reg [24:00] cnt_500ms ;
    26. reg [02:00] cnt_7 ;
    27. reg [22:00] fre_num ; // 音符频率 计数最大值 锁存器 组合逻辑赋值
    28. reg [22:00] cnt_f ; // 音符频率 计数器 不同音符 所计满次数不同。随着音符而变换。
    29. reg [21:00] duty_cycle; // 占空比锁存器 ; 组合逻辑
    30. // cnt_500ms
    31. always @(posedge sys_clk or negedge sys_rst_n) begin
    32. if(~sys_rst_n) begin
    33. cnt_500ms <= 0 ;
    34. end else begin
    35. if(cnt_500ms == (MAX_500MS - 1'b1)) begin
    36. cnt_500ms <= 0 ;
    37. end else begin
    38. cnt_500ms <= cnt_500ms + 1'b1 ;
    39. end
    40. end
    41. end
    42. // cnt_7
    43. always @(posedge sys_clk or negedge sys_rst_n) begin
    44. if(~sys_rst_n) begin
    45. cnt_7 <= 0 ;
    46. end else begin
    47. if(cnt_500ms == (MAX_500MS - 1'b1)) begin
    48. if(cnt_7 == MAX_NOTE_7 - 1'b1) begin
    49. cnt_7 <= 0 ;
    50. end else begin
    51. cnt_7 <= cnt_7 + 1'b1 ;
    52. end
    53. end else begin
    54. cnt_7 <= cnt_7 ;
    55. end
    56. end
    57. end
    58. // fre_num
    59. always @(*) begin
    60. case (cnt_7)
    61. 0 : begin
    62. fre_num <= FRE_262 ;
    63. end
    64. 1 : begin
    65. fre_num <= FRE_294 ;
    66. end
    67. 2 : begin
    68. fre_num <= FRE_330 ;
    69. end
    70. 3 : begin
    71. fre_num <= FRE_349 ;
    72. end
    73. 4 : begin
    74. fre_num <= FRE_392 ;
    75. end
    76. 5 : begin
    77. fre_num <= FRE_440 ;
    78. end
    79. 6 : begin
    80. fre_num <= FRE_494 ;
    81. end
    82. default: fre_num <= FRE_494 ;
    83. endcase
    84. end
    85. // cnt_f
    86. always @(posedge sys_clk or negedge sys_rst_n) begin
    87. if(~sys_rst_n) begin
    88. cnt_f <= 0 ;
    89. end else begin
    90. if(cnt_f == (fre_num - 1'b1) || (cnt_500ms == MAX_500MS - 1'b1)) begin
    91. cnt_f <= 0 ;
    92. end else begin
    93. cnt_f <= cnt_f + 1'b1 ;
    94. end
    95. end
    96. end
    97. // duty_cycle
    98. always @(*) begin
    99. case (cnt_7)
    100. 0 : begin
    101. duty_cycle <= DUT_262 ;
    102. end
    103. 1 : begin
    104. duty_cycle <= DUT_294 ;
    105. end
    106. 2 : begin
    107. duty_cycle <= DUT_330 ;
    108. end
    109. 3 : begin
    110. duty_cycle <= DUT_349 ;
    111. end
    112. 4 : begin
    113. duty_cycle <= DUT_392 ;
    114. end
    115. 5 : begin
    116. duty_cycle <= DUT_440 ;
    117. end
    118. 6 : begin
    119. duty_cycle <= DUT_494 ;
    120. end
    121. default: duty_cycle <= DUT_494 ;
    122. endcase
    123. end
    124. // beep
    125. always @(posedge sys_clk or negedge sys_rst_n) begin
    126. if(~sys_rst_n) begin
    127. beep <= 1'b1 ;
    128. end else begin
    129. if(cnt_f >= duty_cycle) begin
    130. beep <= 1'b0 ;
    131. end else begin
    132. beep <= 1'b1 ;
    133. end
    134. end
    135. end
    136. endmodule
    1. `timescale 1ns/1ns
    2. module test();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. wire beep ;
    6. // Instantiation
    7. beep
    8. #(
    9. .MAX_500MS ( 1000 ),
    10. .MAX_NOTE_7 ( 7 ),
    11. .FRE_262 ( 70 ),
    12. .FRE_294 ( 60 ),
    13. .FRE_330 ( 50 ),
    14. .FRE_349 ( 40 ),
    15. .FRE_392 ( 30 ),
    16. .FRE_440 ( 20 ),
    17. .FRE_494 ( 10 ),
    18. .DUT_262 ( 35 ),
    19. .DUT_294 ( 30 ),
    20. .DUT_330 ( 25 ),
    21. .DUT_349 ( 20 ),
    22. .DUT_392 ( 15 ),
    23. .DUT_440 ( 10 ),
    24. .DUT_494 ( 5 )
    25. )
    26. beep_insert(
    27. .sys_clk ( sys_clk ),
    28. .sys_rst_n ( sys_rst_n ),
    29. .beep ( beep )
    30. );
    31. parameter CYCLE = 20 ;
    32. initial begin
    33. sys_clk = 1'b1 ;
    34. sys_rst_n <= 1'b0 ;
    35. #( CYCLE * 10 ) ;
    36. sys_rst_n <= 1'b1 ;
    37. #( 210 ) ;
    38. sys_rst_n <= 1'b0 ;
    39. #( CYCLE * 10 ) ;
    40. sys_rst_n <= 1'b1 ;
    41. #( CYCLE * 1000 ) ;
    42. end
    43. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    44. endmodule

  • 相关阅读:
    #案例:演示map函数的使用!和#案例:演示迭代器的使用、生成器函数的使用、生成器表达式的使用!
    【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)
    【漏洞复现】maccms苹果cms 命令执行漏洞
    babel转码器
    多组学+机器学习+膀胱癌+分型+建模
    JWT详细介绍
    金蝶云星空与聚水潭对接集成物料查询连通商品上传(新)(物料主数据同步策略)
    Vite HMR API
    Azure Functions Service Bus Trigger 对容器的支持
    大龄程序员副业及创业方向推荐
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/132632516