По умолчанию кодер получает коэффициенты фильтра от объекта фильтра и жестко кодирует их в сгенерированный код. Реализация HDL-фильтра, сгенерированная таким образом, не может использоваться с другим набором коэффициентов.
Для прямых фильтров конечной импульсной характеристики формы кодер предоставляет опции UI и соответствующие свойства командной строки, которые позволяют вам:
Сгенерируйте интерфейс для загрузки коэффициентов из памяти. Коэффициенты, хранящиеся в памяти, называются programmable coefficients.
Протестируйте интерфейс.
Программируемые коэффициенты фильтра поддерживаются для следующих типов конечных импульсных характеристик прямой формы:
Прямая форма
Прямая форма симметричная
Прямая антисимметричная форма
Чтобы использовать программируемые коэффициенты, для сущности или модуля фильтра генерируется интерфейс порта (называемый processor interface). Загрузка коэффициентов принята под управлением микропроцессора, который является внешним по отношению к сгенерированному фильтру. Фильтр использует загруженные коэффициенты для обработки входных выборок.
Программируемые коэффициенты фильтра поддерживаются для следующих архитектур фильтра:
Fully parallel
Fully serial
Partly serial
Cascade serial
При выборе архитектуры последовательной конечной импульсной характеристики фильтра можно также указать, как хранятся коэффициенты. Можно выбрать двухпортовую или однопортовую ОЗУ или файл регистра. Смотрите программируемые коэффициенты фильтра для конечная импульсная характеристика.
Можно также сгенерировать интерфейс процессора для загрузки коэффициентов БИХ. Смотрите программируемые коэффициенты фильтра для БИХ.
Следующие опции пользовательского интерфейса позволяют вам задать программируемые коэффициенты:
Список Coefficient source в диалоговом окне Generate HDL позволяет вам выбрать, получены ли коэффициенты от объекта фильтра и жестко закодированы (Internal
), или из памяти (Processor interface
). Значение по умолчанию является Internal
.
Соответствующее свойство командной строки CoefficientSource
.
Опция Coefficient stimulus на панели Test Bench диалогового окна Генерация HDL определяет, как испытательный стенд тестирует сгенерированный интерфейс памяти.
Соответствующее свойство командной строки TestBenchCoeffStimulus
.
В этом разделе описывается, как использовать TestBenchCoeffStimulus
свойство, чтобы указать, как испытательный стенд управляет портами коэффициентов. Для этой цели можно также использовать опцию Coefficient stimulus.
Когда для фильтра был сгенерирован интерфейс памяти коэффициентов, порты коэффициентов имеют сопоставленные тестовые векторы. The TestbenchCoeffStimulus
свойство определяет, как испытательный стенд управляет портами коэффициентов.
The TestBenchStimulus
свойство определяет входные стимулы фильтра.
The TestbenchCoeffStimulus
свойство выбирает из двух типов испытательных стендов. TestbenchCoeffStimulus
принимает вектор аргумент. Допустимые значения:
[]
: Пустой вектор. (по умолчанию)
Когда значение TestbenchCoeffStimulus
является пустым вектором, испытательный стенд загружает коэффициенты от объекта фильтра, а затем форсирует входные стимулы. Этот тест проверяет, что интерфейс записывает один набор коэффициентов в память, не сталкиваясь с ошибкой.
[coeff1
, coeff2
... coeffN
]: Вектор N
коэффициенты, где N
определяется следующим образом:
Для симметричных фильтров, N
должен равняться ceil(length(filterObj.Numerator)/2)
.
Для антисимметричных фильтров, N
должен равняться floor(length(filterObj.Numerator)/2)
.
Для других фильтров N
должен равняться длине объекта фильтра.
В этом случае фильтр обрабатывает входные стимулы дважды. Во-первых, испытательный стенд загружает коэффициенты от объекта фильтра и заставляет входные стимулы показывать ответ. Затем фильтр загружает набор коэффициентов, заданных в TestbenchCoeffStimulus
вектор, и показывает ответ путем обработки тех же входных стимулов во второй раз. В этом случае внутренние состояния фильтра, заданные первым запуском входного стимула, сохраняются. Испытательный стенд проверяет, что интерфейс записывает два разных набора коэффициентов в память коэффициентов. Испытательный стенд также предоставляет пример того, как интерфейс памяти может использоваться для программирования фильтра с различными наборами коэффициентов.
Примечание
Если интерфейс памяти коэффициентов не был ранее сгенерирован для фильтра, TestbenchCoeffStimulus
свойство проигнорировано.
Для получения примера смотрите Испытательный стенд для конечной импульсной характеристики фильтра с программируемыми коэффициентами.
В этом разделе рассматриваются особые факторы по использованию программируемых коэффициентов фильтра с конечная импульсная характеристика, которые имеют одну из следующих последовательных архитектур:
Fully serial
Partly serial
Cascade serial
По умолчанию интерфейс процессора для программируемых коэффициентов загружает коэффициенты из файла регистра. Раскрывающееся меню Coefficient memory позволяет вам задать альтернативное хранилище на основе оперативной памяти для программируемых коэффициентов.
Можно задать Coefficient memory, когда:
Фильтр является конечная импульсная характеристика.
Вы устанавливаете Coefficient source равной Processor interface
.
Вы устанавливаете Architecture равной Fully serial
, Partly serial
, или Cascade serial
.
Рисунок показывает опцию Coefficient memory для полностью последовательного фильтра конечной импульсной характеристики. Выбрать опцию можно с помощью раскрывающегося списка.
В таблице результирующие опции Coefficient memory.
Coefficient memory выбора | Описание |
---|---|
Registers | по умолчанию: Сохраните программируемые коэффициенты в файле регистра. |
Single Port RAMs | Сохраните программируемые коэффициенты в однопортовой ОЗУ. Кодер записывает каждую ОЗУ и свой интерфейс в отдельный файл. Количество сгенерированных ОЗУ зависит от разбиения фильтра. |
Dual Port RAMs | Сохраните программируемые коэффициенты в двухпортовой ОЗУ. Кодер записывает каждую ОЗУ и свой интерфейс в отдельный файл. Количество сгенерированных ОЗУ зависит от разбиения фильтра. |
В последовательной реализации конечной импульсной характеристики скорость системных часов (clk
) обычно является произведением скорости входных данных (частоты дискретизации фильтра). Точная связь между тактовой частотой и скоростью передачи данных зависит от вашего выбора последовательной архитектуры и опций разбиения.
Программируемые коэффициенты загружаются в coeffs_in
порт со скоростью системных часов (быстрее) или со скоростью входных данных (медленнее). Если ваш проект требует загрузки коэффициентов с более высокой скоростью, наблюдайте следующие точки:
Когда write_enable
утверждает, загружает коэффициенты из coeffs_in
порт в память коэффициентов по адресу, заданному write_address
.
write_done
может утверждать для любого числа тактов. Если write_done
утверждает по меньшей мере два clk
циклы до прихода следующего входного значения данных, новые коэффициенты будут применяться к следующей выборке данных. В противном случае для данных после следующей выборки будут применены новые коэффициенты.
Эти два примера иллюстрируют, как последовательное разбиение влияет на время загрузки коэффициента.
Создайте фильтр прямой формы с 11 коэффициентами.
rng(13893,'v5uniform'); b = rand(1,11); filt = dsp.FIRFilter('Numerator',b,'Structure','Direct form');
Сгенерируйте код VHDL для filt
, использование частично последовательной архитектуры с последовательным разделом [7 4]
. Задайте CoefficientSource
для генерации интерфейса процессора.
generatehdl(filt,'InputDataType',numerictype(1,16,15), ... 'SerialPartition',[7 4],'CoefficientSource','ProcessorInterface');
### Clock rate is 7 times the input sample rate for this architecture. ### HDL latency is 3 samples
Это разбиение результатов в тактовой частоте, которая в семь раз превышает вход частоту выборки.
Временная схема иллюстрирует скорость загрузки коэффициента относительно скорости выборок входных данных. Пока write_enable
задано, загружены 11 значений коэффициентов, через coeffs_in
, по 11 последовательным адресам памяти. На следующем clk
цикл, write_enable
отключается и write_done
устанавливается в течение одного тактового периода. Операция загрузки коэффициента завершается в течение двух циклов входа данных, позволяя 2 clk
циклы, которые проходят до прихода значения данных 07FFF
. Поэтому вновь загруженные коэффициенты применяются к этой выборке данных.
Теперь задайте последовательный раздел [6 5]
для того же фильтра. Этот раздел результатов с более медленной тактовой частотой, в шесть раз больше, чем вход скорость выборки.
generatehdl(filt,'InputDataType',numerictype(1,16,15), ... 'SerialPartition',[6 5],'CoefficientSource','ProcessorInterface');
### Clock rate is 6 times the input sample rate for this architecture. ### HDL latency is 3 samples
Временная схема иллюстрирует, что write_done
слишком поздно, чтобы коэффициенты применялись к полученному значению данных 278E
. Они применяются вместо этого к следующей выборке, 7FFF
.