70 lines
1.8 KiB
Systemverilog
70 lines
1.8 KiB
Systemverilog
`timescale 1ns / 1ps
|
|
|
|
|
|
module adder
|
|
#(
|
|
parameter DATA_WIDTH = 12,
|
|
parameter ACCUM_WIDTH = 32
|
|
)
|
|
(
|
|
input clk_in,
|
|
input rst,
|
|
input start,
|
|
input [31:0] window_size,
|
|
input [DATA_WIDTH-1:0] s_axis_tdata,
|
|
input s_axis_tvalid,
|
|
|
|
output [ACCUM_WIDTH-1:0] sum_data,
|
|
output sum_valid
|
|
);
|
|
|
|
logic [ACCUM_WIDTH-1:0] accum, res;
|
|
logic [DATA_WIDTH-1:0] axis_data;
|
|
logic res_valid, axis_valid;
|
|
(* MARK_DEBUG = "TRUE" *) logic [31:0] cnt;
|
|
logic [31:0] window_size_reg;
|
|
|
|
wire [31:0] window_size_safe = (window_size == 32'd0) ? 32'd1 : window_size;
|
|
|
|
always @(posedge clk_in) begin
|
|
if (rst) begin
|
|
accum <= '0;
|
|
cnt <= '0;
|
|
res <= '0;
|
|
res_valid <= 0;
|
|
axis_data <= '0;
|
|
axis_valid <= 0;
|
|
window_size_reg <= 32'd1;
|
|
end else begin
|
|
res_valid <= 0;
|
|
|
|
if (start) begin
|
|
accum <= '0;
|
|
cnt <= '0;
|
|
res <= '0;
|
|
axis_data <= '0;
|
|
axis_valid <= 0;
|
|
window_size_reg <= window_size_safe;
|
|
end else begin
|
|
axis_data <= s_axis_tdata;
|
|
axis_valid <= s_axis_tvalid;
|
|
if (axis_valid) begin
|
|
if (cnt == window_size_reg - 1) begin
|
|
res <= accum + axis_data;
|
|
res_valid <= 1;
|
|
accum <= '0;
|
|
cnt <= '0;
|
|
end else begin
|
|
accum <= accum + axis_data;
|
|
cnt <= cnt + 1;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
assign sum_valid = res_valid;
|
|
assign sum_data = res;
|
|
|
|
endmodule
|