diff --git a/rtl/accum/README.md b/rtl/accum/README.md new file mode 100644 index 0000000..c3c518b --- /dev/null +++ b/rtl/accum/README.md @@ -0,0 +1,39 @@ +# Аккумулятор +Модуль аккумуляции данных для последующего усреднения. Принимает данные с входного потока АХ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. \ No newline at end of file