OverloadDetect.v 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer: Churbanov S.
  5. //
  6. // Create Date: 15:24:31 08/20/2019
  7. // Design Name:
  8. // Module Name:
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.02 - File Modified
  18. // Additional Comments: 16.09.2019 file modified in assotiate with task.
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module OverloadDetect
  22. #(
  23. parameter ThresholdWidth = 24,
  24. parameter AdcDataWidth = 14,
  25. parameter MeasPeriod = 32
  26. )
  27. (
  28. input Rst_i,
  29. input Clk_i,
  30. input [AdcDataWidth-1:0] AdcData_i,
  31. input [ThresholdWidth-1:0] OverThreshold_i,
  32. output Overload_o
  33. );
  34. //================================================================================
  35. // LOG2 FUNCTION
  36. function integer Log2;
  37. input integer value;
  38. begin
  39. Log2 = 0;
  40. while (value > 1) begin
  41. value = value >> 1;
  42. Log2 = Log2 + 1;
  43. end
  44. if ((2**Log2)<MeasPeriod) begin
  45. Log2 = Log2+1;
  46. end
  47. end
  48. endfunction
  49. //================================================================================
  50. // LOCALPARAMS
  51. localparam CntWidth = Log2(MeasPeriod);
  52. localparam SumWidth = AdcDataWidth+CntWidth;
  53. //================================================================================
  54. // REG/WIRE
  55. reg overloadReg;
  56. reg [CntWidth-1:0] measCnt;
  57. reg [SumWidth-1:0] adcSum;
  58. wire [AdcDataWidth-1:0] absAdc = (AdcData_i[AdcDataWidth-1])? (~AdcData_i + 1):AdcData_i;
  59. //================================================================================
  60. // ASSIGNMENTS
  61. assign Overload_o = overloadReg;
  62. //================================================================================
  63. // CODING
  64. always @(posedge Clk_i) begin
  65. if (!Rst_i) begin
  66. if (measCnt != MeasPeriod-1) begin
  67. measCnt <= measCnt + {{{CntWidth-1{1'b0}},1'b1}};
  68. end else begin
  69. measCnt <= {CntWidth{1'b0}};
  70. end
  71. end else begin
  72. measCnt <= {CntWidth{1'b0}};
  73. end
  74. end
  75. always @(posedge Clk_i) begin
  76. if (!Rst_i) begin
  77. if (measCnt==MeasPeriod-1) begin
  78. adcSum <= absAdc;
  79. end else begin
  80. adcSum <= adcSum + absAdc;
  81. end
  82. end else begin
  83. adcSum <= 0;
  84. end
  85. end
  86. always @(posedge Clk_i) begin
  87. if (measCnt == MeasPeriod-1) begin
  88. if ((adcSum>>CntWidth) > OverThreshold_i) begin
  89. overloadReg <= 1'b1;
  90. end else begin
  91. overloadReg <= 1'b0;
  92. end
  93. end
  94. end
  95. endmodule