Страница 5 из 33 Первая ... 3456715 ... Последняя
Показано с 81 по 100 из 647

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

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

    По умолчанию Проектируем цифровой фильтр для ЦАП 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. #81
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,572

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Должно получиться еще универсальнее - на плисинах с выделенными блоками умножения они будут подключаться автоматом.
    Да, это был бы идеальный вариант. Ждём.

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

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

    Да, забыл описать один момент. Разрядность данных на входе модуля DF1_FIR_CORE должна быть на бит меньше разрядности шины (входные данные ослаблены на 6дБ помимо входного аттенюатора), т.к. старший бит шины данных этого модуля используется для отработки переполнения при цифровом клиппе.


    Offтопик:
    Обновил заголовок. Далее буду понемногу дописывать туда информацию по архитектуре и схемотехнике данного ЦФ.
    Последний раз редактировалось dortonyan; 07.11.2021 в 13:30.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Да, забыл описать один момент.
    Спасибо, но так как всё равно надо начинать с полного проекта и постепенно его обрезать до нужных блоков, то это бы обнаружилось достаточно быстро.
    Я планировал отрезать входной блок в самом конце, да и то только тогда, когда и если возникла бы острая необходимость. Скорее к нему довешу + автомат по битклокам.

    ---------- Сообщение добавлено 16:09 ---------- Предыдущее сообщение было 16:07 ----------


    Offтопик:
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Далее буду понемногу дописывать туда информацию
    Вроде не более месяца будет такая возможность.

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

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


    Offтопик:
    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Вроде не более месяца будет такая возможность.
    Мне хватит. Основные моменты/нюансы я уже описал. Больше ничего хитрого там нету, дело техники. Обычно дорабатывать чужой код сложно, легче (и интереснее) разработать свое. Поэтому дальше углубляться в описание считаю бессмысленным.
    Есть еще самодельная утилита для генерации коэф-тов на верилоге из матлабовских файлов. Используя матлаб и утилиту можно для данного проекта (и не только для данного) самостоятельно нагенерить каких угодно коэффициентов (с ограничениями на длину и тип фильтра).
    Но не уверен что оно кому-то надо. Коэффициенты я и так постарался подобрать оптимальные. Единственное, что для первого каскада можно попробовать использовать half-band максимальной длинны. Чтобы расширить полосу пропускания выше 20кГц, а алиясинг давить за счет сужения переходной полосы.
    Но это уже из разряда баловства, нежели реальной необходимости.


    ---------- Сообщение добавлено 14:06 ---------- Предыдущее сообщение было 11:49 ----------

    Цитата Сообщение от sia_2 Посмотреть сообщение
    Все остальное сделает синтезатор, сам задействует умножители, причем при правильных констрейнах ничуть не хуже, чем "руками". Больше того, если делать конвейеризованный умножитель, на верилоге можно просто добавить каскад регистров на входы или выход - синтезатор сам их распихает внутрь умножителя.
    Попробовал описать таким образом матрицу умножения. Все таки "руками" получается лучше. По крайней мере в квартусе версии 9.1SP2.
    Под 2-ой циклон все хорошо, блоки умножения подключаются, но под первый циклон синтезатор кватруса тратит на каждую матрицу на сотню ячеек больше, чем в самодельном варианте.

    Кому интересно - вот исправленный на скорую руку мак (в симуляторе вроде работа не поменялась, но за работоспособность не ручаюсь):
    Mac_Wx9_A_dedicated.zip


    Перезалил исходники проекта. Добавил условную компиляцию для подключения выделенных блоков умножения.
    Последний раз редактировалось dortonyan; 08.11.2021 в 16:03.

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

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

    Спасибо.

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

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

    Сходу из новых файлов скомпилировать проект с использованием аппаратных умножителей не получилось.
    Только переименование файла Mac_Wx9_A_dedicated в Mac_Wx9_A в папке проекта DF1 помогло.
    Ожидал, что само сконфигурируется.

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

