Страница 3 из 33 Первая 1234513 ... Последняя
Показано с 41 по 60 из 647

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

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

    По умолчанию Проектируем цифровой фильтр для ЦАП 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. #41
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,095

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

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Я хорошо запасся EPM1270, но тут они не помогут.
    Для любительских проектов циклоны можно куплять на каком-нить ибее, там пока что их навалом и недорого.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Ещё проапсемплить до 128х (256х) и разделить потом на 8 (16) потоков.
    2-го циклона (самого мелкого должно хватать). Если приделывать интерполятор к текущему проекту, то нужен еще один каскад, например half-band с 4-мя ненулевыми коэф-тами (с учетом симметрии получается всего два коэф-та). А дальнейший апсемплинг фактически вырождается в линейную интерполяцию, для которой коэф-ты уже не нужны.
    Как вариант, для утилизации EPM1270 сам ЦФ можно сделать как у меня на 2000 латтисе или первом циклоне (в 100-пиновом корпусе, чтобы использовать как есть, не разбираясь с исходниками), а дальнейший апсемплинг выполнять на max2 плисине, для этого ее ресурсов хватит.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Интересная задача. Я бы тоже хотел сделать что-то подобное, но не в 48, а в 705 например, а лучше ещё выше.
    Ну при децимации чем выше выходная ЧД - тем меньше нужно ресурсов. По вычислительным ресурсам это то же самое, что и интерполяция (даже коэф-ты те же самые), только память FIFO нужна вдвое больше (при интерполяции половина семплов нулевые, а при децимации - учитываются все семплы).
    У меня даже были шальные мысли добавить дециматор в данный проект, но в выбранные плисины он бы увы не влез (не хватает блоков памяти). Да и как-то сложно получается, наряду с несильной востребованностью DSD.

  3. #42
    Завсегдатай Аватар для sia_2
    Регистрация
    18.07.2005
    Сообщений
    4,009

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

    Цитата Сообщение от tomtit Посмотреть сообщение
    А что насчет воронежских Циклонов? Еше 10 лет назад о них слышал.

    На деле, использовать дешевые Латтисы Гавины и Ефиниксы для ответственных приложений несколько рисковано.
    Недавно закончил маленький проектик для 3-координатного позиционирования на Латтисе УП5К.
    Там в каждом канале 16bit DDS + 16bit цифровой UCD + АРУ с ОС 3-го порядка.
    Оказалось, что старенький Спартан3А раза в 2 лучше этих новых Латтисов.
    Особенно достала плохая документация, ошибки в софте и никакой вразумительной поддержки.
    Все делается методом проб и ошибок.

    Спартан3А и Спартан6 хороши, но использют старый софт, который не идет на Win10 на 100%, нужен Линух или ХP.
    На Спартан7 и выше, совсем другой язык констрейнов и более сложный процесс проектирования.
    При той же частоте Xilinx более функционален из-за более широких LUT.
    С Алтерой/Интелом не работал уже много лет. Но люди говорят, что на Х проекты делаются быстрее чем на А/И.
    Так и есть, Lattice сгнили и технически, и по поддержке, говин - тот же латтис по сути, но получше в плане поддержки, зайлинкс да альтера - по большому счету так и остаются самым годным, если неохота искать приключений. Есть еще микросеми (которые теперь микрочип), но я с ними не работал. По слухам, сами чипы нормальные, но средства разработки - дрянь (сам не пробовал, это с чужих слов!!).

  4. #43
    Старый знакомый Аватар для tomtit
    Регистрация
    23.06.2009
    Адрес
    пгт.Торонтовка
    Возраст
    65
    Сообщений
    945

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

    Цитата Сообщение от sia_2 Посмотреть сообщение
    Так и есть, Lattice сгнили и технически, и по поддержке, говин - тот же латтис по сути, но получше в плане поддержки, зайлинкс да альтера - по большому счету так и остаются самым годным, если неохота искать приключений. Есть еще микросеми (которые теперь микрочип), но я с ними не работал. По слухам, сами чипы нормальные, но средства разработки - дрянь (сам не пробовал, это с чужих слов!!).
    Xilinx даёт ограниченную лицензию на софт бесплатно и навечно, не привязанную к компу. Lattice даёт бесплатный софт на iCE+Моделсим. Этого достаточно, для весьма сложных проектов, если не пользоваться IP корами, типа USB или PCI. Микрочип это бывший Actel - один из пионеров ФПГА, тогда они
    делали радиационно стойкие для вояк. В СССР был НИОКР по их копированию.

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

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

    Попытки скомпилировать проект для Циклонов 1, 2 и 4 проходят успешно.

    Offтопик:
    Нужно приобретать платку с Циклоном 2 или 4.
    Последний раз редактировалось Turbo_man; 04.11.2021 в 16:09.

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

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

    Цитата Сообщение от sia_2 Посмотреть сообщение
    В вики и в учебниках оно часто довольно заумно описано. На самом деле существо дела простое как репа: Количество суммирований при умножении всегда можно сократить как минимум вдвое, если а) иметь удвоенный множитель и б) сумматор умеет вычитать. Поскольку сдвиг на один бит и смена знака - реализуются практически даром, особенно в асике, выигрыш очевиден. В действительности большинство комбинационных умножителей используют именно этот метод для сокращения числа промежуточных сумм. В случае построения умножителя на фиксированные коэффициенты, можно выкинуть даже логику перевода множителя в CSD форму - коэффициенты можно хранить прямо как поля микрокода - "прибавить 2x", "вычесть 2х", "прибавить 1х", "вычесть 1х" и "ничего не делать". В типичном для ПЛИС девятибитном байте памяти как раз умещаются три таких поля - соответствующие шести исходным битам. Сумматор-накопитель с тремя входами тоже хорошо укладывается на четырехвходовые LUT.
    Сергей, поясните еще.
    Вот смотрю, смотрю, и не соображу - где тут профит. Ну закодировали биты коэффициентов. На каждую пару бит получился свой код. Получается что на каждую пару бит нужен мультиплексор 5:1 (ну или может 4:1, если последнюю комбинацию игнорировать сигналом ena триггера). А для формирования +1, -1, +2, -2 значений множимого все равно нужен как минимум сумматор ( -1 это инверсия и прибавить единицу ). Т.е. получается один общий сумматор для множимого и по мультиплексору на каждую пару бит коэффициентов.
    Поправьте пожалуйста - где я ошибся.
    Иначе не понятно в чем выигрыш относительно моего варианта. Для альтеры там аналогичная схема: один общий сумматор, который формирует суммы частичных произведений: х0, х1, х2, и х3. А дальше на каждую пару бит мультиплексор 4:1. Т.е. то же самое, только без кодировки коэф-тов (для такого случая она не требуется).
    А для латтиса такая схема наоборот проигрышна. Там на одной ячейке можно сделать только 2:1 (или 3:1, точно не помню) мультиплексор. Но зато латтис на операцию A[]*b + C[]*d (где b и c - однобитные переменные) расходует одну ячейку на бит данных. В итоге по ресурсам получается примерно то же самое.

  7. #46
    Завсегдатай Аватар для sia_2
    Регистрация
    18.07.2005
    Сообщений
    4,009

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

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

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Ну при децимации чем выше выходная ЧД - тем меньше нужно ресурсов.
    Это же отлично. Может и EPM1270 сгодятся сюда, нет?
    Цитата Сообщение от dortonyan Посмотреть сообщение
    то нужен еще один каскад, например half-band с 4-мя ненулевыми коэф-тами (с учетом симметрии получается всего два коэф-та). А дальнейший апсемплинг фактически вырождается в линейную интерполяцию, для которой коэф-ты уже не нужны.
    Вот и замечательно. Есть относительно несложная задача для новичка.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Как вариант, для утилизации EPM1270 сам ЦФ можно сделать как у меня на 2000 латтисе или первом циклоне (в 100-пиновом корпусе, чтобы использовать как есть, не разбираясь с исходниками), а дальнейший апсемплинг выполнять на max2 плисине, для этого ее ресурсов хватит.
    Нет. Это перебор. 1270 использую как-то иначе.

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

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

    Цитата Сообщение от sia_2 Посмотреть сообщение
    Явный сумматор для формирования отрицательного числа не нужен, единичку делается управлением входом переноса последующих сумматоров.
    Понятно. Но даже если так, то разница всего в один сумматор, не в два раза. К тому же вариант с Бутом в одной 9-бит ячейке памяти хранит только 6 бит множителя, а у меня - все девять. И коэф-ты не надо кодировать. В общем попробовать Бута конечно можно, но сильно компактнее чем сейчас, думается, на врят ли получится.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Это же отлично. Может и EPM1270 сгодятся сюда, нет?
    Не, не на столько меньше. ) На арифметику ячеек хватит, но fifo для дециматора (даже небольшое) без блоков памяти не построить.
    Последний раз редактировалось dortonyan; 04.11.2021 в 19:42.

  10. #49
    Завсегдатай Аватар для sia_2
    Регистрация
    18.07.2005
    Сообщений
    4,009

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

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

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Не, не на столько меньше. ) На арифметику ячеек хватит, но fifo для дециматора (даже небольшое) без блоков памяти не построить.
    Не, вру. DSD - это ж однобитный поток, соот-но фифо много ячеек не сожрет. Если делать однопроходной дециматор, то в maxII должно влезть.

    Цитата Сообщение от sia_2 Посмотреть сообщение
    Разница по количеству суммирований в два раза: Не более одного суммирования на два бита множителя. Соответственно, для умножения на шесть бит за такт используется трехвходовой сумматор (четырехвходовой при последовательном накоплении).
    Так и у меня то же самое. На 8 бит - 4 суммирования. В конвейере это три 2-входовых сумматора.

  12. #51
    Старый знакомый Аватар для tomtit
    Регистрация
    23.06.2009
    Адрес
    пгт.Торонтовка
    Возраст
    65
    Сообщений
    945

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

    [QUOTE=dortonyan;.[/QUOTE]

    Дециматор на 2**N делается из двух ступеней. Первая CIC, которая делит на :2**(N-1). И потом КИХ с компенсатором завала :2. Очень экономно, гораздо проще интерполятора. Впрочем у меня и интерполятор на - 1024 сделан так же, только КИХ на х8 или х16 стоит сначала, а потом CIC на х64 или х128.
    И чего ужиматься-то, в Спартан 6SLX9 LQFP144 за 25$ входит всё, что можно пожелать для стерео DSD1024 сигма-дельта ДАК.
    Последний раз редактировалось tomtit; 04.11.2021 в 20:19.

  13. #52
    Завсегдатай Аватар для sia_2
    Регистрация
    18.07.2005
    Сообщений
    4,009

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

    Цитата Сообщение от tomtit Посмотреть сообщение
    Дециматор на 2**N делается из двух ступеней. Первая CIC, которая делит на :2**(N-1). И потом КИХ с компенсатором завала :2. Очень экономно, гораздо проще интерполятора. Впрочем у меня и интерполятор на - 1024 сделан так же, только КИХ на х8 или х16 стоит сначала, а потом CIC на х64 или х128.
    И чего ужиматься-то, в Спартан 6SLX9 LQFP144 за 25$ входит всё, что можно пожелать для стерео DSD1024 сигма-дельта ДАК.
    Структура FIR+CIC оптимальна для интерполятора, а вот для дециматора - надо смотреть. Зависит от разрядности входного потока и требований к подавлению. При однобитном потоке и высоких требованиях к фильтрации часто выгоднее набор параллельно работающих сумматоров-накопителей коэффициентов (умножение на однобитный сигнал - просто смена знака). Это в кремнии, в ПЛИС за счет встроенных умножителей баланс немного другой. CIC в качестве дециматора малоразрядных данных плох ростом разрядности и потерей подавления при отходе от нулевой частоты. Лечится комбинацией CIC со слегка отличающимися длинами для формирования нескольких нулей, но необходимая разрядность при этом бодро растет.

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Так и у меня то же самое. На 8 бит - 4 суммирования. В конвейере это три 2-входовых сумматора.
    Здесь надо смотреть на число входов системы сумматоров. В обычном умножителе оно равно числу бит множителя, а при использовании CSD представления - один вход на два бита. То есть, вдвое снижается число суммируемых чисел. Чтобы просуммировать за такт восемь чисел, нужно семь двухвходовых сумматоров: Четыре сумматора для попарных сумм, еще два - суммируют четыре их выхода, и последний - суммирует выходы этой пары. В случае CSD представления суммировать надо четыре числа, а это три двухвходовых сумматора. Теперь про затраты при формировании: Мультиплексор нужен 2->1, одиночный/удвоенный, знак меняется побитовой инверсией и добавкой Cin, блокировка - побитовое and или clke в последовательностном накопителе. Впрочем, на современных ПЛИС со встроенными DSP блоками и шести-восьмивходовыми LUT вместо четырехвходовых все это теряет смысл.
    Последний раз редактировалось sia_2; 04.11.2021 в 21:13.

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

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

    Цитата Сообщение от sia_2 Посмотреть сообщение
    Здесь надо смотреть на число входов системы сумматоров.
    Я понял, я так и смотрю. Т.е. на первом шаге суммы частичных произведений получаются не сумматорами, а мультиплексорами, которые битами множителя выбирают значение суммы частичных произведений (т.е. сумматоры заменены декодерами).

    Цитата Сообщение от sia_2 Посмотреть сообщение
    В случае CSD представления суммировать надо четыре числа, а это три двухвходовых сумматора.
    Ну у меня же то же самое. Я же в предыдущем посте так и писал.
    Всего суммируется 4 значения, которые декодируются парами бит множителя из предварительно подготовленных сумм частичных произведений. И для этой предварительной подготовки задействуется всего один сумматор на весь умножитель, разрядностью на единицу больше множимого. Ряд справа пока не рассматриваем (просто кол-во бит множителя нечетное).
    Нажмите на изображение для увеличения. 

Название:	mult_8.png 
Просмотров:	156 
Размер:	104.2 Кб 
ID:	407932
    Т.е. от Бута отличие только в виде сумм частичных произведений, а по сути - тот же декодер, вид слева.
    Наверно в специализированных аппаратных схемах метод Бута и дает выигрыш, но в обычных плисинах разницы с моим декодером не видно. Ну я пока не соображу, как получить выигрыш.

    Цитата Сообщение от sia_2 Посмотреть сообщение
    знак меняется побитовой инверсией и добавкой Cin
    Cin операция халявная, это понятно. Но управляемая побитовая инверсия это же ряд xor вентилей, т.е. по ячейкам то же самое, что дополнительный сумматор у меня.

  15. #54
    Завсегдатай Аватар для sia_2
    Регистрация
    18.07.2005
    Сообщений
    4,009

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

    Разница в размерности мультиплексоров на входах дерева сумматоров. При "обычном" методе заготовки частичных произведений, без смены знаков, число входов (и трасс данных) вдвое больше. В случае CSD роль одной из адресных линий мультиплексирования выполняет сигнал смены знака. А дальше все зависит от затрат на реализацию того или иного. На ПЛИС эти пропорции зависят от размера LUT и числа трасс (шины в ПЛИС жрут трассировочный ресурс). Кроме того, в ПЛИС с маленькими LUT реализация сумматоров часто намного более эффективна, чем мультиплексоров, и наиболее компактным иногда оказывается вообще "побитный" подход. Что интересно, при реализации в кремнии CSD дает выигрыш по потреблению примерно в 40% по сравнению с лобовой заготовкой частичных произведений именно за счет сокращения числа переключаемых линий.
    Ну а в мало-мальски продвинутых ПЛИС умножители уже готовые, все, что нужно - написать строчку на верилоге типа assign a = b * c; Это уже второй циклон умел
    Последний раз редактировалось sia_2; 05.11.2021 в 15:13.

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

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

    Все, я понял. Мы просто говорим о разных вещах (каждый о своем ). Вы - про оптимизацию цифровой логики как таковую, а я - про оптимизацию на конкретных плисинах. Потому что во втором случае уменьшение кол-ва сумматоров не есть самоцель, главное обойтись минимальным кол-вом LUT ячеек, а что они при этом делают (суммируют или мультиплексируют) - вопрос десятый.
    У латтиса LUT позволяет писать классический сумматор a[]*b + c[]*d, затрачивая один LUT на бит, поэтому там выгоднее первую ступень строить на сумматорах. А циклон затрачивает один лут на 4:1 мультиплексор, поэтому для него выгоднее строить первый каскад на нем.
    Просто когда вы писали про решение "в лоб", я решил, что это касается конкретно моей реализации, а не схемотехники, как таковой.

  17. #56
    Частый гость Аватар для abyrvalg
    Регистрация
    13.04.2016
    Сообщений
    145

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

    Поздравляю, хорошая работа проделана!

    С уважением, Полиграф Полиграфович

  18. #57
    Завсегдатай Аватар для ditter
    Регистрация
    04.07.2004
    Адрес
    RUS
    Возраст
    50
    Сообщений
    1,067

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


    Offтопик:
    народ, а как оно со звуком в ваших этих арифметически оптимизированных фильтрах ? ведь еще 20 лет назад некоторые фирмы лепили самописные ЦФ на ДСП и выигрыша по звуку не было. все признаваемые хорошо звучащими ЦАП имели ЦФ на сами знаете кокам чипсе сделанный

  19. #58
    Старый знакомый Аватар для tomtit
    Регистрация
    23.06.2009
    Адрес
    пгт.Торонтовка
    Возраст
    65
    Сообщений
    945

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

    Цитата Сообщение от ditter Посмотреть сообщение
    Offтопик:
    народ, а как оно со звуком в ваших этих арифметически оптимизированных фильтрах ? ведь еще 20 лет назад некоторые фирмы лепили самописные ЦФ на ДСП и выигрыша по звуку не было. все признаваемые хорошо звучащими ЦАП имели ЦФ на сами знаете кокам чипсе сделанный

    Оптимизация построена на тождественных преобразованиях. Поэтому вопрос не имеет смысла. Как сделаешь, так и будет.

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

    Цитата Сообщение от sia_2 Посмотреть сообщение
    а вот для дециматора - надо смотреть.
    Ну, рассмотрим дециматор для ДСД512, нужно будет сделать CIC 5-го порядка на :256.
    Потребуются сумматоры длиной 1+8*5=41, умножений нет. Даже для Спартана3A это пустяк.
    Последний раз редактировалось tomtit; 05.11.2021 в 16:35.

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

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

    Мелочь, но всё же. Дополнение к проекту.
    Может я и не прав, но во входном потоке количество битклоков на семпл можно было и в автомате посчитать.
    Последний раз редактировалось Turbo_man; 05.11.2021 в 15:34.

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

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

    Можно, но это дополнительные ресурсы, которые для латтиса уже впритык (в циклон добавить можно без проблем, там ячеек поболее). Ничего простого для этой цели я не придумал, а городить сложный автомат - решил, что слишком жирно будет. Это такая опция, которая выбирается один раз и навсегда (под конкретный источник), лишняя логика будет только расходовать ячейки и добавит потребления.

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

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

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

Ваши права

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