Управление от контроллера работает просто замечательно: пишем команду по адресу в памяти и ПЛИС формирует нужное слово, высылая его в кодек - контроллеру надо только дождаться сброса флажка "занято", чтобы записать следующую команду. Выяснил, что формат данных в шине I2S отличается от очевидного -- быстрый АЦП отдаёт выборки в прямом формате (хоть он и дифференциальный, но инвертирующий вход всегда должен быть на "земле" - так меньше шумов), высокоскоростной ЦАП тоже принимает прямой формат, но TLV320AIC23B берёт только дополнительный код. Преобразование проще пареной репы - просто инвертируем старший бит и всё. На вход быстрому АЦП подал синус..
Да, буфер на THS4521 я уже собрал и частично проверил - вроде, работает как надо. Единственное "но" - напряжение референса в ADS8322 и встроенный формирователь напряжения смещения в этом усилителе оба выдают 2.5В, но это немного разные "два с половиной вольта". Чтобы всё совпадало, надо бы их связать.. лучше даже через буфер. Но это на будущее, пока и так сойдёт.
Так вот, на вход быстрому АЦП подаю синус, а внутри ПЛИС замыкаю поток данных от него на вход быстрого ЦАПа и наблюдаю на выходе тот же синус с той же частотой и амплитудой, только со смещение в пол-питания (но это логично и ожидаемо). При этом, в полном соответствии с теоремой Найквиста-Котельникова-Шеннона-Уайттекер
Если генератор сигнала отключить, то в наушниках слышен небольшой шум на максимальной громкости - просто слегка заметное шипение, ничего страшного. Есть и какая-то периодическая помеха, её происхождение я выяснять сейчас не буду.
Как оказалось, в гарнитуре (Denn DHM-490) весьма чувствительный микрофон. Сначала я включил встроенный в кодек микрофонный бустер +20дБ, этого оказалось слишком много (сигнал улетает в ограничение). Отключил - амплитуда "АААААА" получается почти полтора-два вольта. В будущем потребуется сообразить алгоритм компрессии динамического диапазона, а пока и так сойдёт.
Система прекрасно отрабатывает все эти сигналы и я невероятно доволен этим скромным промежуточным результатом.