exponenta event banner

Распределенная арифметика HDL для фильтров FIR

В этом примере показано, как генерировать код HDL для фильтра FIR нижних частот с архитектурой распределенной арифметики (DA).

Распределенная арифметика

Распределённая арифметика - популярная архитектура для реализации КИХ-фильтров без использования множителей. DA эффективно реализует сумму вычислений продуктов, необходимых для фильтров FIR, используя LUT, сдвигатели и сумматоры. Поскольку эти операции эффективно отображаются на FPGA, DA является предпочтительной архитектурой на этих устройствах.

Проектирование фильтра

Используйте частоту дискретизации 48 кГц, граничную частоту полосы пропускания 9,6 кГц и стоп-частоту 12k. Установите допустимую пульсацию полосы пропускания от пика к пику в 1 дБ, а затухание полосы останова в -90 дБ. Затем спроектируйте фильтр с помощью fdesign.lowpass и создайте фильтр объектов System как фильтр FIR прямого вида.

Fs           = 48e3;         % Sampling Frequency in Hz
Fpass        = 9.6e3;        % Passband Frequency in Hz
Fstop        = 12e3;         % Stopband Frequency in Hz
Apass        = 1;            % Passband Ripple in dB
Astop        = 90;           % Stopband Attenuation in dB

lpSpec = fdesign.lowpass( 'Fp,Fst,Ap,Ast',...
    Fpass, Fstop, Apass, Astop, Fs);

lpFilter = design(lpSpec, 'equiripple', 'filterstructure', 'dffir',...
    'SystemObject', true);

Квантование фильтра

Поскольку DA реализует фильтр FIR путем сериализации битов входных данных, он требует квантованного фильтра. Предположим, что требуется 12-битовая длина входного и выходного слова с 11 дробными битами (из-за фиксированных требований к тракту данных или ширины входного АЦП/выходного ЦАП). Примените эти параметры фиксированной точки.

inputDataType = numerictype(1,12,11);
outputDataType = inputDataType;
coeffsDataType = numerictype(1,16,16);

lpFilter.FullPrecisionOverride = false;
lpFilter.CoefficientsDataType = 'Custom';
lpFilter.CustomCoefficientsDataType = coeffsDataType;
lpFilter.OutputDataType = 'Custom';
lpFilter.CustomOutputDataType = outputDataType;

% Now check the filter response with fvtool.
fvtool(lpFilter,'Fs',Fs,'Arithmetic','fixed');

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 3 objects of type line. These objects represent Filter #1: Quantized, Filter #1: Reference.

Создание кода HDL с архитектурой DA

Чтобы создать код HDL с архитектурой DA, вызовите команду generatehdl, передав допустимое значение свойству «» DALUTPpartition «». Свойство «DALUTPpartition» предписывает генератору кода использовать архитектуру DA и делит LUT на определенное количество разделов. Свойство «» DALUTPctition «» указывает количество разделов LUT и количество отводов, связанных с каждым разделом. Для фильтра с множеством отводов лучше всего разделить отводы на несколько LUT, причем каждый LUT хранит сумму коэффициентов только для отводов, связанных с ним. Сумма выходных сигналов LUT вычисляется в древовидной структуре сумматоров.

Проверьте длину фильтра, получив число коэффициентов.

FL = length(lpFilter.Numerator);

Предположим, что имеется 8 входных LUT; вычислить значение свойства DALUTPctition таким образом, чтобы использовать как можно больше этих LUT для раздела.

dalut = [ones(1, floor(FL/8))*8, mod(FL, 8)];

Создание HDL с архитектурой DA. По умолчанию создается код VHDL. Чтобы создать код Verilog, передайте свойство TargetLanguage со значением Verilog.

workingdir = tempname;
generatehdl(lpFilter, 'DALUTPartition', dalut, ...
                'TargetDirectory', workingdir, ...
                'InputDataType', inputDataType);
Warning: Structure fir has symmetric coefficients, consider converting to structure symmetricfir for reduced area.
Warning: Structure fir has symmetric coefficients, consider converting to structure symmetricfir for reduced area.
### Starting VHDL code generation process for filter: firfilt
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp65546d1a_b9ca_474d_82e0_aeff8a74cd8d/firfilt.vhd
### Starting generation of firfilt VHDL entity
### Starting generation of firfilt VHDL architecture
### Clock rate is 12 times the input sample rate for this architecture.
### Successful completion of VHDL code generation process for filter: firfilt
### HDL latency is 3 samples

