diff --git a/designs/eth_ctrl_debug/README.md b/designs/eth_ctrl_debug/README.md new file mode 100644 index 0000000..705d416 --- /dev/null +++ b/designs/eth_ctrl_debug/README.md @@ -0,0 +1,7 @@ +# Тестовый проект Eth + CTRL +Проект состоит из AXIS Ethernet и контроллера. Для тестирования сделано три разных частотных домена: ethernet 125MHz, DAC 130MHz, ADC 65MHz для тестирования сихронизации. Есть ILA на все выходы контроллера и на шину AXIS eth -> ctrl. Для отправки пакетов используйте скрипт ```console.py --debug```. + +## Сборка +```make all``` - собрать все до битстрима + +```make vivado``` - открыть проект в Vivado \ No newline at end of file diff --git a/rtl/controller/README.md b/rtl/controller/README.md new file mode 100644 index 0000000..1e91927 --- /dev/null +++ b/rtl/controller/README.md @@ -0,0 +1,62 @@ +# Системный контроллер + +Контроллер принимает входные пакеты 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" в конце симуляции. \ No newline at end of file