Files
reflectometer_fpga_project/rtl/controller/README.md
2026-04-15 18:54:07 +03:00

4.0 KiB
Raw Blame History

Системный контроллер

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