Главная > Altera DE2, FPGA Programming > Аудио интерфейс для WM8731

Аудио интерфейс для WM8731


Никогда не любил использовать в своих проектах исходники, поставляемые вместе с комплектами разработчика. Особенно, если авторами кода являются азиаты. Вы не подумайте чего, к азиатам я отношусь совершенно нормально (иначе вряд ли бы работал с ними столь длительное время). Однако разница в менталитетах приводит и к разнице в решениях. 


Вот и тайваньская плата Altera DE2 не стала исключением. Особенно та часть исходников, которая работает с кодеком. Нет, на демонстрационных проектах Terasic все крутится чики-пуки. Однако попытка использовать готовые исходники в своих проектах приводила к сбоям в работе аудио-кодека. То он напрочь отказывался запускаться, то каналы по очереди глохли или забивались каким-то непонятным шумом. В общем, такой расклад меня не устроил и управление аудио-кодеком было мной переписано начисто.

Начал я с аудио-интерфейса. Во-первых, я изменил концепцию его работы на прямо противоположную. Terasic пользует кодек WM8731 в режиме Slave, то есть генерация управляющих сигналов BCLK и ADCLRC/DACLRC возложена на покатые плечи FPGA-шки. И при миграции на другое железо возможны проблемы (особенно если учесть, что тактовый сигнал для кодека генерится с помощью PLL внутри ПЛИСины). Я же в своем модуле возложил генерацию клоков на сам кодек (то есть использовал режим Master).

Во-вторых, реализовал 2 режима работы интерфейса: I2S и DSP/PCM Mode A (за подробностями – в даташит на кодек). Режим работы выбирается установкой высокого или низкого уровня на управляющем входе.

Распиновка модуля выглядит так:

Выводы iBCLK, iLRCK, iDIN, oDOUT образуют стандартный последовательный аудио-интерфейс (кстати, индекс перед названием вывода обозначает его направление: i – вход, o – выход). Вход iLRCK подключен у меня к выходу ADCLRC кодека. Подключение остальных, думаю, понятно.

iCLK, iRSTn и iAUDMODE – управляющие входы модуля (причем активный уровень сигнала iRSTn – низкий). Высокий уровень на входе iAUDMODE соответсвует режиму I2S, низкий-DSP/PCM Mode A.

На выходе oStrobe генерируются короткие импульсы, сигнализирующие о том, что данные с обоих каналов приняты и выставлены на выходах oDataLeft и oDataRight (желающие могут сделать отдельный строб для каждого канала, это нетрудно). Эти же импульсы инициируют передачу данных с параллельных входов модуля в кодек. Так что данные на входах iDataLeft и iDataRight должны быть установлены еще до появления строба.

В ПЛИСине EP2C35F672C6 (на плате Altera DE2) все это хозяйство занимает 274 LCs и работает вплоть до частоты iCLK = 213 MHz (при установках синтезатора по умолчанию).

В заключение хотелось бы сказать, что данный модуль без каких-либо изменений успешно работает у меня еще и в FPGA-шке XC3S500E от Xilinx. Так что с миграцией на другое железо проблем быть не должно.

Скачать исходник.

PS. после закачки файла замените расширение файла на .zip и распакуйте получившийся архив.

 

