• FPGA project :dds


     

     

    1. module top (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [3:0] key ,
    5. output wire [7:0] dac_data
    6. ); // output wire dac_cl ,
    7. // assign dac_clk = ~sys_clk ;
    8. // 例化间连线
    9. wire [3:0] wave_ctrl_w ;
    10. key_ctrl key_ctrl_insert(
    11. .sys_clk ( sys_clk ) ,
    12. .sys_rst_n ( sys_rst_n ) ,
    13. .key_in ( key ) ,
    14. .wave_ctrl ( wave_ctrl_w )
    15. );
    16. dds_ctrl dds_ctrl_insert(
    17. .sys_clk ( sys_clk ) ,
    18. .sys_rst_n ( sys_rst_n ) ,
    19. .wave_ctrl ( wave_ctrl_w) ,
    20. .dac_data ( dac_data )
    21. );
    22. endmodule
    1. module dds_ctrl(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [3:0] wave_ctrl ,
    5. output wire [7:0] dac_data
    6. );
    7. parameter F_WARD = 20'd42949 ;
    8. parameter P_WARD = 12'd1024 ;
    9. // reg signal
    10. reg [31:0] fre_add ; // 频率字累加
    11. reg [11:0] rom_addr_reg ; // 相位字累加
    12. reg [13:0] rom_addr ; // 读 rom地址
    13. wire [13:0] rom_addr_w ;
    14. reg [03:00] wave_ctrl_reg;
    15. assign rom_addr_w = rom_addr ;
    16. // [03:00] wave_ctrl_reg ;
    17. always @(posedge sys_clk or negedge sys_rst_n) begin
    18. if(~sys_rst_n) begin
    19. wave_ctrl_reg <= 4'd0 ;
    20. end else begin
    21. wave_ctrl_reg <= wave_ctrl ;
    22. end
    23. end
    24. // reg [31:0] fre_add ; // 频率字累加
    25. always @(posedge sys_clk or negedge sys_rst_n) begin
    26. if(~sys_rst_n) begin
    27. fre_add <= 32'd0 ;
    28. end else begin
    29. if(fre_add == 32'hFFFF_FFFF - 1'b1 || (wave_ctrl_reg != wave_ctrl)) begin
    30. fre_add <= 32'd0 ;
    31. end else begin
    32. if(|wave_ctrl_reg == 1'b1) begin
    33. fre_add <= F_WARD + fre_add ;
    34. end else begin
    35. fre_add <= 32'd0 ;
    36. end
    37. end
    38. end
    39. end
    40. // reg [11:0] rom_addr_reg ; // 相位字累加
    41. always @(posedge sys_clk or negedge sys_rst_n) begin
    42. if(~sys_rst_n) begin
    43. rom_addr_reg <= 12'd0 ;
    44. end else begin
    45. if( rom_addr_reg == 12'hFFF) begin
    46. rom_addr_reg <= 12'd0 ;
    47. end else begin
    48. rom_addr_reg <= P_WARD + fre_add[31:20] ; // 取fre_add 的高12位宽。
    49. end
    50. end
    51. end
    52. // reg [13:0] rom_addr ; // 读 rom地址
    53. always @(posedge sys_clk or negedge sys_rst_n) begin
    54. if(~sys_rst_n) begin
    55. rom_addr <= 14'd0 ;
    56. end else begin
    57. case (wave_ctrl)
    58. 4'b1000: rom_addr <= rom_addr_reg ;
    59. 4'b0100: rom_addr <= rom_addr_reg + 12'hFFF + 1'b1;
    60. 4'b0010: rom_addr <= rom_addr_reg + 13'h1FFE + 1'b1;
    61. 4'b0001: rom_addr <= rom_addr_reg + 14'h2FFD + 1'b1;
    62. default: rom_addr <= 14'd0 ;
    63. endcase
    64. end
    65. end
    66. rom_16384x8 rom_16384x8_inst (
    67. .address ( rom_addr_w ),
    68. .clock ( sys_clk ),
    69. .q ( dac_data )
    70. );
    71. endmodule
    1. module key_ctrl(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [3:0] key_in ,
    5. output reg [3:0] wave_ctrl
    6. );
    7. wire [3:0] key_out ;
    8. // 例化
    9. key_filter
    10. #(
    11. .MAX_CNT_20MS ( 20'd999_999 )
    12. )
    13. key_filter_insert
    14. (
    15. .sys_clk ( sys_clk ) ,
    16. .sys_rst_n ( sys_rst_n ) ,
    17. .key_in ( key_in ) ,
    18. .key_out ( key_out )
    19. );
    20. // output signal
    21. // wave_ctrl
    22. always @(posedge sys_clk or negedge sys_rst_n) begin
    23. if(~sys_rst_n) begin
    24. wave_ctrl <= 4'd0 ;
    25. end else begin
    26. case (key_out)
    27. 4'b1000 : wave_ctrl <= 4'b1000 ;
    28. 4'b0100 : wave_ctrl <= 4'b0100 ;
    29. 4'b0010 : wave_ctrl <= 4'b0010 ;
    30. 4'b0001 : wave_ctrl <= 4'b0001 ;
    31. default : wave_ctrl <= wave_ctrl ;
    32. endcase
    33. end
    34. end
    35. endmodule
    1. module key_filter
    2. #(
    3. parameter MAX_CNT_20MS = 20'd999_999
    4. )(
    5. input wire sys_clk ,
    6. input wire sys_rst_n ,
    7. input wire [3:0] key_in ,
    8. output reg [3:0] key_out
    9. );
    10. // reg signal define
    11. reg [3:0] key_r0 ;
    12. reg [3:0] key_r1 ;
    13. reg [3:0] key_r2 ;
    14. reg nege ;
    15. reg pose ;
    16. reg [19:00] cnt_20ms ;
    17. reg add_cnt_flag ;
    18. reg flag_20ms ;
    19. // key_r0 key_r1 key_r2
    20. always @(posedge sys_clk or negedge sys_rst_n) begin
    21. if(~sys_rst_n) begin
    22. key_r0 <= 4'b1111 ;
    23. key_r1 <= 4'b1111 ;
    24. key_r2 <= 4'b1111 ;
    25. end else begin
    26. key_r0 <= key_in ;
    27. key_r1 <= key_r0 ;
    28. key_r2 <= key_r1 ;
    29. end
    30. end
    31. // nege
    32. always @(posedge sys_clk or negedge sys_rst_n) begin
    33. if(~sys_rst_n) begin
    34. nege <= 1'b0 ;
    35. end else begin
    36. if(| (~key_r1 & key_r2)) begin
    37. nege <= 1'b1 ;
    38. end else begin
    39. nege <= 1'b0 ;
    40. end
    41. end
    42. end
    43. // pose
    44. always @(posedge sys_clk or negedge sys_rst_n) begin
    45. if(~sys_rst_n) begin
    46. pose <= 1'b0 ;
    47. end else begin
    48. if(| ( key_r1 & ~key_r2)) begin
    49. pose <= 1'b1 ;
    50. end else begin
    51. pose <= 1'b0 ;
    52. end
    53. end
    54. end
    55. // add_cnt_flag
    56. always @(posedge sys_clk or negedge sys_rst_n) begin
    57. if(~sys_rst_n) begin
    58. add_cnt_flag <= 1'b0 ;
    59. end else begin
    60. if(nege) begin
    61. add_cnt_flag <= 1'b1 ;
    62. end else begin
    63. if(pose || cnt_20ms == MAX_CNT_20MS) begin
    64. add_cnt_flag <= 1'b0 ;
    65. end else begin
    66. add_cnt_flag <= add_cnt_flag ;
    67. end
    68. end
    69. end
    70. end
    71. // cnt_20ms
    72. always @(posedge sys_clk or negedge sys_rst_n) begin
    73. if(~sys_rst_n) begin
    74. cnt_20ms <= 20'd0 ;
    75. end else begin
    76. if(add_cnt_flag) begin
    77. if(cnt_20ms == MAX_CNT_20MS) begin
    78. cnt_20ms <= 20'd0 ;
    79. end else begin
    80. cnt_20ms <= cnt_20ms + 20'd1 ;
    81. end
    82. end else begin
    83. cnt_20ms <= 20'd0 ;
    84. end
    85. end
    86. end
    87. // falg_20ms
    88. always @(posedge sys_clk or negedge sys_rst_n) begin
    89. if(~sys_rst_n) begin
    90. flag_20ms <= 1'b0 ;
    91. end else begin
    92. if(cnt_20ms == MAX_CNT_20MS - 1'b1) begin
    93. flag_20ms <= 1'b1 ;
    94. end else begin
    95. flag_20ms <= 1'b0 ;
    96. end
    97. end
    98. end
    99. // [3:0]key_out
    100. always @(posedge sys_clk or negedge sys_rst_n) begin
    101. // always @(*) begin // 这样的话 会综合成 数据选择器
    102. if(~sys_rst_n) begin
    103. key_out <= 4'b0000 ;
    104. end else begin
    105. if(flag_20ms) begin
    106. key_out <= ~key_r2 ;
    107. end else begin
    108. key_out <= 4'b0000 ;
    109. end
    110. end
    111. end
    112. endmodule
    1. `timescale 1ns/1ns
    2. module test_dds_ctrl();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg [3:0] wave_ctrl ;
    6. wire [7:0] adc_data ;
    7. // Instantiation
    8. dds_ctrl dds_insert_test(
    9. .sys_clk ( sys_clk ) ,
    10. .sys_rst_n ( sys_rst_n ) ,
    11. .wave_ctrl ( wave_ctrl ) ,
    12. .adc_data ( adc_data )
    13. );
    14. parameter CYCLE = 20 ;
    15. initial begin
    16. sys_clk = 1'b1 ;
    17. sys_rst_n <= 1'b0 ;
    18. wave_ctrl <= 4'b0000 ;
    19. #( CYCLE * 10 ) ;
    20. sys_rst_n <= 1'b1 ;
    21. #( 210 ) ;
    22. sys_rst_n <= 1'b0 ;
    23. #( 10 ) ;
    24. #( CYCLE * 10 ) ;
    25. sys_rst_n <= 1'b1 ;
    26. #( CYCLE * 50 ) ;
    27. #( CYCLE * 100 ) ;
    28. #( CYCLE * 20000 )
    29. wave_ctrl <= 4'b1000 ;
    30. #( CYCLE * 12'hFFF * 100 ) ;
    31. wave_ctrl <= 4'b0100 ;
    32. #( CYCLE * 12'hFFF * 100 ) ;
    33. wave_ctrl <= 4'b0010 ;
    34. #( CYCLE * 12'hFFF * 100 ) ;
    35. wave_ctrl <= 4'b0001 ;
    36. #( CYCLE * 12'hFFF * 100 ) ;
    37. #( CYCLE * 50 ) ;
    38. #( CYCLE * 100 ) ;
    39. $stop ;
    40. end
    41. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    42. endmodule
    1. `timescale 1ns/1ns
    2. module test_key_ctrl();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg [3:0] key_in ;
    6. wire [3:0] wave_ctrl ;
    7. defparam key_ctrl_insert.key_filter_insert.MAX_CNT_20MS = 200 ;
    8. // Instantiation
    9. key_ctrl key_ctrl_insert(
    10. .sys_clk ( sys_clk ) ,
    11. .sys_rst_n ( sys_rst_n ) ,
    12. .key_in ( key_in ) ,
    13. .wave_ctrl ( wave_ctrl )
    14. );
    15. parameter CYCLE = 20 ;
    16. initial begin
    17. sys_clk = 1'b1 ;
    18. sys_rst_n <= 1'b0 ;
    19. key_in <= 4'b1111 ;
    20. #( CYCLE * 10 ) ;
    21. sys_rst_n <= 1'b1 ;
    22. #( 210 ) ;
    23. sys_rst_n <= 1'b0 ;
    24. #( 10 ) ;
    25. #( CYCLE * 10 ) ;
    26. sys_rst_n <= 1'b1 ;
    27. #( CYCLE * 50 ) ;
    28. key_in <= 4'b0111 ;
    29. #( CYCLE * 700) ;
    30. key_in <= 4'b1111 ;
    31. #( CYCLE * 700 ) ;
    32. #( CYCLE * 100 ) ;
    33. key_in <= 4'b1011 ;
    34. #( CYCLE * 700 ) ;
    35. key_in <= 4'b1111 ;
    36. #( CYCLE * 700 ) ;
    37. #( CYCLE * 100 ) ;
    38. key_in <= 4'b0111 ;
    39. #( CYCLE * 700 ) ;
    40. key_in <= 4'b1111 ;
    41. #( CYCLE * 50 ) ;
    42. #( CYCLE * 100 ) ;
    43. key_in <= 4'b1101 ;
    44. #( CYCLE * 700 ) ;
    45. key_in <= 4'b1111 ;
    46. #( CYCLE * 700 ) ;
    47. #( CYCLE * 100 ) ;
    48. key_in <= 4'b1110 ;
    49. #( CYCLE * 700 ) ;
    50. key_in <= 4'b1111 ;
    51. #( CYCLE * 700 ) ;
    52. #( CYCLE * 100 ) ;
    53. $stop ;
    54. end
    55. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    56. endmodule
    1. `timescale 1ns/1ns
    2. module test_top();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg [3:0] key ;
    6. wire [7:0] dac_data ;
    7. // Instantiation
    8. top top_insert_test(
    9. .sys_clk ( sys_clk ) ,
    10. .sys_rst_n ( sys_rst_n ) ,
    11. .key ( key ) ,
    12. .dac_data ( dac_data )
    13. );
    14. defparam top_insert_test.key_ctrl_insert.key_filter_insert.MAX_CNT_20MS = 100 ;
    15. parameter CYCLE = 20 ;
    16. initial begin
    17. sys_clk = 1'b1 ;
    18. sys_rst_n <= 1'b0 ;
    19. key <= 4'b1111 ;
    20. #( CYCLE * 10 ) ;
    21. sys_rst_n <= 1'b1 ;
    22. #( 210 ) ;
    23. sys_rst_n <= 1'b0 ;
    24. #( 10 ) ;
    25. #( CYCLE * 10 ) ;
    26. sys_rst_n <= 1'b1 ;
    27. #( CYCLE * 50 ) ;
    28. #( CYCLE * 100 ) ;
    29. key <= 4'b0111 ;
    30. #( CYCLE * 10000) ;
    31. key <= 4'b1111 ;
    32. #( CYCLE * 10000) ;
    33. #( CYCLE * 12'hFFF * 100 ) ;
    34. key <= 4'b1011 ;
    35. #( CYCLE * 10000) ;
    36. key <= 4'b1111 ;
    37. #( CYCLE * 10000) ;
    38. #( CYCLE * 12'hFFF * 100 ) ;
    39. key <= 4'b1101 ;
    40. #( CYCLE * 10000) ;
    41. key <= 4'b1111 ;
    42. #( CYCLE * 10000) ;
    43. #( CYCLE * 12'hFFF * 100 ) ;
    44. key <= 4'b1110 ;
    45. #( CYCLE * 10000) ;
    46. key <= 4'b1111 ;
    47. #( CYCLE * 10000) ;
    48. #( CYCLE * 12'hFFF * 100 ) ;
    49. key <= 4'b1110 ;
    50. #( CYCLE * 10000) ;
    51. key <= 4'b1111 ;
    52. #( CYCLE * 10000) ;
    53. #( CYCLE * 12'hFFF * 100 ) ;
    54. #( CYCLE * 50 ) ;
    55. #( CYCLE * 100 ) ;
    56. $stop ;
    57. end
    58. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    59. endmodule

     

     

     

     

     

     

     

  • 相关阅读:
    对象json文件转换
    普冉 PY32F003 资料和入坑方法
    面向对象特性之一:继承性
    web网页设计期末课程大作业 基于HTML+CSS+JavaScript响应式环保科技公司网站模板(环保主题网站设计)
    Netty5-Netty模型
    UE4基础篇十三:物理
    Linux:线程池 | 自旋锁 | 读写锁
    window 系统里 chrome 浏览器一些实用的调试技巧
    删除maven中出现.lastUpdate结尾的文件
    HashMap底层原理源码
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/132925448