# Сэмплер Модуль выполняет задачу сбора данных с выхода АЦП, их обработки, упаковки и передачи дальше с помощью AXI Stream интерфейса. Дополнительно реализован механизм синхронизации с внешним генератором через сигналы `sample_req` и `sample_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 Количество валидных отсчетов, которое необходимо собрать после получения запроса на выборку. sample_req Сигнал запроса на запуск выборки. При его активации модуль начинает сбор данных и переходит в активное состояние (`enable = 1`). --- ## Список выходных портов [DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata Урезанный AXI Stream формат, выходные данные. Ширина шины определяется как произведение битности данных и фактора упаковки. m_axis_tvalid Урезанный AXI Stream формат, сигнал валидности выходных данных. Формируется при готовности очередного пакета. sample_done Сигнал завершения выборки. Поднимается после того, как модуль собрал количество валидных отсчетов, равное `smp_num`. --- ## Логика работы На каждом такте принимаются: - `data_in` — значение АЦП - `out_of_range` — флаг допустимости значения Если `out_of_range = 1`, данные считаются невалидными, игнорируются и не попадают во внутренний буфер. Если `out_of_range = 0`, данные считаются корректными и используются для дальнейшей обработки. --- ### Преобразование данных Если `PROCESS_MODE = 1`, входные данные интерпретируются как дополнительный код и преобразуются перед упаковкой. Если `PROCESS_MODE = 0`, данные передаются без преобразования (прямой код). --- ### Запуск выборки Сбор данных начинается только после прихода сигнала `sample_req`. При этом: - фиксируется значение `smp_num` - внутренний счетчик собранных отсчетов обнуляется - модуль переходит в активное состояние (`enable = 1`) Пока `enable = 1`, модуль принимает только валидные отсчеты и считает их. --- ### Упаковка данных Внутренний буфер заполняется до количества данных, равного `PACK_FACTOR`. #### Если `PACK_FACTOR = 1` Каждый валидный отсчет сразу формирует выходной пакет: - данные передаются в `m_axis_tdata` - формируется импульс `m_axis_tvalid` #### Если `PACK_FACTOR > 1` Данные последовательно накапливаются во внутреннем сдвиговом буфере. Когда буфер полностью заполнен: - формируется пакет упакованных данных - поднимается `m_axis_tvalid` После этого начинается сбор следующего пакета. --- ### Завершение выборки Когда количество собранных валидных отсчетов достигает значения `smp_num`: - поднимается сигнал `sample_done` - внутренние счетчики сбрасываются - буфер очищается - `enable` сбрасывается в `0` Это означает полное завершение текущего цикла выборки. --- ## Симуляция Тесты запускаются автоматически через make. ``` cd tests make sim ``` При успешном завершении теста высвечивается "ALL PASSED".