SumAcc.v 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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 [IDataWidth-1:0] Data_i,
  11. output [ODataWidth-1:0] Result_o,
  12. output ResultVal_o
  13. );
  14. //================================================================================
  15. // LOCALPARAMS
  16. //================================================================================
  17. // REG/WIRE
  18. reg [ODataWidth-1:0] dataAcc;
  19. reg resultVal;
  20. wire [ODataWidth-1:0] extData = {{(ODataWidth - IDataWidth){Data_i[IDataWidth-1]}}, Data_i}; //sign extension
  21. //================================================================================
  22. // ASSIGNMENTS
  23. assign Result_o = dataAcc;
  24. assign ResultVal_o = resultVal;
  25. //================================================================================
  26. // CODING
  27. always @(posedge Clk_i) begin
  28. if (Rst_i) begin
  29. dataAcc <= {ODataWidth{1'b0}};
  30. resultVal <= 1'b0;
  31. end else if (Val_i) begin
  32. dataAcc <= dataAcc+extData;
  33. resultVal <= Val_i;
  34. end else begin
  35. dataAcc <= 0;
  36. resultVal <= 1'b0;
  37. end
  38. end
  39. endmodule