Аккумулятор
Модуль аккумуляции данных для последующего усреднения. Принимает данные с входного потока АХ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.