# Аккумулятор Модуль аккумуляции данных для последующего усреднения. Принимает данные с входного потока АХI-Stream фиксированной ширины (задается параметрически), суммируя их сначала по окнам, а затем со значениями из предыдущей последовательности. ## Список парамтеров: - DATA_WIDTH - ширина входных данных, получаемых с АЦП - ACCUM_WIDTH - размер данных для аккумуляции, должен быть степенью числа 2. По умолчанию - 32 - N_MAX - максимальное число окон в последовательности. Должно быть степенью числа 2. Влияет на размер используемой памяти. - WINDOW_SIZE - размер окна усреднения - PACKET_SIZE - размер выходного пакета ## Иерархия: ``` ├── accum_top - полная сборка аккумулятора │   ├── accum - основная логика аккумуляции по окнам и последовательностям │   │   ├── adder - модуль сложения по окнам │   ├── out_axis_fifo - модуль для выдачи данных наружу в другом частотном домене ``` ## Список входных портов: - clk_in - частота входных данных - rst - сброс всего - [DATA_WIDTH-1:0] s_axis_tdata - входные данные - s_axis_tvalid - валидность входных данных - start - начало аккумуляции - [31:0] smp_num - число сэмплов (должно быть кратно WINDOW_SIZE) - [15:0] seq_num - число последовательностей аккумуляции - eth_clk_in - частота для выходных данных на ethernet - req_ready - готовность отправителя начать принимать данные - m_axis_tready - готовность выходного axis ## Список выходных портов: - send_req - сигнал начала отправки данных - [7:0] m_axis_tdata - данные выходного axis - m_axis_tvalid - валидность выходного axis - m_axis_tlast - последний пакет в axis - finish - конец отправки всех данных, полный цикл работы завершен ## Логика работы: Модуль начинает работу при получении сигнала start. Сразу после начала работы можно подавать данные на входной axis, они будут суммироваться по WINDOW_SIZE штук и отправляться на хранение. Так будет сделано для последовательности длиной smp_num чисел, затем начинается новая последовательность - всего таких будет seq_num штук. Каждая последующая последовательность также суммируется по окнам, а затем полученные значения прибавляются к тем же значениям предыдущей последовательности. Таким образом, выполняется суммирование по двум осям, и из исходных данных seq_num по smp_num чисел остается вектор длиной 1 x (smp_num / WINDOW_SIZE). После накопления всех данных начинается выдача. Выдача осуществляется на выходной AXI stream, работающий в домене eth_clk, и имеющий ширину 8 бит - предполагается, что выдача пойдет на ethernet-udp. Когда поднят сигнал req_ready, модуль будет отправлять send_req (запрос отправки пакета), и по готовности m_axis_tready начнет выдавать пакет размер PACKET_SIZE байт. Если данные нельзя ровно разложить по пакетам, то в последнем пакете могут быть отправлены рандомные данные из памяти. После окончания отправки всех пакетов будет поднят сигнал finish.