62 lines
4.0 KiB
Markdown
62 lines
4.0 KiB
Markdown
# Системный контроллер
|
||
|
||
Контроллер принимает входные пакеты udp с ethernet, передаваемые по axi stream, и выполняет настройку выходных регистров в соотвествии с содержимым этого пакета, а также синхронизирует сигналы между тремя clock domains - есть clk от ethernet, clk для ЦАП и clk для АЦП
|
||
|
||
## Список параметров:
|
||
- dac_data_width - битность данных ЦАП, <= 16bit
|
||
|
||
## Список входных портов:
|
||
- eth_clk_in - базовая входная частота
|
||
- dac_clk_in - входная частота ЦАП
|
||
- adc_clk_in - входная частота АЦП
|
||
- rst_n - общий reset
|
||
- s_axis [8 bit] - AXI stream slave для приема данных от ethernet udp (уже разобранный payload по байтам) - домен eth_clk
|
||
- finish - сигнал окончания приема данных с АЦП, домен adc_clk !
|
||
|
||
## Список выходных портов:
|
||
- dac_pulse_width[31:0] - выход pulse_width в домене dac_clk
|
||
- dac_pulse_period[31:0] - выход pulse_period в домене dac_clk
|
||
- dac_pulse_height[dac_data_width-1:0] - выход pulse_height в домене dac_clk
|
||
- dac_pulse_num[15:0] - выход pulse_num в домене dac_clk
|
||
---
|
||
- adc_pulse_period[31:0] - выход pulse_period в домене adc_clk
|
||
- adc_pulse_num[15:0] - выход pulse_num в домене adc_clk
|
||
---
|
||
- dac_start - start в домене dac_clk
|
||
- adc_start - start в домене adc_clk
|
||
---
|
||
- dac_rst - rst в домене dac_clk
|
||
- adc_rst - rst в домене adc_clk
|
||
|
||
## Логика работы:
|
||
по умолчанию после инициализации блок встает в состояние ожидания (*idle*), и становится *ready* для приема данных по axis.
|
||
далее ждет контрольный пакет. всего есть 3 вариации контрольных пакетов (в любом порядке), получаемых по axi stream:
|
||
```
|
||
8'b00001111 - soft reset
|
||
8'b11110000 - start
|
||
8'b10001000 - set_data
|
||
```
|
||
|
||
*soft reset* значит, что нужно отправить пульс rst на dac_rst и adc_rst, синхронизировав пульсы в их доменах. при этом сброс самого контроллера делать не нужно!
|
||
|
||
*start* значит, что нужно отправить пульс start на dac_start и adc_start в их доменах, желательно как можно "одновременее". при этом после этого блок перестает быть ready и ждет, пока не придет пульс finish, после этого он возвращается снова в idle состояние
|
||
|
||
set_data** значит, что следующие 96 бит = 12*8 байт, пришедшии по axis - это конфигурационная информация и ее нужно записать в внутренний регистр на 96 бит.
|
||
|
||
конфигурационный регистр на 96 бит делится так:
|
||
```
|
||
reg[31:0] - pulse_width
|
||
reg[63:32] - pulse_period
|
||
reg[79:64] - pulse_num
|
||
reg[79+dac_data_width:80] - pulse_height
|
||
```
|
||
|
||
соотвественно эти записанные значения должны выставляются на соотвествующие выходные сигналы в доменах dac_clk и adc_clk. выходы обновляются каждый раз, когда происходит set_data, и сигналы сохраняют своё значение до следующего set_data.
|
||
|
||
## Симуляция
|
||
Тесты запускаются автоматически через make.
|
||
```
|
||
cd tests
|
||
make sim
|
||
```
|
||
Должно выдать "All tests done" в конце симуляции. |