当前位置:   article > 正文

FPGA(6)电压测量(ADC)_fpga中adc采样参考电压码值怎么写

fpga中adc采样参考电压码值怎么写
  1. module adc8_5v(sys_clk,sys_rst,data8_in,data16_out,adc_clkout,sign,data_medium_out);
  2. input wire sys_clk,sys_rst;
  3. input wire [7:0] data8_in;
  4. output [7:0] data_medium_out;
  5. output wire adc_clkout;
  6. output wire [15:0] data16_out;
  7. output wire sign;
  8. reg [1:0] cnt_sysclk;
  9. reg adc_clkin;
  10. reg adc_en;
  11. reg [10:0] cnt_medium;
  12. reg [18:0] adc_data_sum_medium;
  13. reg [7:0] adc_data_medium;
  14. reg [27:0] volt_reg;
  15. wire [27:0] data_PN_p;
  16. wire [27:0] data_PN_n;
  17. parameter cnt_medium_MAX=1024;
  18. parameter cnt_mediumBit_MAX=10;
  19. assign data_medium_out=data8_in;
  20. //时钟4分频(频率为12.5MHz)(做为AD的驱动时钟)
  21. always@(posedge sys_clk or negedge sys_rst)
  22. begin
  23. if(!sys_rst)
  24. begin
  25. adc_clkin<=1'b0;
  26. cnt_sysclk<=2'd0;
  27. end
  28. else if(cnt_sysclk==2'd1)
  29. begin
  30. cnt_sysclk<=2'd0;
  31. adc_clkin<=~adc_clkin;
  32. end
  33. else
  34. begin
  35. cnt_sysclk<=cnt_sysclk+1'b1;
  36. adc_clkin<=adc_clkin;
  37. end
  38. end
  39. //用于产生前期默认的数据(使能采样)
  40. always@(posedge adc_clkin or negedge sys_rst)
  41. begin
  42. if(!sys_rst)
  43. begin
  44. adc_en<=1'b0;
  45. cnt_medium<=11'd0;
  46. end
  47. else if(cnt_medium==cnt_medium_MAX)
  48. begin
  49. adc_en<=1'b1;
  50. cnt_medium<=cnt_medium;
  51. end
  52. else
  53. begin
  54. adc_en<=adc_en;
  55. cnt_medium<=cnt_medium+1'b1;
  56. end
  57. end
  58. //用于收集多个接地的基础数据(这里为2^10)
  59. always@(posedge adc_clkin or negedge sys_rst)
  60. begin
  61. if(!sys_rst)
  62. adc_data_sum_medium<=19'd0;
  63. else if(cnt_medium==cnt_medium_MAX)
  64. adc_data_sum_medium<=adc_data_sum_medium;
  65. else
  66. adc_data_sum_medium<=adc_data_sum_medium+data8_in;
  67. end
  68. //取平均值
  69. always@(posedge adc_clkin or negedge sys_rst)
  70. begin
  71. if(!sys_rst)
  72. adc_data_medium<=8'd0;
  73. else if(cnt_medium==cnt_medium_MAX)
  74. adc_data_medium<=adc_data_sum_medium>>cnt_mediumBit_MAX;
  75. else
  76. adc_data_medium<=adc_data_medium;
  77. end
  78. //放大(2^13*1000倍)
  79. assign data_PN_p=(adc_en==1'b1)? 8192_0000/((255-adc_data_medium)*2):0;
  80. assign data_PN_n=(adc_en==1'b1)? 8192_0000/((adc_data_medium+1)*2):0;
  81. //测量数据放大1000倍
  82. always@(posedge adc_clkin or negedge sys_rst)
  83. begin
  84. if(!sys_rst)
  85. volt_reg<=28'd0;
  86. else if(adc_en==1'b1)
  87. if((data8_in>(adc_data_medium-3))&&(data8_in<(adc_data_medium+3)))
  88. volt_reg<=28'd0;
  89. else if(data8_in<adc_data_medium)
  90. volt_reg<=(data_PN_n*(adc_data_medium-data8_in))>>13;
  91. else if(data8_in>adc_data_medium)
  92. volt_reg<=(data_PN_p*(data8_in-adc_data_medium))>>13;
  93. else
  94. volt_reg<=28'd0;
  95. end
  96. //数据在上升沿更新,所以adc驱动程序为下降沿采样数据
  97. assign adc_clkout=~adc_clkin;
  98. assign sign=(data8_in<adc_data_medium)? 1'b1:1'b0;
  99. assign data16_out=volt_reg;
  100. endmodule

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号