Найти тему
IT. Как это работает?

Оконный интегратор на ПЛИС. Цикл for в Verilog

Оглавление
Источник: http://matrix.etseq.urv.es/manuals/matlab/toolbox/commblks/windowedintegrator.html
Источник: http://matrix.etseq.urv.es/manuals/matlab/toolbox/commblks/windowedintegrator.html

Не так давно мы познакомились с обыкновенным интегратором, состоящим из регистра аккумулятора и сумматора. Исследования его амплитудно-частотной характеристики показали, что интегратор является фильтром нижних частот (ФНЧ), однако его главное предназначение это накопление постоянной составляющей сигнала. Свойство накопления мы уже использовали при создании управляемого генератора синусоидальных колебаний. Движемся дальше.

Что такое оконный интегратор?

Если ранее рассмотренный интегратор суммирует между собой бесконечное число отсчетов, то

оконный интегратор занимается сложением между собой ограниченного числа подряд идущих отсчетов.

Это самое число отсчетов, попадающих в сумму называется окном интегрирования. Такой интегратор состоит из регистра сдвига, сохраняющего в себе складываемые отсчеты и сумматоров.

Устройство оконного интегратора. Длина окна 4.
Устройство оконного интегратора. Длина окна 4.

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

Реализация на ПЛИС

Рассмотренные ранее синтаксические конструкции языка Verilog позволяют без особого труда собрать в единое целое цепочку регистров для организации окна с движущимися отсчетами, да и сумматоры не вызовут затруднений. Все станет гораздо интереснее если за задачу мы возьмемся с твердым намерением создать абсолютно параметризируемый модуль. Начинаем, входы и выходы:

В данном модуле разрядность отсчетов 16 бит, длина окна интегрирования 4 . Входной отсчет x, результат на выходе y.

Для хранения сдвигающихся внутри отсчетов нам пригодятся регистры (delay), а также шины проводов (sum), которые свяжут между собой сумматоры в цепочку. Как мы понимаем, за не имением сумматора на 4 слагаемых, нам прийдется размещать обычные 2-х входовые сумматоры каскадом.

Цикл for

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

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

Как и в других языках нам пригодится переменная цикла и декларируется она ключевым словом genvar.

Количество итераций цикла задается как начальным состоянием переменой цикла (i=0), так и конечным ее значением (i<SIZE-1), а также шагом (i=i+1).

Все итерации цикла это описание абсолютно параллельных друг другу операций.

В данном случае мы описали как по переднему фронту тактового сигнала clk следующий регистр delay забирает значение из предыдущего. Тут

необходимо внимательнейшим образом проследить корректность всей конструкции, особенно в крайних состояниях при начальном и конечном состоянии переменной цикла.

Это мы описали сдвиговый регистр, но еще отсутствует та часть, где в нулевой регистр заходит отсчет со входа устройства. Дописываем:

Осталось приложить несколько сумматоров и соединить их каскадно один за другим:

Необходимо отметить, что нулевой сумматор (sum[0]) складывает содержимого нулевого и первого регистров. Далее соединения сумматоров происходят каскадно в цикле. На выход интегратора отправляется последняя сумма в каскаде (sum[SIZE-2]).

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

Что получилось?

После синтеза устройства из его описания получаем вот что:

Схема получившегося оконного интегратора с длиной окна 4
Схема получившегося оконного интегратора с длиной окна 4

Оконный интегратор образуется путем последовательного соединения регистров, в которых сдвигаются отсчеты. На выход этого интегратора отправляется сумма всех отсчетов в окне, которая вычисляется несколько каскадно соединенными сумматорами.

Характеристика фильтра

Рассмотрим амплитудно-частотную характеристику оконного интегратора (АЧХ). Длина окна 4. До проведения лабораторных экспериментов нам поможет только Google. Зависимость амплитуды выходного сигнала фильтра от частоты входного сигнала изображена на рисунке ниже.

Амплитудно частотная характеристика (АЧХ) оконного интегратора
Амплитудно частотная характеристика (АЧХ) оконного интегратора

На первый взгляд АЧХ оконного интегратора резко контрастирует с той, которую мы получили при исследовании простого интегратора. Однако, возникает вопрос - а что будет с характеристикой, если мы будем увеличивать длину окна? Чутье подсказывает, что при увеличении количества складываемых отсчетов мы должны приближаться к характеристикам простого интегратора, где число слагаемых - "бесконечность". Нужно обязательно это проверить.

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

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.

Также не обойдите вниманием канал на YouTube. Подписки и лайки будут приятным ответом от аудитории.