当前位置:   article > 正文

47.简易电压表的设计与验证(2)

47.简易电压表的设计与验证(2)

(1)Verilog 代码:

  1. module adc_collect(
  2. input clk ,
  3. input reset_n ,
  4. input [7:0] adc_data ,
  5. output clk_adc
  6. );
  7. wire clk_adc_a ;
  8. wire clk_adc_turn ;
  9. wire locked ;
  10. wire [31:0] n_volt ;
  11. wire [31:0] p_volt ;
  12. wire [31:0] data_n ;
  13. wire [31:0] data_p ;
  14. reg [10:0] ad_cnt ;
  15. reg [19:0] sum_ad ;
  16. reg [27:0] adc_mid ;
  17. reg [31:0] volt_n ;
  18. reg [31:0] volt_p ;
  19. assign clk_adc = clk_adc_a ;
  20. pll_20M pll_20M_inst
  21. (
  22. .clk_adc(clk_adc_a), // output clk_adc
  23. .clk_adc_turn(clk_adc_turn), // output clk_adc_turn
  24. .resetn(reset_n), // input resetn
  25. .locked(locked), // output locked
  26. .clk(clk) // input clk
  27. );
  28. ila_volt ila_volt_inst
  29. (
  30. .clk(clk), // input wire clk
  31. .probe0(n_volt), // input wire [31:0] probe0
  32. .probe1(p_volt) // input wire [31:0] probe1
  33. );
  34. //adc累加计数器
  35. always@(posedge clk_adc_turn or negedge locked)
  36. if(!locked)
  37. ad_cnt <= 11'd0;
  38. else if(ad_cnt == 11'd1025)
  39. ad_cnt <= 11'd1025;
  40. else
  41. ad_cnt <= ad_cnt + 11'd1;
  42. //adc前1024个数据累加
  43. always@(posedge clk_adc_turn or negedge locked)
  44. if(!locked)
  45. sum_ad <= 20'd0;
  46. else if(ad_cnt <= 11'd1024)
  47. sum_ad <= sum_ad + adc_data;
  48. else
  49. sum_ad <= sum_ad;
  50. //adc中值计算
  51. always@(posedge clk_adc_turn or negedge locked)
  52. if(!locked)
  53. adc_mid <= 28'd0;
  54. else if(ad_cnt == 11'd1024)
  55. adc_mid <= sum_ad >> 10;
  56. else if(ad_cnt == 11'd1025)
  57. adc_mid <= adc_mid;
  58. else
  59. adc_mid <= 28'd0;
  60. //精度定义 显示数据为4位数,其中第一位为个位,后三位为十分位,百分位,千分位。 40960_000 = 5* 2^13 * 1000
  61. assign data_n = (ad_cnt == 11'd1025)? 40960_000/(adc_mid + 1) : 0;
  62. assign data_p = (ad_cnt == 11'd1025)? 40960_000/(256 - adc_mid) : 0;
  63. //电压计算
  64. always@(posedge clk_adc_turn or negedge locked)
  65. if(!locked)
  66. volt_n <= 32'd0;
  67. else if((ad_cnt == 11'd1025) && (adc_data < adc_mid))
  68. volt_n <= (data_n * (adc_mid - adc_data)) >> 13;
  69. else
  70. volt_n <= 32'd0;
  71. always@(posedge clk_adc_turn or negedge locked)
  72. if(!locked)
  73. volt_p <= 32'd0;
  74. else if((ad_cnt == 11'd1025) && (adc_data >= adc_mid))
  75. volt_p <= (data_n * (adc_data - adc_mid)) >> 13;
  76. else
  77. volt_p <= 32'd0;
  78. //传入ILA
  79. assign n_volt = volt_n;
  80. assign p_volt = volt_p;
  81. endmodule

(2)仿真文件:

  1. `timescale 1ns / 1ps
  2. module adc_collect_tb;
  3. reg clk ;
  4. reg clk_sample ;
  5. reg reset_n ;
  6. reg [7:0] adc_data ;
  7. reg [7:0] data_reg ;
  8. reg data_en ;
  9. wire clk_adc ;
  10. initial clk = 1'd1;
  11. always #10 clk = ~clk;
  12. initial clk_sample = 1'd1;
  13. always #25 clk_sample = ~clk_sample;
  14. initial begin
  15. reset_n <= 1'd0;
  16. #25;
  17. reset_n <= 1'd1;
  18. #200;
  19. data_en <= 1'd0;
  20. #2000000;
  21. data_en <= 1'd1;
  22. #2000000;
  23. $stop;
  24. end
  25. always@(posedge clk_sample or negedge reset_n)
  26. if(!reset_n)
  27. data_reg <= 8'd0;
  28. else if(data_en)
  29. data_reg <= data_reg + 8'd1;
  30. else
  31. data_reg <= 8'd0;
  32. always@(posedge clk_sample or negedge reset_n)
  33. if(!reset_n)
  34. adc_data <= 8'd0;
  35. else if(!data_en)
  36. adc_data <= 8'd125;
  37. else
  38. adc_data <= data_reg ;
  39. adc_collect adc_collect_inst(
  40. .clk (clk),
  41. .reset_n (reset_n),
  42. .adc_data (adc_data),
  43. .clk_adc (clk_adc)
  44. );
  45. endmodule

(3)仿真波形(仿真前先把ILA注释掉):

  • 整体波形图:

  • PLL时钟波形图:

  • 求中值中,累加计数器和中间值的计算:

  • 后续dac数据的赋值已经精度的波形:​​​​​​​
  • 数值波形:

(4)XDC文件:

  1. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[1]}]
  2. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[6]}]
  3. set_property IOSTANDARD LVCMOS33 [get_ports clk_adc]
  4. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[0]}]
  5. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[7]}]
  6. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[4]}]
  7. set_property IOSTANDARD LVCMOS33 [get_ports reset_n]
  8. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[3]}]
  9. set_property IOSTANDARD LVCMOS33 [get_ports clk]
  10. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[5]}]
  11. set_property IOSTANDARD LVCMOS33 [get_ports {adc_data[2]}]
  12. set_property PACKAGE_PIN W19 [get_ports clk]
  13. set_property PACKAGE_PIN N15 [get_ports reset_n]
  14. set_property PACKAGE_PIN L13 [get_ports {adc_data[0]}]
  15. set_property PACKAGE_PIN M13 [get_ports {adc_data[1]}]
  16. set_property PACKAGE_PIN M16 [get_ports {adc_data[2]}]
  17. set_property PACKAGE_PIN M15 [get_ports {adc_data[3]}]
  18. set_property PACKAGE_PIN M20 [get_ports {adc_data[4]}]
  19. set_property PACKAGE_PIN N20 [get_ports {adc_data[5]}]
  20. set_property PACKAGE_PIN M22 [get_ports {adc_data[6]}]
  21. set_property PACKAGE_PIN N22 [get_ports {adc_data[7]}]
  22. set_property PACKAGE_PIN L14 [get_ports clk_adc]

(5)实验现象:

编译遇到报错:

解决方法:

未接线,0v时,ILA波形: 

-2.3v时,ILA波形: 

-1.5v时,ILA波形:

0.5v时,ILA波形:

2.7v时,ILA波形:

3.75v时,ILA波形:

4.85v时,ILA波形:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/879524
推荐阅读
相关标签
  

闽ICP备14008679号