Название:	hard_mult.png 
Просмотров:	80 
Размер:	11.0 Кб 
ID:	408747

  8. #87
    Частый гость Аватар для Traktorist3d
    Регистрация
    06.01.2015
    Адрес
    Хабаровск, Камчатка
    Сообщений
    472

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

    Всем привет, пардон во всю документацию ещё не вник, данную реализацию ЦФ можно использовать для 8 каналов вместо 2х?

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

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

    Если проект собирается из исходников самостоятельно, то конечно стерео фильтр можно размножать на любое кол-во каналов. Одноименные конфигурационные входы при этом включаются в параллель. Компилятор сам выкинет лишнюю (дублирующую) логику.
    Модуль вывода данных, при необходимости, так же можно упрощать, подавая на ненужные конфигурационные входы константы. Что, например, для многоканального варианта позволит серьезно сэкономить на ресурсах LUT ячеек fpga.

    ---------- Сообщение добавлено 11:01 ---------- Предыдущее сообщение было 10:59 ----------

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Сходу из новых файлов скомпилировать проект с использованием аппаратных умножителей не получилось.
    Только переименование файла Mac_Wx9_A_dedicated в Mac_Wx9_A в папке проекта DF1 помогло.
    Чтобы включить использование выделенных умножителей в новом файле конфигурации надо разкомментировать соответствующую строку дефайна: MULT_DEDICATED_ENA. По умолчанию она закомментирована. В заголовке смотри полное описание файла конфигурации (какие дефайны для чего используются).
    Т.к. из ячеек квартус синтезирует умножитель не оптимально, то для плисин с выделенными блоками пришлось добавлять условную компиляцию.
    Последний раз редактировалось dortonyan; 10.11.2021 в 11:52.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    в новом файле конфигурации надо разкомментировать соответствующую строку дефайна: MULT_DEDICATED_ENA. По умолчанию она закомментирована.
    Спасибо, не заметил это, хотя мельком просматривал новый файл config.
    Даже компилировал с ОЗУ блоками 9К. Чуть-чуть иначе распределяются ресурсы при этом. Кстати, в каком случае это нужно делать?

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

