Воспроизведение звука. DeltaSigma ЦАП.

шилд разъемов для платы Марсоход2


Попробуем выполнить простой проект для платы Марсоход2 – воспроизведение звука через плату расширения «Шилд Разъемов».

Звуковой файл будем передавать в плату Марсоход2 через последовательный порт. Для упрощения экспериментов специальным образом подготовим звуковой файл WAV: сделаем его 8-ми битным, МОНО, и выберем частоту сэмплирования 22050Гц. Создавать и редактировать звуковые файлы можно, например, в программе Audacity – великолепный свободный инструмент аудио обработки.

Передавать аудио файл через последовательный порт будем на его стандартной скорости 230400бит/сек. Один байт, передается как последовательность: старт бит, 8 бит данных и стоп бит. Итого, 10 бит на один переданный байт.  Полученная частота сэмплирования будет 230400/10=23040Гц. Это, конечно, не требуемые 22050, но довольно близко – неискушенный слушатель почти не заметит разницы..

Проект в ПЛИС платы Марсоход2 должен принять байты из последовательного порта и выполнить специальную модуляцию для воспроизведения звука.

Собственно топ модуль нашего аудио проекта в Altera Quartus II выглядит вот так:

Топ модуль в проекте Altera Quartus II

Схема, как видите, немудреная. Принятые из COM-порта данные фиксируются в регистре receiver_reg. Дальше эти байты поступают на модулятор DAC.

Интересно, что с модулятора идет всего один провод. То есть одним цифровым проводом синтезируется на выходе цифровой микросхемы ПЛИС аналоговый сигнал. Как такое может быть?

Собственно, для реализации этого проекта будем руководствоваться документом компании Xilinx:



В этом документе сказано, что модулятор представляет собой высокочастотный однобитный ЦАП. Он должен создавать такую последовательность импульсов, чтобы усредненное значение «постоянной составляющей» этой последовательности было пропорционально поступающим значениям аудио выборок. Такой модулятор называется DeltaSigma DAC.

В электрической схеме «Шилда Разъемов» усреднение импульсов выполняется простым фильтром низких частот на RC-цепочке (точно так же, как это сделано в документе Xilinx):

RC-фильтры после Delta Sigma DAC

Полную схему шилда можно скачать в разделе загрузки нашего сайта:



Модулятор для нашего проекта так же был взят из документа Xilinx. Это модуль на Verilog HDL:


module dac(DACout, DACin, Clk);
output DACout; // This is the average output that feeds low pass filter
reg DACout; // for optimum performance, ensure that this ff is in IOB
input [7:0] DACin; // DAC input
input Clk;
reg [9:0] DeltaAdder; // Output of Delta adder
reg [9:0] SigmaAdder; // Output of Sigma adder
reg [9:0] SigmaLatch; // Latches output of Sigma adder
reg [9:0] DeltaB; // B input of Delta adder
always @(SigmaLatch) DeltaB = {SigmaLatch[9], SigmaLatch[9]} << (8);
always @(DACin or DeltaB) DeltaAdder = DACin + DeltaB;
always @(DeltaAdder or SigmaLatch) SigmaAdder = DeltaAdder + SigmaLatch;
always @(posedge Clk)
begin
SigmaLatch <= SigmaAdder;
DACout <=  SigmaLatch[9];
end
endmodule


С помощью инструмента Altera SignalTap можно посмотреть все сигналы проекта.

Вот данные последовательного порта с входного пина проекта FTDI_BD0:

сигнал на линии последовательного порта

Здесь частота захвата SignalTap 100МГц. Сигнал rx_byte сигнализирует о готовности принятого байта. С его помощью данные фиксируются в receiver_reg.

Если в SignalTap в качестве частоты захвата использовать сигнал rx_byte, то в регистре receiver_reg можно увидеть звуковые выборки:

Синусоида в Altera SignalTap

Сейчас передаю аудио файл sine8bit22K.wav – это синусоида 440Гц.

Подробнее цифровой выход так же можно рассмотреть:

плотность импульсов при модуляции Delta Sigma DAC

Видно, что в зависимости от входного значения receiver_reg плотность импульсов на выходе ЦАП DeltaSigma DAC растет.

Весь проект для среды проектирования Altera Quartus II можно скачать здесь:

В этом же архиве есть и мои звуковые файлы sine8bit22K.wav и SleepAway8.wav.

 


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