Рубрики:Altera DE2, FPGA Programming Метки: ,
  1. DeVOuR
    16/12/2010 в 06:27 | #1

    Привет. Вот тоже столкнулся с проблемой непонятности работы с аудио-кодеком в примерах к ДЕ2, и Ваш исходник очень мне помог! Огромное спасибо!
    Единственное, что мне непонятно, как кодек определяет, какому каналу принадлежит слово, если Вы не указываете это ЦАП при передаче данных обратно кодеку(соотв. выход DACLR не используется в Вашей программе).

    Еще хотел попросить, не могли бы вы выслать мне на почту свой проект в квартусе с использованием вашего модуля, т.к. я немножко непонимаю. почему ваш модуль занимает274 л.ячейки, в то время, как мой проект с вашим модулем на базе примера DE2_i2sound из папки DE2_Demonstrations компилиться и занимает весь всего 95 лог. ячеек?

    Буду очень благодарен за вашу помощь!

    • 16/12/2010 в 09:52 | #2

      Привет.
      В своем посте я писал, что использую кодек в режиме Master. В этом режиме сигналы ADCLRC и DACLRC кодек генерирует сам и они совпадают по фазе. Поэтому в качестве iLRCK можно использовать любой из этих двух сигналов.

      Что касается количества использованных ресурсов, то дело здесь скорее всего вот в чем. В Вашем проекте параллельные входы и выходы iDataLeft, iDataRight, oDataLeft, oDataRight и oStrobe наверняка не выведены наружу FPGA-шки, а соединены с внутренними модулями. Я же привел результат синтеза голого модуля, без внутренних соединений с какими-либо блоками. Пересылать проект для Квартуса смысла нет. Возьмите только модуль de2_audio_if, создайте проект для него и синтезируйте, не меняя установок синтезатора. Думаю, результат вы получите такой же, как и у меня. Если нет, тогда отпишитесь, будем разбираться.

      • DeVOuR
        16/12/2010 в 16:55 | #3

        Спасибо за разъяснения.
        Буду разбираться.

        Я так понял, что настройки кодека Вы взяли как дефолтные? Нигде их не изменяеете. Не увидел нигде процесс конфигурации кодека. У него там пачка регистров с настроками.
        Но то такое, там я уже разобрался без проблемм.

        Еще раз, спасибо!

      • 16/12/2010 в 17:51 | #4

        Изменяю под свои нужды. Просто процесс конфигурации кодека осуществляется по протоколу I2C и идет у меня отдельным модулем, который я пока не выкладывал. Кстати, он тоже переписан начисто.

      • DeVOuR
        17/12/2010 в 07:58 | #5

        Ну мне понравился модуль настройки кодека в примере DE2_i2sound. Чуть под себя подредактировал, пока без проблем работает.

        Запетлил выводы Вашего модуля на его же входы (т.е. line_in -> ADC -> de2_audio_if -> de2_audio_if ->DAC – Phone Out). Включил на 50Мгц прямо с кварца собтвенно тактирую.
        Звук пошел, но немного шумоват, это, как я понимаю, из-за 16 битной оцифровки. Кстате и ячеек стало в районе 270-ти.

        Смотрел в код, и возник вопрос: в корне непонятно предназначение блоков edge_detect и input syncronizer (вообще, по названию понятна суть блоков, не понятно предназначение и принцип работы).
        Это какая-то хитрая фича в HDL синхронизироваьть както хитро так управляющие сигналы?

        Если Вам еще не надоел, буду признателен за ответ :) . Извините за назойливость) уж очень вцепился в ваш исходник.

      • 17/12/2010 в 09:51 | #6

        Обратите внимание на процессы в исходнике. Единственным управляющим тактовым сигналом модуле является сигнал iCLK, несмотря на то, что последовательный аудио-интерфейс имеет в своем составе еще 2 тактовых сигнала BCLK и LRCK. Предназначение блоков Edge Detector – выделение фронтов сигналов BCLK и LRCK. Посмотрите мой пост “Избавляемся от лишнего клокового домена”, там этот блок приведен с пояснениями.

        Input Synchronizers предназначены для синхронизации входных сигналов с фронтом iCLK для того, чтобы избежать возможных метастабильных состояний (это когда управляющий фронт iCLK совпадет с моментом изменения входного сигнала). Если посмотрите в RTL-схему модуля, то увидите, что синхронизаторы представляют собой два последовательно соединенных триггера. Рекомендую почитать вот этот документ http://w2.cadence.com/whitepapers/cdc_wp.pdf. Там все неплохо расписано. Еще могу порекомендовать книги “Advanced Digital Design with the Verilog HDL” (автор Michael Ciletti) и “Advanced FPGA Design” (автор Steve Kilts). Там вопрос синхронизации клоковых доменов разбирается более подробно.
        Все это – не хитрая фича в HDL, а способ избежать сбоев в работе проекта. Бывает, что на симуляторе все выглядит идеально, а в ПЛИС работает через пень-колоду либо не работает вообще.

        Если звук шумоват, попробуйте детально проанализировать настройки кодека. У меня вроде уровень шума приемлемый, меня вполне устраивает.

        PS: если бы я избегал общения, то не стал бы создавать блог. :) Так что про “надоел” не нужно.

  2. DeVOuR
    19/12/2010 в 23:31 | #7

    Вобщем, звуковые цифровые фильтры НЧ и ВЧ, сгенерированные матлабом, настроил, все работает отлично, без левых шумов, то, кстати, где-то данные ломались, скорей всего, ошибся в настройках режима передачи аудио данных к кодеку. Вернуть шумы, чтобы разобратся, где был косяк – не получилось :(
    Звук с плеера очень четко фильтруется. Первая цель на ДЕ_2 достигнула благодаря вам :)
    Теперь уйду в пищалки м в FFT. )
    Спасибо за помощь! Очень помогли!

  1. Нет обратных ссылок.

Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Follow

Get every new post delivered to your Inbox.