Преобразование структуры фильтра в «прямую симметричную форму» и создание HDL

Симметричная структура фильтра обеспечивает преимущества в аппаратном обеспечении, поскольку она вдвое уменьшает число коэффициентов, с которыми нужно работать. Это существенно снижает сложность аппаратных средств. Создайте новый системный объект FIR-фильтра «lpSymFilter» со структурой «Прямая симметричная форма» и теми же параметрами фиксированной точки.

lpSymFilter = design(lpSpec, 'equiripple', 'filterstructure', 'dfsymfir',...
    'SystemObject', true);

lpSymFilter.FullPrecisionOverride = false;
lpSymFilter.CoefficientsDataType = 'Custom';
lpSymFilter.CustomCoefficientsDataType = coeffsDataType;
lpSymFilter.OutputDataType = 'Custom';
lpSymFilter.CustomOutputDataType = outputDataType;

% Calculate filter length FL for lpSymFilter for the purpose of calculating 'DALUTPartition'
FL = ceil(length(lpSymFilter.Numerator)/2);

% Generate the  value for 'DALUTPartition' as done previously for lpFilter.
dalut_sym = [ones(1, floor(FL/8))*8, mod(FL, 8)];

% Generate HDL code for default radix of 2
generatehdl(lpSymFilter, 'DALUTPartition', dalut_sym, ...
                   'TargetDirectory', workingdir, ...
                   'InputDataType', inputDataType);
### Starting VHDL code generation process for filter: firfilt
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp65546d1a_b9ca_474d_82e0_aeff8a74cd8d/firfilt.vhd
### Starting generation of firfilt VHDL entity
### Starting generation of firfilt VHDL architecture
### Clock rate is 13 times the input sample rate for this architecture.
### Successful completion of VHDL code generation process for filter: firfilt
### HDL latency is 3 samples

Обратите внимание, что симметричный фильтр занимает один дополнительный тактовый цикл перед получением выходного сигнала. Это происходит из-за бита переноса, который добавляется к длине входного слова, когда входные данные из симметричных отводов суммируются вместе. Тактовая частота для «lpSymFilter» в 13 раз превышает входную частоту дискретизации, тогда как для «lpFilter» тактовая частота в 12 раз превышает входную частоту дискретизации.

DARadix

Архитектура по умолчанию представляет собой реализацию Radix 2, которая работает с одним битом входных данных в каждом такте. Количество тактовых циклов, прошедших до получения выходного сигнала, равно количеству битов во входных данных. Таким образом, DA потенциально может ограничивать пропускную способность. Для повышения пропускной способности DA можно настроить DA на параллельную обработку нескольких битов. Для этой цели предоставляется свойство «DARadix». Например, можно задать для параметра DARadix значение 2 ^ 3 для параллельной работы с битами 3. Для 12 битовой длины входного слова можно задать обработку 1, 2, 3, 4, 6 или 12 битов одновременно, указав соответствующие значения «DARadix» для 2 ^ 1, 2 ^ 2, 2 ^ 3, 2 ^ 4, 2 ^ 6 или 2 ^ 12 соответственно.

Выбирая различные значения «DARadix», вы сравниваете скорость с площадью в архитектуре DA. Число битов, работающих параллельно, определяет коэффициент, на который необходимо увеличить тактовую частоту. Это называется фактором складывания. Например, значение по умолчанию 'DARadix 2 ^ 1, подразумевающее 1 бит за раз, приводит к тактовой частоте, в 12 раз превышающей входную частоту выборки, или коэффициенту сворачивания 12. «DARadix» из 2 ^ 3 приводит к тактовой частоте, только в 4 раз превышающей входную частоту дискретизации, но требует 3 идентичных наборов LUT, по одному для каждого бита, обрабатываемого параллельно.

Информация об архитектуре DA

Как объяснялось в предыдущем разделе, архитектура DA представляет множество вариантов как с точки зрения размеров LUT, так и коэффициента складывания. Функцию hdlfilterdainfo можно использовать для получения информации о различных длинах фильтров на основе значения коэффициентов. Эта функция также отображает две другие таблицы, одна для всех возможных значений свойства DARadix с соответствующими коэффициентами сворачивания. Во второй таблице отображаются подробные данные аппаратов LUT с соответствующими значениями свойства DALUTPpartition.

