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