Тестирование аудио (WM8960)

Этот тест настроит WM8960 через I2C, считает аудиоданные с WM8960 (используя Line In или MIC In в качестве источника ввода), а затем закольцует их обратно на WM8960 для вывода через наушники или динамики.

Создание проекта Vivado

Создайте новый проект Vivado. Следуйте предыдущим шагам для настройки Quad SPI FLASH, UART и контроллера DDR в PS. Поскольку в этом эксперименте используется контроллер I2C для настройки WM8960 через интерфейс I2C, обратите внимание, что интерфейс I2C WM8960 (scl и sda) аппаратно подключен к выводам PL. Следовательно, контроллер I2C PS необходимо подключить к двум выводам PL через EMIO.

Результат конфигурации следующий:

image-20250806171244481

image-20250806171303802

image-20250806171216196

image-20250806171326701

image-20250806171358843

На диаграмме щелкните, чтобы выбрать интерфейс IIC_0, указанный стрелкой, затем щелкните правой кнопкой мыши и выберите "Make External" во всплывающем меню, чтобы вывести интерфейс I2C. После вывода интерфейса переименуйте его в "aud_iic", как показано ниже:

image-20250806171622699

Добавьте новое IP-ядро: Нажмите символ "+" на панели инструментов Diagram, чтобы добавить IP. В появившемся поле поиска введите "i2s". Вы увидите два IP-ядра: I2S Receiver и I2S Transmitter. Нам нужно добавить оба в дизайн.

image-20250806171850164

Настройте, как показано ниже (передатчик настраивается аналогично):

image-20250806171928581

Выведите интерфейсы для связи между двумя IP-ядрами I2S и чипом WM8960. Модуль I2S Receiver отвечает за захват аудиоданных, выводимых с WM8960, поэтому интерфейс ввода аудиоданных "sdata_0_in" необходимо вывести через "Make External". После вывода интерфейса переименуйте его в "aud_adc_data".

Обычно IP-ядра I2S Receiver и I2S Transmitter поддерживают только мастер-режим. Однако этот эксперимент требует синхронизации тактовых сигналов с использованием встроенного тактового генератора чипа WM8960. Поэтому установите I2S Receiver в ведомый режим (slave mode), а I2S Transmitter — в ведущий режим (master mode).

Дважды щелкните на ядре I2S Receiver и измените значение C_IS_MASTER на 0, как показано ниже:

image-20250807165310764

После установки I2S Receiver в ведомый режим, а I2S Transmitter в ведущий режим, Irclk_in/sclk_in на стороне Receiver предоставляется Irclk_out/sclk_out со стороны Transmitter.

image-20250807165224206

Модуль I2S Transmitter отвечает за вывод аудиоданных для воспроизведения на WM8960. Аналогично, выведите интерфейс вывода аудиоданных "sdata_0_out" через "Make External", затем переименуйте этот интерфейс в "aud_dac_data". На диаграмме также показан интерфейс sclk_out, выведенный из модуля I2S Transmitter, который является битовым тактовым сигналом BCLK в протоколе передачи I2S. Для синхронизации битовых тактовых сигналов на обоих концах подключите этот интерфейс Transmitter к интерфейсу sclk_in Receiver, как показано ниже:

image-20250807171416184

Для реализации функции аудиопетли подключите интерфейс m_axis_aud модуля I2S Receiver к интерфейсу s_axis_aud модуля I2S Transmitter. Это означает прямую передачу аудиоданных в формате AXI4-Stream из модуля приемника в модуль передатчика, как показано ниже:

image-20250806173957945

Найдите и добавьте модуль тактирования:

image-20250806174122795

Настройте тактовый сигнал: На странице Clocking Options установите, что входной тактовый сигнал предоставляется выводом MCLK модуля WM8960. Частота MCLK, выводимого из модуля WM8960, составляет 24 МГц. Поэтому установите входную частоту вручную ("MANUAL") и измените частоту тактового сигнала на 24 МГц.

image-20250807171533207

На странице Output Clocks установите частоту выходного тактового сигнала clk_out1 на 18,432 МГц, чтобы обеспечить MCLK для модулей I2S Receiver/I2S Transmitter. Эта тактовая частота является целым кратным 128 * Fs, где Fs — частота дискретизации аудио. В этом эксперименте используется частота дискретизации аудио Fs 48 КГц, поэтому тактовая частота clk_out1 равна N × 128 × 48 КГц, где N — положительное целое число. При N=3 расчетная тактовая частота составляет 3 × 128 × 48000 = 18432000 Гц, т.е. 18,432 МГц.

image-20250807171601937

В нижней части страницы Output Clocks снимите флажок с интерфейса сброса "reset" модуля тактирования. После настройки нажмите "OK" в правом нижнем углу диаграммы.

image-20250805141057418

Выведите clk_in1 на приведенной выше диаграмме через "Make External" и переименуйте его в "aud_mclk"; затем подключите clk_out1 к I2S Receiver и I2S Transmitter. После настройки это выглядит следующим образом:

image-20250807171945298

image-20250807172319039

Найдите "vector" и добавьте IP-ядро "Utility Vector Logic", настроив его следующим образом:

image-20250807102658734

Используйте этот элемент НЕ для инвертирования сигнала "locked", выводимого из модуля тактирования, затем подключите инвертированный сигнал к интерфейсу aud_mrst модулей I2S Receiver и I2S Transmitter. После стабилизации тактового сигнала на выходе модуля тактирования сигнал locked станет высоким; в то время как сигнал aud_mrst активен высоким уровнем для сброса, поэтому необходим элемент НЕ для инвертирования сигнала locked. Как показано ниже:

image-20250807172417943

Затем нажмите "Run Block Automation" и "Run Connection Automation" в верхней части окна Diagram, чтобы позволить инструменту автоматически подключить оставшиеся интерфейсы модулей:

image-20250807172445013

В диалоговом окне, которое появляется после нажатия "Run Connection Automation", установите флажок "All Automation" слева для выполнения автоматических подключений. После завершения подключения нажмите CTRL+S, чтобы сохранить проект, и приступите к генерации файла HDL верхнего уровня.

Добавьте ограничения выводов: Щелкните правой кнопкой мыши Constraints --> Add Source

image-20250805142356667

Добавьте файл xdc:

image-20250805142442674

Выполните синтез, имплементацию и экспортируйте файл .xsa.

Создание проекта Vitis

Создайте новый проект платформы, проект приложения, импортируйте файл xsa и создайте файл .c.

Основной код выглядит следующим образом и в основном включает операции с регистрами:

Компиляция и отладка

Подключите один конец аудиокабеля к устройству воспроизведения звука, а другой конец — к интерфейсу LINE_IN на плате разработки;

Подключите компьютер к интерфейсу JTAG на нижней плате с помощью кабеля USB.

Затем подключите интерфейс USB_UART на левой стороне платы разработки к компьютеру с помощью кабеля USB для последовательной связи.