hdlfilterdainfo(lpFilter, 'InputDataType', inputDataType);
   | Total Coefficients | Zeros | Effective |
   ------------------------------------------
   |         58         |   0   |     58    |

Effective filter length for SerialPartition value is 58.

  Table of 'DARadix' values with corresponding values of 
  folding factor and multiple for LUT sets for the given filter.

   | Folding Factor | LUT-Sets Multiple | DARadix |
   ------------------------------------------------
   |        1       |         12        |   2^12  |
   |        2       |         6         |   2^6   |
   |        3       |         4         |   2^4   |
   |        4       |         3         |   2^3   |
   |        6       |         2         |   2^2   |
   |       12       |         1         |   2^1   |

  Details of LUTs with corresponding 'DALUTPartition' values.

   | Max Address Width | Size(bits) |                          LUT Details                         |    DALUTPartition   |
   -----------------------------------------------------------------------------------------------------------------------
   |         12        |   259072   |1x1024x13, 1x4096x13, 1x4096x14, 1x4096x15, 1x4096x18         |[12 12 12 12 10]     |
   |         11        |   147544   |2x2048x13, 2x2048x14, 1x2048x18, 1x8x11                       |[11 11 11 11 11 3]   |
   |         10        |    78080   |3x1024x13, 1x1024x16, 1x1024x18, 1x256x13                     |[10 10 10 10 10 8]   |
   |         9         |    43712   |1x16x12, 1x512x12, 2x512x13, 1x512x14, 1x512x15, 1x512x18     |[9 9 9 9 9 9 4]      |
   |         8         |    25384   |4x256x13, 1x256x14, 1x256x15, 1x256x18, 1x4x10                |[8 8 8 8 8 8 8 2]    |
   |         7         |    14248   |2x128x12, 3x128x13, 1x128x14, 1x128x16, 1x128x18, 1x4x10      |[7 7 7 7 7 7 7 7 2]  |
   |         6         |    8000    |1x16x12, 4x64x12, 1x64x13, 2x64x14, 1x64x16, 1x64x17          |[ones(1,9)*6, 4]     |
   |         5         |    4696    |1x32x11, 4x32x12, 3x32x13, 1x32x14, 1x32x15, 1x32x17, 1x8x11  |[ones(1,11)*5, 3]    |
   |         4         |    2904    |3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10  |[ones(1,14)*4, 2]    |
   |         3         |    1926    |1x2x7, 5x8x11, 8x8x12, 1x8x13, 2x8x14, 2x8x15, 1x8x17         |[ones(1,19)*3, 1]    |
   |         2         |    1412    |2x4x10, 12x4x11, 6x4x12, 2x4x13, 4x4x14, 2x4x15, 1x4x17       |ones(1,29)*2         |

Notes:
1. LUT Details indicates number of LUTs with their sizes. e.g. 1x1024x18
   implies 1 LUT of 1024 18-bit wide locations.

Для отображения определенной информации можно использовать дополнительные свойства LUT и коэффициенты сгиба. Можно выбрать одно из двух свойств LUT, «LUTInputs» или «DALUTPstittion», чтобы отобразить все опции коэффициента складывания, доступные для определенных входов LUT.

hdlfilterdainfo(lpFilter, 'InputDataType', inputDataType, ...
                    'LUTInputs', 4);
   | Folding Factor | LUT Inputs | LUT Size |                             LUT Details                             |
   ----------------------------------------------------------------------------------------------------------------
   |        1       |      4     |   34848  |12 x (3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10)  |
   |        2       |      4     |   17424  |6 x (3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10)   |
   |        3       |      4     |   11616  |4 x (3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10)   |
   |        4       |      4     |   8712   |3 x (3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10)   |
   |        6       |      4     |   5808   |2 x (3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10)   |
   |       12       |      4     |   2904   |1 x (3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10)   |

Можно также выбрать одно из двух свойств, связанных с коэффициентом сгиба, «FoldingFactor» или «DARadix», чтобы отобразить все опции LUT для определенного коэффициента сгиба.

