ADC_16bit.v
上传用户:saul_905
上传日期:2013-11-27
资源大小:184k
文件大小:4k
源码类别:

VHDL/FPGA/Verilog

开发平台:

Visual C++

  1. // 16-bit Analogue-Digital Converter
  2. //
  3. // +-----------------------------+
  4. // |    Copyright 1996 DOULOS    |
  5. // |    designer : Tim Pagden    |
  6. // |     opened:  7 Jun 1996     |
  7. // +-----------------------------+
  8. `timescale 1 ns / 1 ps
  9. module ADC_16bit (analog_in,digital_out);
  10. parameter conversion_time = 25.0, // conversion_time in ns
  11.   // (see `timescale above)
  12.   charge_limit = 1000000; // = 1 million
  13. input[63:0] analog_in;
  14. // double-precision representation of a real-valued input port; a fix that enables 
  15. // analog wires between modules to be coped with in Verilog. 
  16. // Think of input[63:0] <variable> as the equivalent of MAST's electrical.
  17. output[15:0] digital_out;
  18. reg[15:0] delayed_digitized_signal;
  19. reg[15:0] old_analog,current_analog;
  20. reg[4:0] changed_bits;
  21. reg[19:0] charge;
  22. reg charge_ovr;
  23. reg reset_charge;
  24. /* SIGNALS:-
  25. analog_in = 64-bit representation of a real-valued signal
  26. analog_signal = real valued signal recovered from analog_in
  27. analog_limited = analog_signal, limited to the real-valued input range of the ADC
  28. digital_out = digitized 16bit 2's complement quantization of analog_limited
  29. */
  30. /* function to convert analog_in to digitized_2s_comp_signal. 
  31. Takes analog_in values from (+10.0 v - 1LSB) to -10.0 v and converts 
  32. them to values from +32767 to -32768 respectively */
  33. function[15:0] ADC_16b_10v_bipolar; 
  34. parameter max_pos_digital_value = 32767,
  35.   max_in_signal = 10.0;
  36. input[63:0] analog_in;
  37. reg[15:0] digitized_2s_comp_signal;
  38. real analog_signal,analog_abs,analog_limited;
  39. integer digitized_signal;
  40. begin
  41.   analog_signal = $bitstoreal (analog_in);
  42.   if (analog_signal < 0.0)
  43.   begin
  44.     analog_abs = -analog_signal;
  45.     if (analog_abs > max_in_signal)
  46.       analog_abs = max_in_signal;
  47.     analog_limited = -analog_abs;
  48.   end
  49.   else
  50.   begin
  51.     analog_abs = analog_signal;
  52.     if (analog_abs > max_in_signal)
  53.       analog_abs = max_in_signal;
  54.     analog_limited = analog_abs;
  55.   end
  56.   if (analog_limited == max_in_signal)
  57.     digitized_signal = max_pos_digital_value;
  58.   else
  59.     digitized_signal = $rtoi (analog_limited * 3276.8);
  60.   if (digitized_signal < 0)
  61.     digitized_2s_comp_signal = 65536 - digitized_signal;
  62.   else
  63.     digitized_2s_comp_signal = digitized_signal;
  64.   ADC_16b_10v_bipolar = digitized_2s_comp_signal;
  65. end   
  66. endfunction
  67. /* This function determines the number of digital bit changes from
  68. sample to sample; can be used to determine power consumption if required.
  69. Task power_determine not yet implemented */
  70. function[4:0] bit_changes;
  71. input[15:0] old_analog,current_analog;
  72. reg[4:0] bits_different;
  73. integer i;
  74. begin
  75.   bits_different = 0;
  76.   for (i=0;i<=15;i=i+1)
  77.     if (current_analog[i] != old_analog[i])
  78.       bits_different = bits_different + 1;
  79.   bit_changes = bits_different;
  80. end
  81. endfunction
  82. /* Block to allow power consumption to be measured (kind of). Reset_charge is used to periodically reset the charge accumulated value (which can be used to determine current consumption and thus power consumption) */
  83. always @ (posedge reset_charge)
  84. begin
  85.   charge = 0;
  86.   charge_ovr = 0;
  87. end
  88. /* This block only triggered when analog_in changes by an amount greater than 1LSB, a crude sort of scheduler */
  89. always @ (ADC_16b_10v_bipolar (analog_in)) 
  90. begin
  91.   current_analog = ADC_16b_10v_bipolar (analog_in); // digitized_signal
  92.   changed_bits = bit_changes (old_analog,current_analog);
  93.   old_analog = current_analog;
  94.   charge = charge + (changed_bits * 3);
  95.   if (charge > charge_limit)
  96.     charge_ovr = 1;
  97. end
  98. /* Block to implement conversion_time tpd; always block use to show
  99.    difference between block and assign coding style */
  100. always 
  101.   # conversion_time delayed_digitized_signal = ADC_16b_10v_bipolar (analog_in);
  102. assign digital_out = delayed_digitized_signal; 
  103. endmodule