SumAcc.v 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. module SumAcc
  2. #(
  3. parameter IDataWidth = 14,
  4. parameter ODataWidth = 48
  5. )
  6. (
  7. input Clk_i,
  8. input Rst_i,
  9. input Val_i,
  10. input AccZeroing_i,
  11. input [IDataWidth-1:0] Data_i,
  12. output [ODataWidth-1:0] Result_o,
  13. output ResultVal_o
  14. );
  15. //================================================================================
  16. // LOCALPARAMS
  17. //================================================================================
  18. // REG/WIRE
  19. reg [ODataWidth-1:0] dataAcc;
  20. reg resultVal;
  21. wire [ODataWidth-1:0] extData = {{(ODataWidth - IDataWidth){Data_i[IDataWidth-1]}}, Data_i}; //sign extension
  22. reg accZeroing;
  23. reg accZeroingR;
  24. reg accZeroingRR;
  25. //================================================================================
  26. // ASSIGNMENTS
  27. assign Result_o = dataAcc;
  28. assign ResultVal_o = resultVal;
  29. //================================================================================
  30. // CODING
  31. always @(posedge Clk_i) begin
  32. if (Rst_i) begin
  33. accZeroing <= 0;
  34. accZeroingR <= 0;
  35. accZeroingRR <= 0;
  36. end else begin
  37. accZeroing <= AccZeroing_i;
  38. accZeroingR <= accZeroing;
  39. accZeroingRR <= accZeroingR;
  40. end
  41. end
  42. always @(posedge Clk_i) begin
  43. if (Rst_i) begin
  44. dataAcc <= {ODataWidth{1'b0}};
  45. end else if (Val_i) begin
  46. if (!accZeroingRR) begin
  47. dataAcc <= dataAcc+extData;
  48. end else begin
  49. dataAcc <= 0+extData;
  50. end
  51. resultVal <= accZeroingR;
  52. end else begin
  53. dataAcc <= 0;
  54. resultVal <= 0;
  55. end
  56. end
  57. endmodule