Files
reflectometer_fpga_project/rtl/accum
2026-04-28 15:36:59 +03:00
..
2026-04-28 13:28:49 +03:00
2026-04-28 15:36:59 +03:00

Аккумулятор

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