• FPGA project : volt


     

     

    1. module top(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [7:0] ad_data ,
    5. output wire ds ,
    6. output wire oe ,
    7. output wire shcp ,
    8. output wire stcp ,
    9. output wire ad_clk
    10. );
    11. // 例化间连线
    12. wire [15:0] volt_w ;
    13. wire [19:00] data_w ;
    14. assign data_w = {4'b0000,volt_w} ;
    15. wire [05:00] point_w ;
    16. assign point_w = 6'b001_000 ;
    17. wire sign_w ;
    18. wire seg_en_w ;
    19. assign seg_en_w = 1'b1 ;
    20. dig_volt dig_volt_insert(
    21. .sys_clk ( sys_clk ) ,
    22. .sys_rst_n ( sys_rst_n ) ,
    23. .ad_data ( ad_data ) ,
    24. .volt ( volt_w ) ,
    25. .sign ( sign_w ) ,
    26. .ad_clk ( ad_clk )
    27. );
    28. seg_595_dynamic seg_595_dynamic_insert(
    29. .sys_clk ( sys_clk ) ,
    30. .sys_rst_n ( sys_rst_n ) ,
    31. .data ( data_w ) ,
    32. .point ( point_w ) ,
    33. .sign ( sign_w ) ,
    34. .seg_en ( seg_en_w ) ,
    35. .ds ( ds ) ,
    36. .oe ( oe ) ,
    37. .shcp ( shcp ) ,
    38. .stcp ( stcp )
    39. );
    40. endmodule

     

     

    1. module dig_volt(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [7:0] ad_data ,
    5. output reg [15:0] volt ,
    6. output reg sign ,
    7. output wire ad_clk
    8. );
    9. // reg signal define
    10. reg cnt_ad_clk ;
    11. reg ad_clk_reg ; // 四分频。
    12. reg [19:0] cnt_1024 ;
    13. reg sum_en ;
    14. reg sum_en_reg1 ;
    15. reg sum_en_reg2 ;
    16. reg [19:0] sum_1024 ;
    17. reg [19:0] data_medium ;
    18. reg [19:0] data_n_fenmm;
    19. reg [19:0] data_p_fenmm;
    20. reg [28:0] data_n ;
    21. reg [28:0] data_p ;
    22. reg [15:0] volt_reg ;
    23. // reg cnt_ad_clk ;
    24. always @(posedge sys_clk or negedge sys_rst_n)
    25. if(~sys_rst_n)
    26. cnt_ad_clk <= 1'b0 ;
    27. else
    28. cnt_ad_clk <= cnt_ad_clk + 1'b1 ; // 溢出自动归零
    29. // reg ad_clk_reg ;
    30. always @(posedge sys_clk or negedge sys_rst_n)
    31. if(~sys_rst_n)
    32. ad_clk_reg <= 1'b0 ;
    33. else if(cnt_ad_clk == 1'b1)
    34. ad_clk_reg <= ~ad_clk_reg ;
    35. // reg [19:0] cnt_1024 ;
    36. always @(posedge ad_clk_reg or negedge sys_rst_n)
    37. if(~sys_rst_n)
    38. cnt_1024 <= 20'd0 ;
    39. else if(cnt_1024 == 20'd1025)
    40. cnt_1024 <= cnt_1024 ;
    41. else
    42. cnt_1024 <= cnt_1024 + 1'b1 ;
    43. // reg sum_en ;
    44. always @(posedge ad_clk_reg or negedge sys_rst_n)
    45. if(~sys_rst_n)
    46. sum_en <= 1'b0 ;
    47. else if(cnt_1024 == 20'd1025)
    48. sum_en <= 1'b1 ;
    49. else
    50. sum_en <= 1'b0 ;
    51. // reg sum_en_reg1 ;
    52. always @(posedge ad_clk_reg or negedge sys_rst_n)
    53. if(~sys_rst_n)
    54. sum_en_reg1 <= 1'b0 ;
    55. else
    56. sum_en_reg1 <= sum_en ;
    57. // reg sum_en_reg2 ;
    58. always @(posedge ad_clk_reg or negedge sys_rst_n)
    59. if(~sys_rst_n)
    60. sum_en_reg2 <= 1'b0 ;
    61. else
    62. sum_en_reg2 <= sum_en_reg1 ;
    63. // reg [19:0] sum_1024 ;
    64. always @(posedge ad_clk_reg or negedge sys_rst_n)
    65. if(~sys_rst_n)
    66. sum_1024 <= 20'd0 ;
    67. else if(cnt_1024 >= 20'd1 && cnt_1024 <= 20'd1024)
    68. sum_1024 <= sum_1024 + ad_data ;
    69. else
    70. sum_1024 <= sum_1024 ;
    71. // reg [19:0] data_medium ;
    72. always @(posedge ad_clk_reg or negedge sys_rst_n)
    73. if(~sys_rst_n)
    74. data_medium <= 20'd0 ;
    75. else if(cnt_1024 == 20'd1025)
    76. data_medium <= sum_1024 / 20'd1024 ;
    77. else
    78. data_medium <= data_medium ;
    79. // reg [19:0] data_n_fenmm;
    80. // reg [19:0] data_p_fenmm;
    81. always @(posedge ad_clk_reg or negedge sys_rst_n) begin
    82. if(~sys_rst_n) begin
    83. data_n_fenmm <= 20'd0 ;
    84. data_p_fenmm <= 20'd0 ;
    85. end else begin
    86. if(sum_en == 1'b1) begin
    87. data_n_fenmm <= data_medium + 1'd1 ;
    88. data_p_fenmm <= 20'd256 - data_medium;
    89. end
    90. end
    91. end
    92. // reg [28:0] data_n ;
    93. // reg [28:0] data_p ;
    94. always @(posedge ad_clk_reg or negedge sys_rst_n) begin
    95. if(~sys_rst_n) begin
    96. data_n <= 26'd0 ;
    97. data_p <= 26'd0 ;
    98. end else begin
    99. if(sum_en_reg1 == 1'b1) begin
    100. data_n <= 26'd40960000 / data_n_fenmm ;
    101. data_p <= 26'd40960000 / data_p_fenmm ;
    102. end else begin
    103. data_n <= 26'd0 ;
    104. data_p <= 26'd0 ;
    105. end
    106. end
    107. end
    108. // reg [15:0] volt_reg ;
    109. always @(posedge ad_clk_reg or negedge sys_rst_n)
    110. if(~sys_rst_n)
    111. volt_reg <= 16'd0 ;
    112. else if(sum_en_reg2 == 1'b1 && ad_data >= data_medium)
    113. volt_reg <= ((data_p * (ad_data - data_medium)) >> 4'd13) ;
    114. else if(sum_en_reg2 == 1'b1 && ad_data < data_medium)
    115. volt_reg <= ((data_n * (data_medium - ad_data)) >> 4'd13) ;
    116. else
    117. volt_reg <= 16'd0 ;
    118. // reg [15:0] volt ,
    119. always @(posedge ad_clk_reg or negedge sys_rst_n) begin
    120. if(~sys_rst_n) begin
    121. volt <= 16'd0 ;
    122. end else begin
    123. volt <= volt_reg ;
    124. end
    125. end
    126. // sign
    127. always @(posedge ad_clk_reg or negedge sys_rst_n)
    128. if(~sys_rst_n)
    129. sign <= 1'b0 ;
    130. else if(sum_en_reg2 == 1'b1 && ad_data < data_medium) // 小于中值有符号位.
    131. sign <= 1'b1 ;
    132. else
    133. sign <= 1'b0 ;
    134. // wire ad_clk
    135. assign ad_clk = ~ad_clk_reg ;
    136. endmodule

     

    1. `timescale 1ns/1ns
    2. module test_top();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg [7:0] ad_data ;
    6. reg data_en ; // 当数据使能信号为低电平,ad_data == 125 ;高,把ad_data_reg 赋值给ad_data.
    7. reg [7:0] ad_data_reg ; // 数据寄存。
    8. wire ds ;
    9. wire oe ;
    10. wire shcp ;
    11. wire stcp ;
    12. wire ad_clk ;
    13. top top_insert(
    14. .sys_clk ( sys_clk ) ,
    15. .sys_rst_n ( sys_rst_n ) ,
    16. .ad_data ( ad_data ) ,
    17. .ds ( ds ) ,
    18. .oe ( oe ) ,
    19. .shcp ( shcp ) ,
    20. .stcp ( stcp ) ,
    21. .ad_clk ( ad_clk )
    22. );
    23. parameter CYCLE = 20 ;
    24. initial begin
    25. sys_clk = 1'b1 ;
    26. sys_rst_n <= 1'b0 ;
    27. data_en <= 1'b0 ;
    28. #(CYCLE * 10) ;
    29. sys_rst_n <= 1'b1 ;
    30. #(CYCLE * 4 * 5000) ;
    31. data_en <= 1'b1 ;
    32. end
    33. always #(CYCLE / 2) sys_clk = ~sys_clk ;
    34. // reg data_en ; // 当数据使能信号为低电平,ad_data == 125 ;高,把ad_data_reg 赋值给ad_data.
    35. // reg [7:0] ad_data_reg ; // 数据寄存。
    36. always @(posedge sys_clk or negedge sys_rst_n) begin
    37. if(~sys_rst_n) begin
    38. ad_data_reg <= 1'b0 ;
    39. end else begin
    40. ad_data_reg <= ad_data_reg + 1'b1 ;
    41. end
    42. end
    43. // reg [7:0] ad_data ;
    44. always @(posedge ad_clk or negedge sys_rst_n) begin
    45. if(~sys_rst_n) begin
    46. ad_data <= 1'b0 ;
    47. end else begin
    48. if(data_en == 1'b0) begin
    49. ad_data <= 8'd125 ;
    50. end else begin
    51. ad_data <= ad_data_reg ;
    52. end
    53. end
    54. end
    55. endmodule

  • 相关阅读:
    R语言使用cut函数进行数据分组(binning):根据指定间隔(breaks)将数据拆分为组、设置labels参数指定分组的标签
    Win11开机只有鼠标显示怎么办?
    Java 进阶:实例详解 Java 虚拟机字节码指令
    两横一纵 | 寅家科技发布10年新征程战略
    mybatis总结
    问题记录:无法删除.dll文件,显示“文件已在Windows资源管理器中打开”
    Java基础-----String类
    HashMap每次扩容时,为什么都必须是2的N次方?
    告别模糊,教你游戏录屏怎么样清晰!
    关于图论算法
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/132986524