Название:	hard_mult_ram_9k.png 
Просмотров:	60 
Размер:	11.1 Кб 
ID:	408786

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

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

    Я вот сейчас увидел еще касяк с выделенными блоками. Их расходуется больше, чем должно. Начал разбираться, оказалось синтезатор квартуса при синтезе не обрезает лишнюю разрядность множимого.
    Поправить вроде удалось, сейчас перепроверю и перезалью исходники.

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

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Даже компилировал с ОЗУ блоками 9К
    4к в 1-ом.
    Во 2-ом циклоне блоки уже идут вроде по 9к. Но точно не помню, надо сверяться по ДШ. Работать будет в любом случае, но для оптимизации лучше задавать правильный размер блока. Т.е. с неправильным размером просто больше расход блоков памяти или ячеек.
    Это связано с тем, что разрядность блоков 9bit - не делится на два. И при определенном размере блоков синтезатор для упрощения логики адресации синтезирует 4bit блоки памяти. Два блока по 4 бита дают в сумме 8, т.е. старший бит памяти в таком случае не используется.
    Поэтому я немного усложнил логику адресации (затраты на 10 ячеек больше), но зато блоки памяти используют все 9 бит (соот-но блоков расходуется меньше).
    Последний раз редактировалось dortonyan; 10.11.2021 в 12:53.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Я вот сейчас увидел еще касяк с выделенными блоками.
    Как обычно, это не последний, наверно.

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Во 2-ом циклоне блоки уже идут вроде по 9к. Но точно не помню, надо сверяться по ДШ.
    В 4-ом Циклоне точно 9К (блоки М9К).
    Последний раз редактировалось Turbo_man; 10.11.2021 в 12:52.

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

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

    Перезалил исходники, поправил код для выделенных блоков умножения. На своей плате ЦАП не проверял, но в симуляторе все ОК, можно пробовать.
    Как всегда - косяк со знаковой арифметикой. Вроде удобная вещь, но на верилоге реализована через одно место, с миллионом ограничений. Без привычки все время натыкаюсь на грабли со знаками.
    Заодно добавил в заголовок статью по работе со знаковыми переменными в verilog.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Как обычно, это не последний, наверно.
    Надеюсь что последний.
    Соб-но код оптимизирован достаточно хорошо, это не первая итерация. Единственное, в чем не уверен на 100%, это в дизеринге мака. Т.к. получилась сложная схема (для экономии ресурсов сумматоры дизеринга совмещены с регистрами мака) его неудобно отлаживать.
    Поэтому по умолчанию дизеринг не используется, вместо этого разрядность шины данных задано достаточно большой (30 бит). У выбранного латтиса ресурсов на еще бОльшую разрядность не хватает, но на циклоне при желании можно увеличить еще.

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

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

    dortonyan, не знаю насколько это критично, но компилятор выдаёт уведомления, что macro "POLYNOM" имеет несколько разных значений в разных модулях и он их переопределяет.
    Тут нет засад?

    Warning (10274): Verilog HDL macro warning at NoiseShape.v(4): overriding existing definition for macro "POLYNOM", which was defined in "att_4x12.v", line 4
    Warning (10274): Verilog HDL macro warning at mac_control.v(13): overriding existing definition for macro "POLYNOM", which was defined in "att_4x12.v", line 4


    Ещё жалуется, что ему не хватает констрейнов для правильной оптимизации компиляции, хотя всё проходит нормально. Откуда они берутся? Или где взять файл с этими "констрейнами".

    Critical Warning: Synopsys Design Constraints File file not found: *DF1.sdc*. A Synopsys Design Constraints File is required by the TimeQuest Timing Analyzer to get proper timing constraints. Without it, the Compiler will not properly optimize the design.

  15. #94
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    62
    Сообщений
    2,124

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

    Владимир, я создал пустой DF1.sdc и компилятор больше не ругается.

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

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

    По констрейнам не скажу, я глубокой оптимизацией таймингов не занимался, т.к. быстродействия для данного проекта у циклонов и так хватает с запасом. Если появляются какие-то непонятные баги (например после внезапного выключения ПК, или нечаянного удаления какого-нить файла проекта) - я просто пересоздаю проект, разбираться лень.
    Единственное, что нужно сделать для выравнивания фронтов сигналов на выходе - задать ограничения параметров tco, tpd в Classic Timing Analizer в настройках проекта. У меня задано по 8нс, но можно и просто нули, разницы по результату не видно. Там же можно задать и Default requared fmax в 50MHz, но оно по факту тоже ни на что не влияет, не те скорости.

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

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    dortonyan, не знаю насколько это критично, но компилятор выдаёт уведомления, что macro "POLYNOM" имеет несколько разных значений в разных модулях и он их переопределяет.
    Тут нет засад?
    Я это все вообще не читаю.
    Ну только в каких-то редких случаях. Оптимизатор может что-то обрезать, менять логические уровни на каки-то промежуточных сигналах. Но на выходе ничего меняться не должно (я по крайней мере таких багов не встречал).
    Все модули и генераторы ПСП в том числе я отлаживал по отдельности, проблем там быть не должно. Ну и вживую дизеринг проверен - работает. Правда я проверял на латтисе, но на циклоне на врят ли будет иначе.

    Проверил в своем проекте - точно! Какой-то касяк с переопределением полинома (зря не читал варнинги). Надо перепроверять, не подменил ли компилятор полином.
    В общем да, касяк - не усмотрел. Переименовал в маке и аттенюаторе макросы полиномов и квартус перестал ругаться. Сейчас перезалью исходники.
    Прошивки тоже переделал и перезалил.

    Turbo_man, спасибо за проверки! Проект еще не запущен, а баг уже найден. )
    Последний раз редактировалось dortonyan; 11.11.2021 в 22:06.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    По констрейнам не скажу
    Может Сергей Агеев немного нам поможет? Если он не возражает, и это доступно начинающим.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    для выравнивания фронтов сигналов на выходе - задать ограничения параметров tco, tpd в Classic Timing Analizer в настройках проекта.
    К сожалению, у меня эти настройки невозможно редактировать, всё "серое". Может лицензия не даёт или ещё что-то?

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

Название:	cta.png 
Просмотров:	63 
Размер:	36.0 Кб 
ID:	408940

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Надеюсь что последний.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    спасибо за проверки! Проект еще не запущен, а баг уже найден. )
    Рад быть полезным.


    Offтопик:
    В качестве "бреда":
    1. Имея такой ЦФ, как мне кажется, осталось совсем немного (уже полшага) до создания на его базе своего ASRC для тех случаев, когда используются асинхронные источники (например, по SPDIF), что было бы для меня интересным. Как альтернативу тут же можно сделать ФИФО на внешнем ОЗУ, но это я уже сам могу попробовать сделать.
    2. Декодер SPDIF в этой же FPGA тоже был бы не лишним, хотя это можно уже и самостоятельно сделать.
    Последний раз редактировалось Turbo_man; 12.11.2021 в 14:54.

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

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

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    К сожалению, у меня эти настройки невозможно редактировать, всё "серое". Может лицензия не даёт или ещё что-то?
    У меня квартус бесплатной версии (9.1SP2), там все доступно. Можешь скачать с облака: https://cloud.mail.ru/public/UmLb/iSnY4KCnk

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    В качестве "бреда":
    1. Имея такой ЦФ, как мне кажется, осталось совсем немного (уже полшага) до создания на его базе своего ASRC для тех случаев, когда используются асинхронные источники (например, по SPDIF), что было бы для меня интересным. Как альтернативу тут же можно сделать ФИФО на внешнем ОЗУ, но это я уже сам могу попробовать сделать.
    2. Декодер SPDIF в этой же FPGA тоже был бы не лишним, хотя это можно уже и самостоятельно сделать.
    Да, ресурсов у 4-го циклона на много чего хватит, было бы желание.
    На счет ASRC - из интерполятора его не сделать. Т.е. доработка нужна существенная, возможно проще будет разработать свое с нуля. Я вообще не в курсе как работает ASRC. FIR - для фильтрации выходного потока семплов это понятно, а вот как выполняется семплирование и как выбираются коэффициенты....
    Например в AD1896, если я правильно понял, коэффициенты рассчитываются автоматически по соотношению ЧД на входе и выходе.

    Можно еще сделать как у tomtit: спдиф + VCXO. Единственное, что хорошие VCXO достать возможно будет еще сложнее чем обычные 1024Fs осцилляторы.
    Но, как по мне - лучше купить или разработать USB транспорт на MCU. USB тупо практичнее во всех отношениях.

    Кстати, что там получилось с блоками умножения? После правок должно использоваться 8 шт. при разрядности шины до 35 бит.
    Последний раз редактировалось dortonyan; 12.11.2021 в 16:36.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Можешь скачать с облака
    Качаю, спасибо.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Кстати, что там получилось с блоками умножения? После правок должно использоваться 8 шт. при разрядности шины до 35 бит.
    Да, всё ОК.

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

