Снял с паузы замену DMA и FFT...

Dec 26, 2024 09:49

...на сопроцессор в виде MicroBlaze. Решил дожать этот вопрос. Сначала избавился от FFT - сделал проброс AXI-Stream напрямую в PS часть и расчет FFT внутри ARM. Так и было на заре этого проекта. Посмотрел загрузку процессора, оказалось 50%. Дальше в разрез этого потока поставил MicroBlaze - прямо насквозь, на входе FIFO через AXI-Stream, на выходе тоже AXI-Stream с еще одним FIFO. На MicroBlaze заливается прошивка, отпускается reset и оно молотит FFT-2048. Заработало, нагрузка на процессор упала до прежних 40%. Дальше решил убрать один из DMA, тот что на звуковом тракте (прием с ADC и передача на DAC). Поставил AXI-Stream FIFO с выходом прямо в адресное пространство через AXI4. Долго бодался - не хотело отдавать данные, Linux показывал что даже прерывания не приходят. Я даже драйвер обновил до 4.2 (штатно идет 4.1) - бесполезно. Потом вспомнил про разборки DMA которые решились периодическим взводом сигнала TLAST. Тут это конечно бред, потому что с FIFO идет сигнал о его заполнении - и логично что система должна реагировать именно на него. Но поставил счетчик с генерацией TLAST и оно заработало... Сколько раз я говорил "Где логика?" пока работал с штатными компонентами Xilinx уже и не посчитать!

Ну раз без DMA заработало завел через него с сопроцессора FFT поток. Работает, но хочется более красивого. Потому, что я беру данные закидываю их в FIFO, потом оттуда они по AXI идут в память и дальше я их в ручную вычитываю после прихода прерывания. И тут я вспомнил, что сегмент данных от MicroBlaze у меня уже замаплен внутрь ARM пространства. Оторвал FIFO, прикрутил к MicroBlaze 1 битный GPIO и кинул его в прерывания. Теперь так - расчитываю FFT и заполняю данными массив внутри MicroBlaze. Когда посчиталось дергаю за GPIO - "забирайте!" Забирать можно не торопясь - пока заполнится входной FIFO, пока посчитается следующий блок FFT.

В общем теперь ничего лишнего - успевает поток 256кГц, разгружает ARM и влазит даже в Zynq 7010. Ну и бонусом MicroBlaze еще и на оконую функцию домножает - теперь спектр стал чище (не растекается).

fpga, brass, dsp

Previous post Next post
Up