AdcCalibration.v 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. `timescale 1ns / 1ps
  2. (* keep_hierarchy = "yes" *)
  3. //////////////////////////////////////////////////////////////////////////////////
  4. // Company:
  5. // Engineer:
  6. //
  7. // Create Date: 14:12:30 06/03/2020
  8. // Design Name:
  9. // Module Name: WinParameters
  10. // Project Name:
  11. // Target Devices:
  12. // Tool versions:
  13. // Description:
  14. //
  15. // Dependencies: kek
  16. //
  17. // Revision:
  18. // Revision 0.01 - File Created
  19. // Additional Comments:
  20. //
  21. //18.01.2022 AdcData_I is 1.0.13 now changing to 1.2.17 for further calculation. The integer part added to avoid the overflow of the corrected data.
  22. //////////////////////////////////////////////////////////////////////////////////
  23. module AdcCalibration
  24. #(
  25. parameter AccNum = 128,
  26. parameter AdcDataWidth = 14
  27. )
  28. (
  29. input Clk_i,
  30. input Rst_i,
  31. input CalModeEn_i,
  32. input [AdcDataWidth-1:0] AdcData_i,
  33. output CalDone_o,
  34. output [AdcDataWidth-1:0] CalibratedAdcData_o
  35. );
  36. //================================================================================
  37. // Func
  38. //================================================================================
  39. function integer Log2;
  40. input integer value;
  41. begin
  42. Log2 = 0;
  43. while (value > 1) begin
  44. value = value >> 1;
  45. Log2 = Log2 + 1;
  46. end
  47. end
  48. endfunction
  49. localparam ShiftValue = Log2(AccNum);
  50. localparam AccWidth = AdcDataWidth+ShiftValue;
  51. //================================================================================
  52. // REG/WIRE
  53. //================================================================================
  54. reg signed [AccWidth:0] adcAcc;
  55. reg signed [AdcDataWidth-1:0] calValue;
  56. reg signed [AdcDataWidth-1:0] calValueR;
  57. reg [ShiftValue-1:0] accCnt;
  58. reg calDone;
  59. wire [AccWidth:0] adcDataCompl = {{ShiftValue+1{AdcData_i[AdcDataWidth-1]}},AdcData_i};
  60. wire signed [AdcDataWidth-1:0] calibratedData = AdcData_i-calValue;
  61. //================================================================================
  62. // ASSIGNMENTS
  63. //================================================================================
  64. assign CalDone_o = calDone;
  65. assign CalibratedAdcData_o = calibratedData;
  66. //================================================================================
  67. // CODING
  68. //================================================================================
  69. always @(posedge Clk_i) begin
  70. if (!Rst_i) begin
  71. if (CalModeEn_i) begin
  72. if (!calDone) begin
  73. accCnt <= accCnt+1;
  74. end else begin
  75. accCnt <= 0;
  76. end
  77. end else begin
  78. accCnt <= 0;
  79. end
  80. end else begin
  81. accCnt <= 0;
  82. end
  83. end
  84. always @(posedge Clk_i) begin
  85. if (!Rst_i) begin
  86. if (accCnt == AccNum-1) begin
  87. calDone <= 1'b1;
  88. end else begin
  89. calDone <= 1'b0;
  90. end
  91. end else begin
  92. calDone <= 1'b0;
  93. end
  94. end
  95. always @(posedge Clk_i) begin
  96. if (!Rst_i) begin
  97. if (CalModeEn_i) begin
  98. if (!calDone) begin
  99. adcAcc <= adcAcc+adcDataCompl;
  100. end else begin
  101. adcAcc <= adcDataCompl;
  102. end
  103. end else begin
  104. adcAcc <= adcDataCompl;
  105. end
  106. end
  107. end
  108. always @(posedge Clk_i) begin
  109. if (!Rst_i) begin
  110. if (calDone) begin
  111. calValue <= adcAcc>>ShiftValue;
  112. end
  113. end else begin
  114. calValue <= 14'h0;
  115. end
  116. end
  117. endmodule