Название:	hard_mult_ram_9k_mod.png 
Просмотров:	60 
Размер:	11.1 Кб 
ID:	408950Нажмите на изображение для увеличения. 

Название:	hard_mult_ram_4k_mod.png 
Просмотров:	49 
Размер:	11.1 Кб 
ID:	408951

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Да, ресурсов у 4-го циклона на много чего хватит, было бы желание.
    Желание имеется.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    На счет ASRC - из интерполятора его не сделать.
    Из давнишнего разговора с sia_2 у меня сложилось иное мнение. Но возможно, я неправильно интерпретировал сказанное им.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    возможно проще будет разработать свое с нуля.
    Это конечно, ни в коем случае не давил на тебя, подумал, вдруг заинтересует. На сегодня я сам не способен.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Можно еще сделать как у tomtit: спдиф + VCXO.
    Это уже реализовано. Автор если захочет, опубликует что-то оттуда.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    хорошие VCXO достать возможно будет еще сложнее чем обычные 1024Fs осцилляторы.
    Наверно. А гены на 1024Fs уже есть.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    лучше купить или разработать USB транспорт на MCU. USB тупо практичнее во всех отношениях.
    Я олдскульник. ПК не использую совсем.
    Offтопик:
    Для желающих добавляю болгарский ОЕМ-модуль на XMOS-е. Сам не пользуюсь.


    ---------- Сообщение добавлено 17:09 ---------- Предыдущее сообщение было 16:56 ----------

    А у меня часом не та же версия стоит?
    Может зря качаю?

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

Название:	quartus.png 
Просмотров:	64 
Размер:	51.7 Кб 
ID:	408954

  20. #99
    Завсегдатай Аватар для maxssau
    Регистрация
    15.08.2015
    Адрес
    Самара
    Возраст
    39
    Сообщений
    2,608

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Я вообще не в курсе как работает ASRC
    есть библиотека от XMOS (для их же процессоров), но разобраться в исходниках не просто.

    https://www.xmos.ai/download/lib_src...(1.0.0rc2).pdf
    https://github.com/xmos/lib_src

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

    https://sourceforge.net/p/soxr/wiki/Home/
    _________________
    Евгений

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

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

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    А у меня часом не та же версия стоит?
    Может зря качаю?
    Да, похоже что она. Должно быть все доступно. Надо разбираться с настройками проекта.
    В меню Timing Analysis Setting галка должна стоять на Use Classic Timing Analyser ...

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Из давнишнего разговора с sia_2 у меня сложилось иное мнение. Но возможно, я неправильно интерпретировал сказанное им.
    Не спорю, по идее должно быть что-то простое, т.к. тот же AD1896 достаточно древний чип и имеет при этом небольшое потребление, т.е. логика там не сильно сложная. Другое дело, структуру ASRC "на пальцах" я не встречал, только абстрактные математические свертки. А так как с математикой у меня не очень, то сообразить не получается.

    maxssau, Евгений, спасибо за ссылки. Некоторые доки уже видел. Как-нить покопаюсь в них еще.
    Последний раз редактировалось dortonyan; 12.11.2021 в 19:07.

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

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

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

Ваши права

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