# Системный контроллер Контроллер принимает входные пакеты 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" в конце симуляции.