hdlfilterdainfo(lpFilter, 'InputDataType', inputDataType, ...
                    'Foldingfactor', 6);
   | Folding Factor | LUT Inputs | LUT Size |                             LUT Details                            |
   ---------------------------------------------------------------------------------------------------------------
   |        6       |     12     |  518144  |2 x (1x1024x13, 1x4096x13, 1x4096x14, 1x4096x15, 1x4096x18)         |
   |        6       |     11     |  295088  |2 x (2x2048x13, 2x2048x14, 1x2048x18, 1x8x11)                       |
   |        6       |     10     |  156160  |2 x (3x1024x13, 1x1024x16, 1x1024x18, 1x256x13)                     |
   |        6       |      9     |   87424  |2 x (1x16x12, 1x512x12, 2x512x13, 1x512x14, 1x512x15, 1x512x18)     |
   |        6       |      8     |   50768  |2 x (4x256x13, 1x256x14, 1x256x15, 1x256x18, 1x4x10)                |
   |        6       |      7     |   28496  |2 x (2x128x12, 3x128x13, 1x128x14, 1x128x16, 1x128x18, 1x4x10)      |
   |        6       |      6     |   16000  |2 x (1x16x12, 4x64x12, 1x64x13, 2x64x14, 1x64x16, 1x64x17)          |
   |        6       |      5     |   9392   |2 x (1x32x11, 4x32x12, 3x32x13, 1x32x14, 1x32x15, 1x32x17, 1x8x11)  |
   |        6       |      4     |   5808   |2 x (3x16x11, 5x16x12, 2x16x13, 2x16x14, 1x16x15, 1x16x17, 1x4x10)  |
   |        6       |      3     |   3852   |2 x (1x2x7, 5x8x11, 8x8x12, 1x8x13, 2x8x14, 2x8x15, 1x8x17)         |
   |        6       |      2     |   2824   |2 x (2x4x10, 12x4x11, 6x4x12, 2x4x13, 4x4x14, 2x4x15, 1x4x17)       |

Обратите внимание, что подробные данные LUT указывают на коэффициент, на который необходимо реплицировать аппараты LUT для достижения соответствующего коэффициента складывания. Также рассчитывают общий размер LUT с указанным выше коэффициентом.

Можно использовать выходные аргументы для возврата значений DALUTPctition и DARadix для определенной конфигурации и использовать их с командой generatehdl. Предположим, что можно увеличить тактовую частоту в 4 раза по сравнению с частотой дискретизации и использовать 6 входных LUT. Можно проверить, что подробные данные LUT соответствуют требованиям области.

hdlfilterdainfo(lpFilter, 'InputDataType', inputDataType, ...
                    'FoldingFactor', 4, ...
                    'LUTInputs',  6);
   | Folding Factor |     LUT Size     |                         LUT Details                        |  DALUTPartition  | DARAdix |
   -------------------------------------------------------------------------------------------------------------------------------
   |        4       | 3 x 8000 = 24000 |3 x (1x16x12, 4x64x12, 1x64x13, 2x64x14, 1x64x16, 1x64x17)  | [ones(1,9)*6, 4] |   2^3   |

Теперь создайте HDL с вышеуказанными ограничениями, сначала сохранив требуемые значения DALUTPpartition и DARadix в переменных, используя выходные аргументы для функции hdlfilterdainfo. Затем с помощью этих переменных можно вызвать команду generatehdl.

[dalut, dr] = hdlfilterdainfo(lpFilter, 'InputDataType', inputDataType, ...
                                  'FoldingFactor', 4, ...
                                  'LUTInputs', 6);

generatehdl(lpFilter, 'InputDataType', inputDataType, ...
                'DALUTPartition', dalut, ...
                'DAradix', dr, ...
                'TargetDirectory', workingdir);
Warning: Structure fir has symmetric coefficients, consider converting to structure symmetricfir for reduced area.
Warning: Structure fir has symmetric coefficients, consider converting to structure symmetricfir for reduced area.
### Starting VHDL code generation process for filter: firfilt
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp65546d1a_b9ca_474d_82e0_aeff8a74cd8d/firfilt.vhd
### Starting generation of firfilt VHDL entity
### Starting generation of firfilt VHDL architecture
### Clock rate is 4 times the input sample rate for this architecture.
### Successful completion of VHDL code generation process for filter: firfilt
### HDL latency is 3 samples

Заключение

Для соответствия данной спецификации был разработан фильтр FIR прямой формы нижних частот. Затем вы квантовали и проверяли свой дизайн. Вы создали код VHDL для DA с различными радиусами и исследовали компромиссы между скоростью и площадью в DA путем репликации LUT и параллельной работы с несколькими битами.

Можно создать тестовый стенд со стандартным стимулом и/или собственным определенным стимулом и использовать имитатор HDL для проверки сгенерированного кода HDL для архитектур DA. Для сравнения площади и скорости этих архитектур можно использовать инструмент синтеза.