144 lines
5.5 KiB
Markdown
144 lines
5.5 KiB
Markdown
# Сэмплер
|
|
|
|
Модуль выполняет задачу сбора данных с выхода АЦП, их обработки, упаковки и передачи дальше с помощью 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". |