Files
reflectometer_fpga_project/rtl/sampler
2026-06-10 16:31:02 +03:00
..
2026-06-10 16:23:20 +03:00
2026-06-10 16:16:33 +03:00
2026-06-10 16:31:02 +03:00

Сэмплер

Модуль выполняет задачу сбора данных с выхода АЦП, их обработки, упаковки и передачи дальше с помощью AXI Stream интерфейса.
Дополнительно реализован механизм синхронизации с внешним генератором через сигналы request и done, позволяющий запускать сбор строго по запросу и подтверждать завершение выборки.


Список параметров

DATA_WIDTH Ширина входных данных, получаемых с АЦП.

PACK_FACTOR Количество отсчетов, собираемых в один выходной пакет.

PROCESS_MODE Режим интерпретации входного кода:

  • 0 — прямой код
  • 1 — дополнительный код

Список входных портов

clk_in Сигнал тактирования выходного интерфейса.

rst Сброс модуля и остановка работы.

[DATA_WIDTH-1:0] data_in Входной сигнал с АЦП.

out_of_range Флаг выхода значений данных за допустимый диапазон:

  • 0 — данные валидны
  • 1 — данные невалидны и игнорируются

[31:0] smp_num Количество валидных отсчетов, которое необходимо собрать после получения запроса на выборку.

request Сигнал запроса на синхронизацию от генератора для текущего импульса.


Список выходных портов

[DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata Урезанный AXI Stream формат, выходные данные.
Ширина шины определяется как произведение битности данных и фактора упаковки.

m_axis_tvalid Урезанный AXI Stream формат, сигнал валидности выходных данных.
Формируется при готовности очередного пакета.

done Сигнал запроса на запуск синхронизации с генератором для текущего импульса.

Поднимается в начале каждого нового импульса и снимается после получения request.


Логика работы

На каждом такте принимаются:

  • data_in — значение АЦП
  • out_of_range — флаг допустимости значения

Если out_of_range = 1, данные считаются невалидными, игнорируются и не попадают во внутренний буфер.

Если out_of_range = 0, данные считаются корректными и используются для дальнейшей обработки.


Преобразование данных

Если PROCESS_MODE = 1, входные данные интерпретируются как дополнительный код и преобразуются перед упаковкой.

Если PROCESS_MODE = 0, данные передаются без преобразования (прямой код).


Запуск выборки

Сбор данных начинается только после прихода сигнала request.

При этом:

  • фиксируется значение smp_num
  • внутренний счетчик собранных отсчетов обнуляется
  • модуль переходит в активное состояние (enable = 1)

Пока enable = 1, модуль принимает только валидные отсчеты.

Синхронизация представляет из себя простое рукопожатие с внешним модулем, имеющим сигналы request/done работающими в соответствии с этими сигналами сэмплера. Один из модулей, входит в ожидание и ставит на свой done активный уровень, после чего ждет, пока второй, запаздывающий модуль не войдет в свой режим ожидания, и не выставит для своего done активный уровень. Для каждого из модулей, на следующий такт после выставления активного уровня, производится проверка своего request. Так, при получении активного request (иными словами активного done от внешнего модуля), модуль незамедлительно опускает уровень своего done и начинает работать. Done подымается до активного уровня хотя-бы на один такт работы соответствующего модуля.


Упаковка данных

Внутренний буфер заполняется до количества данных, равного PACK_FACTOR.

Если PACK_FACTOR = 1

Каждый валидный отсчет сразу формирует выходной пакет:

  • данные передаются в m_axis_tdata
  • формируется импульс m_axis_tvalid

Если PACK_FACTOR > 1

Данные последовательно накапливаются во внутреннем сдвиговом буфере.

Когда буфер полностью заполнен:

  • формируется пакет упакованных данных
  • поднимается m_axis_tvalid

После этого начинается сбор следующего пакета.


Завершение выборки

Когда количество собранных валидных отсчетов достигает значения smp_num:

  • внутренние счетчики сбрасываются
  • буфер очищается
  • enable сбрасывается в 0

Это означает полное завершение текущего цикла выборки.


Симуляция

Тесты запускаются автоматически через make.

cd tests
make sim