По умолчанию кодер получает коэффициенты фильтра из объекта фильтра и твердых кодов их в сгенерированный код. Реализация фильтра HDL, сгенерированная таким образом, не может использоваться с различным набором коэффициентов.
Для прямых КИХ-фильтров формы кодер предоставляет возможности пользовательского интерфейса и соответствующие свойства командной строки, которые позволяют вам:
Сгенерируйте интерфейс для загрузки коэффициентов из памяти. Коэффициенты, сохраненные в памяти, называются programmable coefficients.
Протестируйте интерфейс.
Программируемые коэффициенты фильтра поддерживаются для следующих прямых КИХ-типов фильтра формы:
Прямая форма
Прямая симметричная форма
Прямая антисимметричная форма
Чтобы использовать программируемые коэффициенты, интерфейс порта (называемый processor interface) сгенерирован для сущности фильтра или модуля. Содействующая загрузка принята, чтобы находиться под контролем микропроцессора, который является внешним к сгенерированному фильтру. Фильтр использует загруженные коэффициенты для обработки входных выборок.
Программируемые коэффициенты фильтра поддерживаются для следующей архитектуры фильтра:
Fully parallel
Fully serial
Partly serial
Cascade serial
Когда вы выбираете последовательную КИХ-архитектуру фильтра, можно также задать, как коэффициенты хранятся. Можно выбрать двухпортовый или однопортовый RAM или регистровый файл. Смотрите Программируемые Коэффициенты Фильтра для КИХ-Фильтров.
Можно также сгенерировать интерфейс процессора для загрузки БИХ-коэффициентов фильтра. Смотрите Программируемые Коэффициенты Фильтра для БИХ-Фильтров.
Следующие опции пользовательского интерфейса позволяют вам задать программируемые коэффициенты:
Список Coefficient source на диалоговом окне Generate HDL позволяет вам выбрать, получены ли коэффициенты из объекта фильтра и трудно закодированные (Internal
), или из памяти (Processor interface
). Значением по умолчанию является Internal
.
Соответствующим свойством командной строки является CoefficientSource
.
Опция Coefficient stimulus на панели Test Bench диалогового окна Generate HDL задает, как испытательный стенд тестирует сгенерированный интерфейс памяти.
Соответствующим свойством командной строки является TestBenchCoeffStimulus
.
В этом разделе описывается использовать свойство TestBenchCoeffStimulus
задать, как испытательный стенд управляет содействующими портами. Можно также использовать опцию Coefficient stimulus с этой целью.
Когда содействующий интерфейс памяти был сгенерирован для фильтра, содействующие порты сопоставили тестовые векторы. Свойство TestbenchCoeffStimulus
определяет, как испытательный стенд управляет содействующими портами.
Свойство TestBenchStimulus
определяет входные стимулы фильтра.
Свойство 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 позволяет вам задать альтернативное основанное на RAM устройство хранения данных для программируемых коэффициентов.
Можно установить Coefficient memory когда:
Фильтр является КИХ-фильтром.
Вы устанавливаете Coefficient source на Processor interface
.
Вы устанавливаете Architecture на Fully serial
, Partly serial
или Cascade serial
.
Фигура показывает вариант Coefficient memory для полностью последовательного КИХ-фильтра. Можно выбрать опцию с помощью выпадающего списка.
Таблица суммирует опции Coefficient memory.
Выбор Coefficient memory | Описание |
---|---|
Registers | значение по умолчанию: Сохраните программируемые коэффициенты в регистровом файле. |
Single Port RAMs |
Сохраните программируемые коэффициенты в однопортовом RAM. Кодер пишет каждый RAM и его интерфейс к отдельному файлу. Количество сгенерированных RAM зависит от разделения фильтра. |
Dual Port RAMs |
Сохраните программируемые коэффициенты в двухпортовом RAM. Кодер пишет каждый RAM и его интерфейс к отдельному файлу. Количество сгенерированных RAM зависит от разделения фильтра. |
В последовательной реализации КИХ-фильтра уровень системных часов (clk
) обычно является кратным уровню входных данных (частота дискретизации фильтра). Точное отношение между тактовой частотой и скоростью передачи данных зависит от вашего выбора последовательной архитектуры и опций разделения.
Программируемые коэффициенты загружают в порт coeffs_in
или на уровне системных часов (быстрее) или на входных данных (более медленный) уровень. Если ваш проект требует загрузки коэффициентов на более быстром уровне, наблюдайте следующие моменты:
Когда write_enable
утверждает, содействующая загрузка из порта coeffs_in
в содействующую память в адресе, заданном write_address
.
write_done
может утверждать для anynumber тактов. Если 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
является deasserted, и 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
deasserts слишком поздно для коэффициентов, которые будут применены к прибывающему значению данных 278E
. Они применяются вместо этого к следующей выборке, 7FFF
.