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". |