Страница 12 из 33 Первая ... 2101112131422 ... Последняя
Показано с 221 по 240 из 647

Тема: Проектируем цифровой фильтр для ЦАП 2

  1. #1 Показать/скрыть первое сообщение.
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Проектируем цифровой фильтр для ЦАП 2

    В продолжение ветки open source проект универсального цифрового фильтра.
    Данный проект имел своей целью сделать цапострой на параллельных конверторах более доступным, т.к. интегральные ЦФ для параллельных ЦАП купить достаточно сложно и дорого.

    Особенности фильтра, выгодно отличающие его от интегральных аналогов, доступных в продаже:
    - поддержка х32 оверсемплинга,
    - автопереключение кратности интерполяции в зав-ти от входной ДЧ
    - поддержка конвейерного вывода данных
    - совместимость с большим кол-вом параллельных ЦАП-ов, в том числе SPI
    - 55Дб ослабление на частоте Найквиста
    - конфигурация режимов ЦФ выполняется внешними пинами, не требуя внешнего конфигурационного MCU
    - невысокая стоимость

    Фильтр писался под плисины в QFP-100 корпусах (латтис и алльтеру), но при желании проект несложно портировать и на любую другую плисину.
    В проекте не используются выделенные умножители и описание блоков памяти выполнено универсальным верилоговским стилем.

    Описание в стиле ДШ на агл. языке смотри в файле DF1_1_0_0.pdf
    Прошивки сделаны под плисины в 100-пиновых выводных корпусах: LCMXO2-2000 и EP1C3T100 - DF1_firmware.zip.
    Исходники написаны на верилоге: DF1_source.zip.
    Для гибкости проекта в него введен файл конфигурации, в котором можно менять параметры ЦФ и выбирать условную компиляцию под плисину lattice config_lattice.zip, или altera - config_altera.zip. Данный файл конфигурации дополняет исходники для компиляции проекта.
    Латтисы удобны меньшим потреблением и встроенной флешью. А циклоны - тем что их проще купить (полно на ибее).
    При этом плисины Lattice желательно выбирать с грейдом скорости выше единицы. Самый медленный ZE-1 в принципе тоже работает, но при повышенных температурах, или при просадках питания - не гарантированно.
    Так же во вложении смотри литературу по цифровой арифметике.

    Информация по тестам данного проекта вживую:

    Все модули и режимы (под латтис и под альтеру) отлаживались и проверялись во симуляторе Quartus. Для lattice fpga тайминги отдельно проверялись и оптимизировались в ide diamond.
    Так же, обе конфигурации (под латтис и под альтеру) проверялись в живую на моем ЦАПе на LCMXO2-7000ZE-1, но в ограниченном режиме. Т.е. проверено все, что позволила схемотехника моего ЦАП.
    Что проверено из основного функционала:
    - АЧХ фильтра на частоте Найквиста при входной частоте дискретизации 44,1кГц в режиме lp_mode = 0 и lp_mode = 1.
    - Работа на разном максимальном оверсемплинге: от х4 до х32.
    - Автоматическое переключение оверсемплинга при повышении входной частоты дискретизации до 384кГц.
    - Автоматическое переключение в режим байпасса.
    - Отработка переполнения (цифровой клипп на меандре и на звуковой фонограмме).
    - Индикация входной ЧД, байпасса и клиппа.
    - Вывод данных на битклоке разной скорости (от clk/4 до clk/1).
    - Смена скважности сигнала деглитчера.
    - Работа входного аттенюатора (как логикой во входном модуле, так и коэффициентами).
    - Работа дизеринга и ноизшейпинга округления данных на выходе.

    Что не проверено (проверено только в симуляторе):
    - Работа с тактовой частотой 768Fs.
    - Разные режимы вывода данных (SPI_MODE), в частности не проверена работа конвейерного вывода данных и вывод с непрерывным битклоком.
    - Не проверен вывод данных с SPI заголовками.
    - Кроме того, допускаю наличие описок и в описании (режимов работы и пинов конфигурации очень много). Поэтому версию проекта озаглавлена как alpha.
    [свернуть]


    Описание общей архитектуры ядра фильтра DF1:


    Для максимальной экономии ресурсов fpga фильтр использует х2 каскады симметричных фазолинейных FIR фильтров-интерполяторов.
    - х2 каскады снижают требуемы ресурсы для фильтрации, а так же делают удобным механизм смены кратности оверсемплинга.
    - Фазолинейность означает симметрию импульсной хар-ки относительно центрального пика.
    - Симметричность означает, что используется FIR четного порядка (это значит с нечетным числом коэф-тов, т.е. с одним центральным коэффициентом в максимуме).

    Всего в своем составе фильтр содержит 5 каскадов х2 интерполяторов, которые позволяют развивать максимальную кратность оверсемплинга 2^5 = х32.
    Каждый х2 каскад интерполятора имеет свой fifo буфер данных для расчета свертки фильтра. Итого, в составе фильтра всего 5 fifo буферов интерполяторов. Плюс, фильтр имеет отдельной fifo буфер для хранения результата расчета последнего х2 каскада.

    На каждый входной семпл х2 интерполятор рассчитывает два новых семпла.
    Входные данные всегда добавляются в fifo первого каскада. Результат расчета свертки первого каскада (два новых семпла) записывается в fifo будет 2-го каскада. Второй каскад для каждого нового семпла так же рассчитывает пару новых и результат (всего четыре новых семпла) добавляет в fifo 3-го каскада. И так далее...
    Последний 5-ый каскад для входных 16-ти семплов рассчитывает новые 32 семпла и помещает результат в fifo выходного буфера. Из выходного fifo буфера данные с заданной выходной частотой дискретизации извлекаются и передаются на выход.

    При снижении кратности оверсемплинга выходной fifo буфер принимает данные не с 5-го каскада, а из одного из предыдущих.
    Например, при кратности х8, входные данные добавляются в fifo 1-го х2 каскада. Далее, результат (два семпла) - добавляются в fifo 2-го каскада. Результат 2-го (4 семпла) добавляются в fifo 3-го каскада. И в конце - результат 3-го каскада (8 семплов) добавляются в выходной fifo буфер.

    Для экономии ресурсов fpga все каскады фильтра для расчета новых семплов используют общий арифметический блок (по одному на каждый канал) и общих блок ОЗУ. Поэтому расчет новых семплов каждого каскада выполняется последовательно (по очереди).
    Модули MAC, работают в конвейерном режиме, т.е. результат на выходе мака появляется через несколько тактов после загрузки последнего семпла данных на входе. Данное обстоятельство создает коллизию при последовательном обсчете каскадов от первого к последнему, т.к. расчет свертки следующего каскада будет начинаться раньше, чем завершится расчет семплов предыдущего каскада. Данную коллизию можно устранить просто добавляя паузы ожидания на выгрузку конвейера маков, но в таком случае упадет производительность блока арифметики.
    Поэтому, для устранения данной коллизии используется другой метод - обсчет каскадов выполняется в обратном порядке (от последнего к первому).
    Т.е. в режиме х32 оверсемплинга при загрузке нового семпла в fifo 1-го каскада, конечный автомат сначала запускает 5-ый х2 каскад и рассчитывает 32 новых семпла, которые записываются в выходной fifo буфер. Затем - второй х2 каскад, котоый записывает 16 новых семплов в fifo 5-го каскада и т.д.

    Т.к. fifo буферы размещены в общей ОЗУ, то данный блок поделен на сектора. Всего 6 рабочих секторов: 5 для fifo интерполяторов и один для выходного буфера.
    Для упрощения арифметики адресации размеры буферов fifo выбраны кратными 2^N (адрес такого буфера при переполнении автоматом переходит на начало).

    Т.к. при интерполяции промежуточные семплы прореживаются нулями, то объем fifo буфера интерполятора можно задавать вдвое меньше кол-ва отводов фильтра.
    Для первого каскада (самого длинного) выделена глубина fifo 128 семплов. Поэтому максимальная длина фильтра для данного буфера составляет 256 отводов. Максимальная длина симметричного фазолинейного фильтра при этом будет 253 (увеличить можно только на 4 отвода, тогда получится 257, что не поместится в буфере).
    Для остальных каскадов, а так же для выходного буфера глубина fifo задана 64 семпла.
    Общий блок ОЗУ имеет объем 512 семплов. Поэтому в нем занято 128 + 64 + 64 + 64 + 64 на фильтры и еще 64 на выходной буфер. Всего 448 семплов. Еще 64 слова памяти остаются не использованы.

    Адресация к блокам fifo внутри общего блока ОЗУ организована через смещения: старшие биты адреса задают адрес fifo буфера, а младшие - позицию внутри данного fifo буфера.
    [свернуть]


    Mac_Wx9

    Модуль Mac_Wx9 - собственно тот модуль который выполняет умножение с накоплением входных отсчетов из fifo на коэффициенты из блока памяти coef_rom. По результату моделирования фильтров в матлабе выяснено, что для заданных хар-к фильтра оптимальная разрядность коэффициентов составляет порядка 26..28 бит.
    Исходя из тактовой частоты 1024Fs выбрано максимально допустимое кол-во тактов умножителя на одно умножение: 3 такта. Это значит, что каждые три такта на входы умножителя подается новый семпл данных и новый коэффициент. При этом, на каждом такте выполняется умножение на 1/3 слова коэффициентов.
    Исходя из этого, разрядность коэф-тов выбрана 27 бит, как удобная с точки зрения построения умножителя (делится на три), так и с точки зрения достаточной точности вычислений. Так же 27 бит коэффициенты хорошо ложатся в выделенные блоки памяти, разрядность которых кратна 9 разрядам.
    Поэтому для данного проекта коэффициенты предварительно разбираются на 9 бит слова (для этого написана консольная утилита, которая из матлабовского файла коэффициентов создает верилоговский файл с коэффициентами в нужном формате).
    Для максимальной производительности арифметики модуль mac выполняет умножения без пропусков тактов (каждые три такта - новое умножение), пока не будут обсчитаны все х2 каскады фильтра.
    Также для оптимизации арифметики используется свойство симметрии коэффициентов фильтра. Если используются фазолинейный фильтр четного порядка, то в расчете каждого семпла выполняется умножение одного и того же коэффициента на два разных семпла данных.
    Это обстоятельство позволяет в свертке заменить выражение d1*c + d2*c выражением (d1 + d2)*c, вдвое сокращая кол-во умножений. Но в то же время, такая арифметика требует чтения двух семплов на каждое умножение (каждый семпл читается за один такт clk).
    Т.к. умножение выполняется за 3 такта, а чтение данных - за 2, то каждый 3-ий такт ОЗУ доступно для чтения результата из выходного буфера fifo.
    Учитывая кол-во тактов умножителя, синхронизация разных модулей фильтра осуществляется посредством счетчика syncnt внутри модуля DF1_FIR_CORE, который постоянно считает по циклу от нуля до двух.
    [свернуть]


    data_write

    Записью данных в fifo буфер управляет модуль data_write. Данный модуль принимает сигналы на запись данных от входного модуля sai_input (когда приняты данные SAI_input модуля) и от мака mac_control (когда на выходе мака готов очередной семпл).
    Для максимальной производительности арифметики мак работает без остановок, поэтому если оба сигнала приходят одновременно, то мак имеет более высокий приоритет (данные от модуля SAI_input запишутся после записи нового семпла из мака).
    Позиции актуальных адресов fifo хранятся в регистрах-счетчиках: currpos_st1...currpos_st6. При записи каждого нового семпла в буфер выполняется инкремент соответствующего счетчика.
    При этом, если выполняется запись данных от входного модуля, то data_write генерирует сигнал start_mac -> write_fir_start, который запускает конечный автомат управляющий арифметикой fir фильтра.
    [свернуть]


    init_adr data_adr

    Стартует алгоритм арифметики с модуля init_adr, который подготавливает данные для инициализации автомата генерации адресов интерполяторов (data_adr):
    - длина первого lenth1 и второго lenth2 прохода фильтра для данного каскада фильтра
    - кол-во повторов прохода: repeatnum
    - номер каскада, с которого начинается старт арифметики. Для х32 режима это 5-ый каскад, для х16 - 4-ый и т.д.
    - текущую позицию буфера fifo для данного каскада: curr_pos
    - номер текущего каскада х2 интерполятора: stage_num
    Модуль data_adr принимает инициализирующие значения от init_adr и генерирует адреса для заданного каскада фильтра (для расчета свертки х2 интерполятора). Так же модуль data_adr инициализирует генератор адресов коэффициентов coef_adr.
    По завершении генерации адресов data_adr генерирует сигнал next_stage обратно в модуль init_adr.
    Приняв этот сигнал init_adr готовит на свой выход данные инициализации для расчета следующего х2 каскада интерполятора.
    Обмен сигналами между модулями повторяется, пока не будут обсчитаны все каскады фильтра.
    [свернуть]


    data_read

    Модуль data_read является промежуточным модулем между fir фильтром и модулем вывода данных. По сигналу out_load от модуля SAI_output, модуль data_read запускает алгоритм чтения данных из выходного fifo буфера.
    Для этого, модуль data_read анализирует значение счетчика syncnt, и в момент когда ОЗУ свободна (нет чтения данных для мака) - выполняет чтение из буфера. Данные в новом семпле округляются с ноизшейпингом и проверяются на переполнение.
    [свернуть]


    coef_control


    Коэффициенты DF1 рассчитывались в matlab r2013b -> FDA tool -> FIR
    Для первого каскада (для самой низкой входной частоты дискретизации 44,1/48кГц) использован простой fir фильтр максимальной длины с Equiripple оптимизацией с повышенным ослаблением на частоте Найквиста. Для остальных каскадов использованы half-band фильтры.
    При повышении входной частоты дискретизации производительность фильтра пропорционально снижается, поэтому для первого каскада добавлены дополнительные наборы коэффициентов более коротких полуполосных фильтров.
    Управление наборами коэффициентов в зависимости от входной и выходной ЧД, а так же от режима lp_mode описано в файле coef_control внутри которого вызывается модуль rom_coef_control.
    Заголовок файла rom_coef_control содержит описание расчета максимального кол-ва тактов умножения для соотношения входной и выходной ЧД, исходя из которого выбирается набор коэффициентов для первого каскада интерполятора фильтра.
    [свернуть]


    Коэффициенты

    DF1 использует схему знакового умножителя в дополнительных кодах. Поэтому коэффициенты в ROM фильтра так же описаны в дополнительных кодах разрядностью 27бит (по три 9 бит слова на каждый коэффициент).
    Фактически свертка fir фильтра состоит из суммы частных (т.е. делений). Однако, т.к. арифметика деления сложнее умножений, то для замены частных значений произведениями коэффициенты переводятся в дробные значения. Т.е. выражение d/4 заменяется выражением d*0.25.
    Поэтому значения коэффициентов нормированы к единице: старший разряд дополнительного кода кодирует знак, в следующем разряде - единица, остальное дробная часть.
    Для 8 бит кода +1 выглядит так 0х40, минус один - 0хС0 (в отличие от целого числа, где минус единица это 0хFF).
    Но, если самый большой положительный коэффициент фильтра имеет значение меньше единицы, то второй бит слева всегда равен нулю. А значит можно увеличить разрядность коэффициентов на один бит без переполнения разрядной сетки.
    Matlab по умолчанию выполняет данную операцию автоматически, для максимального использования разрядной сетки коэффициентов: задает numerator range 0.5. Это значит что вес следующего разряда после знака не единица, а 0.5.
    Но в случае полуполосного фильтра максимальный (центральный) коэффициент равен единице. Поэтому matlab задает для него numerator range 1.
    Если ЦФ использует в своем составе оба типа фильтра (полуполосный и обычный), то при таком расчете получается разница размерностей коэффициентов, что не допустимо. Возникает проблема выравнивания размерностей.
    Способы решения данной проблемы:
    1. Использовать для коэффициентов неполуполосного фильтра диапазон 1 (но ухудшится точность для данного фильтра на один разряд).
    2. Задать для полуполосного фильтра размерность 0.5. Тогда matlab увеличит разрядность коэффициентов на бит, а для центрального отсчета единицу 0x40 заменит значением вдвое большим - 0x7F, чтобы получить единицу, но не выйти за пределы разрядной сетки. Но такое значение получается не ровно вдвое больше, а с погрешностью в -1LSB. К тому же, большое кол-во единиц в слове коэффициента означает большое кол-во суммирований в умножителе, что хуже с точки зрения потребления и помех.
    3. Решение использованное в DF1. Для максимального использования разрядной сетки диапазон для всех типов фильтра задается 0.5. А для полуполосного фильтра значение центрального коэф-та задается вдвое меньшим, т.е. вместо единицы - 0.5, чтобы не выйти из разрядной сетки.
    Как описано выше, умножитель имеет предварительный сумматор для суммирования двух семплов перед умножением на коэффициент. Чтобы компенсировать вдвое меньший центральный коэффициент для полуполосного фильтра значение семпла данных суммируется само с собой, что эквивалентно умножению на два. Т.е. выражение d*1 заменяется выражением (d+d)*0.5.
    Таким образом выполняется максимальное использование разрядной сетки коэффициентов с минимальным кол-вом суммирований и почти без дополнительных затрат логики.
    [свернуть]


    Конфигурация проекта


    Конфигурация проекта под разные FPGA реализуется через файл config.v, который содержит настройки условной компиляции.

    Выбор стиля описания логики. Нужен для оптимизации логики под fpga lattice или под альтеру.
    //`define LOGIC_STYLE_ALTERA
    `define LOGIC_STYLE_LATTICE

    // define RAM block zise for selected device - Выбор размера выделенных блоков памяти. Используется для оптимизации расхода блоков памяти.
    //`define BLOCK_RAM_SIZE_4K
    `define BLOCK_RAM_SIZE_9K

    // define FIR bus resolution (in bits). Valid values: from 26 to 36. - Выбор разрядности шины данных. Задает разрядность шины с учетом запаса в 1 бит на переполнение. Значение 31 бит означает разрядность данных на входе 30 бит.
    `define BUS_WIDTH 31 // Must be lower or equal ACC_WIDTH !!!!!
    Данное значение разрядности можно понижать, но для исключения накопления ошибок округления рекомендуется при этом включать дизеринг мака.

    // define accumulator bus resolution (in bits). Valid values: from 32 to 42. - Выбор разрядности аккумулятора. Разрядность так же можно понижать, но с включением дизеринга.
    `define ACC_WIDTH 37 // Must be grater or equal BUS_WIDTH !!!!!

    // MAC dithering signed random value length in bits. Valid values: from 2 to 8 - разрядность дизеринга при округдении в маке. Нуль - означает выключен.
    // Zero value switch dithering off.
    `define MAC_DITH_WIDTH 0

    // Enable dedicated FPGA multipplier - Включает описание умножителей для подключения выделенных блоков умножения, при их наличии в выбранной FPGA.
    //`define MULT_DEDICATED_ENA

    // select attenuate module: input (logic based), or coefficient (coef_ROM based) - Выбор построения входного аттенюатора: коэффициентами или входным аттенюатором.
    `define INPUT_ATT_ENA
    //`define COEF_ATT_ENA
    Аттенюация коэффициентами расходует дополнительные блоки памяти на коэффициенты (в 4 раза больше), но экономит эчейки, т.к. не использует логику на входном аттенюаторе.
    Аттенюатор во входном модуле предпочтительнее с точки зрения точности арифметики, т.к. Аттенюация коэффициентами, хоть и не значительно, но понижает разрядность коэффициентов (пропорционально уровню ослабления).

    // Input attenuator dithering signed random value length in bits. Valid values: from 2 to 8 - Задает уровень дизеринга во входном аттенюаторе. Используется при включении аттенюатора и пониженной разрядности шины данных. Нуль - значит выключен.
    // Zero value switch dithering off.
    `define ATT_DITH_WIDTH 0
    [свернуть]
    Вложения Вложения
    Последний раз редактировалось dortonyan; 15.11.2021 в 12:28.

  2. #221
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    А как вы определяли что на входе именно 48к? Смотрели скопом или частотомером? Может в транспорт клок 1024Fs идет вместо 512?

  3. #222
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Нет. У меня всё чётко. Смотрю скопом LRCK на входе ЦФ. На мой транспорт идёт 512фс. Включил у вас делитель.

    ---------- Сообщение добавлено 21:53 ---------- Предыдущее сообщение было 21:48 ----------

    Запустились тдашки в вашем конвейере на 8фс каждая. ЦФ при этом в режиме 16х.
    На 16фс нет. WCK = 2 битклока, а надо бы 1. И данные сдвигаются на примерно 8 битклоков, поэтому не хочет работать.

  4. #223
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Нет. У меня всё чётко. Смотрю скопом LRCK на входе ЦФ. На мой транспорт идёт 512фс. Включил у вас делитель.
    Странное дело. Позже посмотрю у себя еще раз. Неправильная только индикация?

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Запустились тдашки в вашем конвейере на 8фс каждая. ЦФ при этом в режиме 16х.
    На 16фс нет. WCK = 2 битклока, а надо бы 1. И данные сдвигаются на примерно 8 битклоков, поэтому не хочет работать.
    Имеете в виду ширину WCK надо в 1 клок? А зачем? Максимального ограничения на ширину нету.
    Для вашего случая осциллограммы х32 режима должны выглядеть так:Нажмите на изображение для увеличения. 

Название:	conv_1541x2.png 
Просмотров:	76 
Размер:	51.2 Кб 
ID:	419344
    Частота битклока получается Fclk/3, т.е. около 15МГц для редбука.

  5. #224
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    С делителем на 3 не пробовал. Завтра уже попробую, спасибо.
    Сейчас так:
    Нажмите на изображение для увеличения. 

Название:	20220322_220659.jpg 
Просмотров:	103 
Размер:	2.07 Мб 
ID:	419345

    ---------- Сообщение добавлено 22:32 ---------- Предыдущее сообщение было 22:22 ----------

    Не удержался, сделал. Да, работают так тдашки на 16фс каждая.
    Нажмите на изображение для увеличения. 

Название:	20220322_223334.jpg 
Просмотров:	95 
Размер:	2.06 Мб 
ID:	419346
    Работает этот вариант на 44, 88 и 176кГц. Но на сетке х48 уже шипят.
    Нужно переделывать на вариант Fclk/4, как у меня в конвейере.
    ---------- Сообщение добавлено 22:55 ---------- Предыдущее сообщение было 22:32 ----------
    Пока вернулся на 8фс. Работает, проверил 44...192кГц. Больше не проверял.
    Последний раз редактировалось Turbo_man; 22.03.2022 в 22:53.

  6. #225
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Работает этот вариант на 44, 88 и 176кГц. Но на сетке х48 уже шипят.
    Можно сделать автомат, чтобы на редбуке работал режим х32, а в сетке 48к - х16.
    А еще попробуйте вывести на пины включение дизеринга и шейпинга и посмотрите разницу на спектре синуса амплитудой -60дБ.

    ---------- Сообщение добавлено 23:25 ---------- Предыдущее сообщение было 23:05 ----------

    Да, еще момент. Насмотрел на ваших осциллограммах, что загрузка данных в ЦАП выполняется по положительному фронту BCK, а по ДШ для режима simultaneous должна быть по спаду BCK.
    Т.е. нужно задавать единицу на входе bck_inv.

  7. #226
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Похоже, что и сейчас какой-то дизер есть, хотя в конфиге прописано 0.

    ---------- Сообщение добавлено 23:27 ---------- Предыдущее сообщение было 23:25 ----------

    Когда мьютирую данные в источнике, на входах данных тдашек есть сигнал с уровнями.

  8. #227
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Похоже, что и сейчас какой-то дизер есть, хотя в конфиге прописано 0.
    Не, в конфиге выбирается только дизер арифметики. А я про дизеринг выходных данных, смотрите ответы по 2,3 пунктам.

  9. #228
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    С телефона было сложно цитировать. Сейчас на ПК.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Неправильная только индикация?
    Похоже на то.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Имеете в виду ширину WCK надо в 1 клок?
    Да, у меня так при непрерывном 16-битклочном фрейме.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Максимального ограничения на ширину нету.
    Не уверен. Опытным путём нашёл.

    ---------- Сообщение добавлено 23:41 ---------- Предыдущее сообщение было 23:39 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Можно сделать автомат, чтобы на редбуке работал режим х32, а в сетке 48к - х16.
    Да, можно, но ваш конвейер только временно использую. Пока не прилеплю свой.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Да, еще момент. Насмотрел на ваших осциллограммах, что загрузка данных в ЦАП выполняется по положительному фронту BCK, а по ДШ для режима simultaneous должна быть по спаду BCK.
    Т.е. нужно задавать единицу на входе bck_inv.
    Никогда так не пробовал. Завтра попробую. У меня всё всегда работает по положительному фронту. Решил, что это как обычный SPI.

    ---------- Сообщение добавлено 23:43 ---------- Предыдущее сообщение было 23:41 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Не, в конфиге выбирается только дизер арифметики. А я про дизеринг выходных данных, смотрите ответы по 2,3 пунктам.
    Понял. Забыл уже про это. Начало ноября тогда было.

    ---------- Сообщение добавлено 23:47 ---------- Предыдущее сообщение было 23:43 ----------

    Кстати звук понравился, какая-то в нём лёгкость. Это основное, что привлекло внимание.

    ---------- Сообщение добавлено 23:49 ---------- Предыдущее сообщение было 23:47 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    А еще попробуйте вывести на пины включение дизеринга и шейпинга и посмотрите разницу на спектре синуса амплитудой -60дБ.
    На днях попробую. Аудио-карта не рядом тут.

    ---------- Сообщение добавлено 23.03.2022 в 00:01 ---------- Предыдущее сообщение было 22.03.2022 в 23:49 ----------

    Я интерпретировал это как смена данных по отриц. фронту.

    Нажмите на изображение для увеличения. 

Название:	simultan.jpg 
Просмотров:	50 
Размер:	78.3 Кб 
ID:	419348Нажмите на изображение для увеличения. 

Название:	timing.jpg 
Просмотров:	43 
Размер:	137.7 Кб 
ID:	419349

    ---------- Сообщение добавлено 00:15 ---------- Предыдущее сообщение было 00:01 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    2, 3 - отладочные входы, которыми можно по отдельности отключать дизеринг и ноизшейпинг, в проекте они заданы константами - единицами.
    сами сигналы нашёл в модуле df1_fir_core, но где присвоение им "1" не увидел. Нашёл в модуле DF1.
    Код:
    .dithen( 1*b1 ), .shpen( 1*b1 ),
    ---------- Сообщение добавлено 00:33 ---------- Предыдущее сообщение было 00:15 ----------

    Может кому пригодится частотомер для Fs.
    Делюсь, проверено, работает:
    Нажмите на изображение для увеличения. 

Название:	freq_count.png 
Просмотров:	120 
Размер:	33.5 Кб 
ID:	419350
    Оказалось, что в этой схеме сброса счёткика есть нюанс, работает в серии MAX II, но не работает в серии Cyclone IV.
    См. позже исправленную схему.
    LRCK можно любой, не обязательно как на картинке LJ.
    Последний раз редактировалось Turbo_man; 29.03.2022 в 18:22.

  10. #229
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Может кому пригодится частотомер для Fs.
    Делюсь, проверено, работает:
    Разобрался со своим. У меня тоже все работает правильно, касяк в описании. Т.е. индикация начинается не с нуля, а с единицы. Специально так с делал для удобства и забыл.
    Плохо, что нельзя отредактировать заглавный пост.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Не уверен. Опытным путём нашёл.
    Там скорее всего нужна не минимальная ширина WCK, а какие-то минимальные задержки между фронтами WCK и битклоком: tFBRL, tRBFL.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Я интерпретировал это как смена данных по отриц. фронту.
    Не, tsu - это setup time - время установления данных до строба, в данном случае до отрицательного строба.
    Т.е. запись происходит по спаду BCK. Единственное, что на предельных скоростях возможно выгоднее оставить как есть, для максимизации тайминга tsu, т.к. thd допустим вообще нуль.
    Но попробовать в любом случае стоит оба варианта.

    Еще напомню, что у 1541 формат данных в simultaneous не стандартный: offset binary (если я правильно понял ДШ). Соот-но на входе ob_ntwc должна так же быть единица.
    А у вас на скрине нуль. Осциллограммы синуса на выходе ЦАП не глядели?

    Для вывода управления дизера с шейпером на проты, надо в скопе входов/выходов добавить соотв входы, например:
    input dith_ena, shp_ena,
    А потом эти сигналы подать в модуль df1_fir_core:
    .dithen( dith_ena ), .shpen( shp_ena ),
    Последний раз редактировалось dortonyan; 23.03.2022 в 07:51.

  11. #230
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от dortonyan Посмотреть сообщение
    У меня тоже все работает правильно, касяк в описании.
    Ну вот. Значит мой диагноз верен. Но это пустяки, бывает.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Т.е. индикация начинается не с нуля, а с единицы.
    Надо править пдф-ку.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Там скорее всего нужна не минимальная ширина WCK
    Нужна, я пробовал LE шире 1 bck - не работает, а вот Уже работает, т.е. LE=0,5bck годится тоже (длительность LE может равняться длительности импульса bck и совпадать во времени).
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Но попробовать в любом случае стоит оба варианта.
    Давно пробовал, уже забыл, но вроде не работало.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    на входе ob_ntwc должна так же быть единица.
    Конечно сделал. Давно работаю с TDA1541.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Осциллограммы синуса на выходе ЦАП не глядели?
    Полный размах 6,3В. Длина ступеньки 1,5мкс (т.е. ~700кГц) после суммирования двух ветвей конвейера 8х (352кГц).

    Цитата Сообщение от dortonyan Посмотреть сообщение
    надо в скопе входов/выходов добавить соотв входы, например:
    input dith_ena, shp_ena,
    А потом эти сигналы подать в модуль df1_fir_core:
    .dithen( dith_ena ), .shpen( shp_ena ),
    Спасибо, сделаю позже.

  12. #231
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Нужна, я пробовал LE шире 1 bck - не работает, а вот Уже работает, т.е. LE=0,5bck годится тоже (длительность LE может равняться длительности импульса bck и совпадать во времени).
    Не, ну то что оно начинает работать вовсе не означает, что причина в ширине WCK. Скорее всего причина в таймингах между фронтами WCK и BCK. Надо разбирать конкретный случай с конкретными таймингами.
    Например, при загрузке данных WCK должен быть строго в нуле. Может у вас WCK при определенной ширине просто "налазил" на BCK?

  13. #232
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Может у вас WCK при определенной ширине просто "налазил" на BCK?
    Конечно, речь же про непрерывный битклок в 16-битклочном фрейме. Иначе режим 16Fs не получить толком.
    Мой вариант решения рабочий и стабильный. Но не навязываю, решайте как вам удобнее.

  14. #233
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Понятно, т.е. речь про х32 режим в конвейере с частотой битклока Fclk/4. Но даже с шириной WCK в пол такта нужно инвертировать BCK, иначе не выполняется условие тайминга tFBRL.
    Хотя здесь конечно надо тупо пробовать, т.к. 1541 в любом случае работает на запредельных скоростях.
    Кстати, не пробовали для "разгона" приподымать цифровое питание, например до +5,5В? Может тогда и на clk/3 будет нормально работать?

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Мой вариант решения рабочий и стабильный. Но не навязываю, решайте как вам удобнее.
    Так я на 1541 ничего не делаю и по сему также ни на чем не настаиваю. Просто участвую в обсуждении реализации.

    В общем, пока что касяк нашелся только в описании индикации? Проблемы с входным интерфейсом нету?

    ---------- Сообщение добавлено 11:39 ---------- Предыдущее сообщение было 11:35 ----------

    Да еще, у меня же в проекте есть еще выходы ltch, которые можно использовать вместо WCK. Там ширина как раз пол битклока (для частоты clk/4). Нужно только этот сигнал инвертировать и придержать на несколько тактов.

    ---------- Сообщение добавлено 11:48 ---------- Предыдущее сообщение было 11:39 ----------

    Даже можно доработать.
    Для этого в файле spi_gen строку
    rlat <= (scnt <= 5 && scnt >= 4) ? (~rddm & ddm) : 1;
    нужно заменить на:
    rlat <= (scnt <= 2 && scnt >= 1) ? (~rddm & ddm) : 1;

    А строку
    assign lat = rlat ^ outInv;
    заменить на:
    assign lat = rlat ^ ~outInv;

    Получается так:
    Нажмите на изображение для увеличения. 

Название:	conv_1541x2_lat.png 
Просмотров:	52 
Размер:	55.2 Кб 
ID:	419366

    ---------- Сообщение добавлено 11:52 ---------- Предыдущее сообщение было 11:48 ----------

    Или даже так:
    rlat <= (scnt ==1) ? (~rddm & ddm) : 1;

    Тогда latch будет минимальной ширины - всего один такт clk:
    Нажмите на изображение для увеличения. 

Название:	conv_1541x2_lat2.png 
Просмотров:	41 
Размер:	55.4 Кб 
ID:	419367

  15. #234
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Проблемы с входным интерфейсом нету?
    Я пробовал только режим I2S (format=00). С ним проблем нет точно. Если нужно проверю другие, но скорее всего, и там будет норм.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    у меня же в проекте есть еще выходы ltch
    Там вроде данные выходят длиной всего 8 бит (просимулируйте), поэтому пока не буду пробовать.

    ---------- Сообщение добавлено 12:11 ---------- Предыдущее сообщение было 11:53 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Кстати, не пробовали для "разгона" приподымать цифровое питание, например до +5,5В? Может тогда и на clk/3 будет нормально работать?
    Нет, не пробовал. Там и минус 5, возможно надо пробовать. Платы спаяны, курочить лень. Мой вариант и на +/-5В работает очень стабильно.

  16. #235
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Там вроде данные выходят длиной всего 8 бит (просимулируйте), поэтому пока не буду пробовать.
    Не понял, откуда 8 бит? На скринах из симуляции выше разрядность выходных данных 16 бит с частотой битклока Fclk/4.

  17. #236
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Не понял, откуда 8 бит?
    Я и сам не знаю. Там данные запаздывали на 8 бит. И длина их была не 16 бит. Сделаю фото чуть позже.
    Это было вчера, до ваших доработок.

  18. #237
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Кстати звук понравился, какая-то в нём лёгкость. Это основное, что привлекло внимание.
    Что касается звука, то скорее всего он будет больше зависеть от ЦАПовой части.
    Единственное что можно сравнить, это переключать на ходу сигнал lp_mode на музыке в формате редбука. Если в единице, то первый скаскад ЦФ работает как стандартный полуполосник, аля 5847. Ну а если в в нуле, то первый каскад работает с дополнительным ослабление на Найквисте, т.е. с пониженным алиясингом (основная "фича" данного ЦФ).
    Ну и дизеринг с алиясингом можно попереключать, хотя не факт, что будет заметна разница на слух.

    ---------- Сообщение добавлено 12:51 ---------- Предыдущее сообщение было 12:49 ----------

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Я и сам не знаю. Там данные запаздывали на 8 бит. И длина их была не 16 бит. Сделаю фото чуть позже.
    Это было вчера, до ваших доработок.
    Описанные доработки на длину данных не влияют, надо разбираться что за чудо. Такого быть не должно.

  19. #238
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Я был не прав про 8 бит с задержкой. Сегодня по вчерашней прошивке wck=1.75bck, сигнал появился, но полный размах половинныйи со смещением по постоянке в положительную сторону. Искажений синуса при этом нет.

    ---------- Сообщение добавлено 13:14 ---------- Предыдущее сообщение было 13:12 ----------

    После всех сегодняшних доработок ltch=0.5bck всё заработало как надо.
    Нажмите на изображение для увеличения. 

Название:	20220323_130449.jpg 
Просмотров:	84 
Размер:	2.56 Мб 
ID:	419373

    Битклок не инвертирован, данные мьютированы.

    ---------- Сообщение добавлено 13:20 ---------- Предыдущее сообщение было 13:14 ----------

    Попробовал, инвертирование bck ничего на слух не меняет.
    Нажмите на изображение для увеличения. 

Название:	20220323_132143.jpg 
Просмотров:	48 
Размер:	2.94 Мб 
ID:	419374

    ---------- Сообщение добавлено 13:28 ---------- Предыдущее сообщение было 13:20 ----------

    Вчера было примерно так, только был wck, а не ltch.
    Нажмите на изображение для увеличения. 

Название:	20220323_132536.jpg 
Просмотров:	52 
Размер:	2.46 Мб 
ID:	419375

    ---------- Сообщение добавлено 13:29 ---------- Предыдущее сообщение было 13:28 ----------

    Это неудачное включение питания, что-то не ресетилось похоже. Сегодня тоже выскочило, но реже.

    ---------- Сообщение добавлено 14:19 ---------- Предыдущее сообщение было 13:29 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Что касается звука, то скорее всего он будет больше зависеть от ЦАПовой части.
    Она не менялась в сравнении с прошлым прослушиванием.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Единственное что можно сравнить, это переключать на ходу сигнал lp_mode на музыке в формате редбука.
    Попробую обязательно, сейчас сигнал не выведен наружу.

    ---------- Сообщение добавлено 14:21 ---------- Предыдущее сообщение было 14:19 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Ну а если в в нуле, то первый каскад работает с дополнительным ослабление на Найквисте, т.е. с пониженным алиясингом (основная "фича" данного ЦФ).
    Это типа SLOW + доп. подавление на 22кГц? А сколько на 20кГц?

    ---------- Сообщение добавлено 14:22 ---------- Предыдущее сообщение было 14:21 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Ну и дизеринг с алиясингом можно попереключать
    Описка. Типа дизеринг с нойзшейпингом? Тоже сделаю. Но больше для измерений спектра.

    ---------- Сообщение добавлено 16:05 ---------- Предыдущее сообщение было 14:22 ----------

    А вообще-то мне понравилась идея делать частоту BCLK нестандартной, например 1024Fs/3 или ещё что-то в таком же духе для 16...20 битовых параллельных ЦАП-ов. С целью снизить эту частоту ниже 512Fs. Цапы от ADI будут рады. Для цапов B-B это не очень актуально, но и не помешает.
    Я как-то до такого "не допетрил".

  20. #239
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,221

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Я был не прав про 8 бит с задержкой. Сегодня по вчерашней прошивке wck=1.75bck, сигнал появился, но полный размах половинныйи со смещением по постоянке в положительную сторону. Искажений синуса при этом нет.
    Похоже, что одного сдвига в ЦАПе не хватает, т.е. когда WCK переходит в единицу раньше, чем закончится битклок.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Попробовал, инвертирование bck ничего на слух не меняет.
    Если так работает, то лучше так и оставить, загрузка данных будет стабильнее, чем на краю бита данных. Только проверять лучше не на слух, а осциллографом синус на выходе. Мелкие артефакты с ходу можно не услышать.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Это типа SLOW + доп. подавление на 22кГц? А сколько на 20кГц?
    Смотрите пдф-ку на DF1, там есть сравнительные графики АЧХ переходной полосы в разных режимах.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Описка. Типа дизеринг с нойзшейпингом? Тоже сделаю. Но больше для измерений спектра.
    Да, описка, с шейпингом конечно.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    А вообще-то мне понравилась идея делать частоту BCLK нестандартной, например 1024Fs/3 или ещё что-то в таком же духе для 16...20 битовых параллельных ЦАП-ов. С целью снизить эту частоту ниже 512Fs. Цапы от ADI будут рады. Для цапов B-B это не очень актуально, но и не помешает.
    Я как-то до такого "не допетрил".
    Да, на самом деле это тоже фича данного ЦФ, на которую никто до сих пор не обратил внимания. Т.к. вывод bck на частоте clk/1 и clk/3 с симметричной скважностью и самое главное - синхронно с данными. Т.е. без разбежек фронтов независимо от грейда скорости плисины.
    Для этого я изобрел формирование клока путем деления мастерклока с синхронизацией по двум фронтам clk, с последующим умножением через XOR. Получилось что-то вроде умножителя в PLL.
    Т.е. для clk/1 делается пара делителей на 2, но один синхронизирован по фронту clk, второй по спаду. Получается два меандра частотой Fclk/2, сдвинутых по фазе. Далее выход делителей объединяются XOR вентилем, и получаем на выходе удвоенную частоту, равную частоте clk, но уже синхронную с данными.
    То же самое выполняется для делителя на 3: мастерклок делится парой делителей на 6 по обеим фронтам clk, а потом суммируя сдвинутые по фазе клоки через XOR умножаем их на 2, получая на выходе частоту Fclk/3 с симметричной скважностью и синхронную с данными.
    Понимаю, что скорее всего изобрел велосипед, просто ранее такого решения не встречал.
    Последний раз редактировалось dortonyan; 23.03.2022 в 17:30.

  21. #240
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,564

    По умолчанию Re: Проектируем цифровой фильтр для ЦАП 2

    Спасибо. Вывел все сигналы управления ЦФ на пины: ачх цф, дизер и нойзшейпинг.
    Теперь начинаю прослушку того, что наваялось.
    Инвертирование bck, как вы настаивали, чуть-чуть делает линию скопа тоньше на синусе. У меня фнч нет совсем. Ступеньки на синусе 20кГц -3дБ очень маленькие длит.=700нс.

    ---------- Сообщение добавлено 18:22 ---------- Предыдущее сообщение было 18:13 ----------

    Для варианта конвейером 2шт. тда1541 очень рекомендую.
    Но пока улучшения от перевода цф на "slow++" не чувствую.

Страница 12 из 33 Первая ... 2101112131422 ... Последняя

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •