Проектирование цифровых фильтров
в системе MATLAB/Simulink и САПР ПЛИС Quartus
Андрей СТРОГОНОВ, д. т. н.
Одна из распространенных операций цифровой обработки сигналов -фильтрация. Для ее реализации могут быть использованы программноаппаратные ресурсы цифровых сигнальных процессоров; ПЛИС по архитектуре FPGA; различные операционные устройства: регистры, умножители, сумматоры и соответствующее управляющее устройство. Может быть также проведена программная реализация с помощью высокоуровневых языков.
Вид импульсной характеристики цифрового фильтра определяет их деление на фильтры с конечной импульсной характеристикой (КИХ-фильтры) и фильтры с бесконечной импульсной характеристикой (БИХ-фильтры). Широкое применение цифровых КИХ-фильтров вызвано тем, что свойства их хорошо исследованы. Особенности архитектуры ПЛИС FPGA позволяют проектировать компактные и быстрые КИХ-филь-тры на основе распределенной арифметики. Использование распределенной арифметики для реализации арифметических функций обеспечивает выигрыш в объеме задействованных ресурсов ПЛИС [1, 2].
Рассмотрим особенности расчета КИХ-фильтра в системе MATLAB/Simulink (пакет Signal Processing, среда FDATool) и с помощью мегафункции Mega Core FIR Compiler САПР ПЛИС Quartus. Для расчета КИХ-филь-тра применяются следующие данные: частота взятия отчетов FS; порядок фильтра п; граница полосы пропускания f; граница полосы задерживания (подавления) f; неравномерность АЧХ в полосе пропускания 81; минимальное затухание в полосе задерживания S2. На практике, как правило, вместо S1, S2 задают логарифмические величины R,, Rs, измеряемые в децибелах:
Rp = 20lg(1+51)/(1-51), Rs = 20lg52..
Цель примера — спроектировать два одинаковых по характеристикам КИХ-фильтра в среде FDATool и на основе мегафункции Mega Core FIR Compiler. Главным достоинством среды FDATool по сравнению с другими программами расчета КИХ-фильтров является возможность генерации кода языка VHDL с помощью Simulink HDL Coder. Однако код
языка VHDL в САПР ПЛИС Quartus непосредственно использовать нельзя. Сгенерированный код языка VHDL можно применить в ModelSim (Mentor Graphics HDL simulator).
Исходные данные для расчета КИХ-филь-тра нижних частот показаны в таблице.
Таблица. Исходные данные
для расчета КИХ-фильтра нижних частот
Параметры фильтра Значение
Фильтр нижних частот Low Pass
Частота взятия отсчетов Fs, Гц 48 000
Неравномерность АЧХ в полосе пропускания Rp, дБ 1
Минимальное затухание в полосе задерживания Rs, дБ 80
Переходная полоса, Гц 2400
Частота среза, Fc, Гц 9600
Тип окна Blackman
Пример расчета КИХ-фильтра в среде FDATool показан на рис. 1. Среда FDATool представляет графический интерфейс для расчета фильтров и просмотра их характеристик. На вкладке Design Filter зададим тип синтезируемой АЧХ — фильтр нижних частот, тип фильтра — нерекурсивный (FIR), метод синтеза — метод окон (синтез с использованием весовых функций). Более подробную информацию по работе со средой FDATool можно найти в работе [3]. Среда FDATool поддерживает больше методов синтеза, чем мегафункция Mega Core FIR. Преимущество мегафункции в том, что порядок проектируемого КИХ-фильтра (число отводов) оценивается автоматически. Но синтез АЧХ осуществляется методом окон. Этот недостаток компенсируется возможностью загрузки коэффициентов проектируемого фильтра, полученных, например, с использованием среды FDATool. При проектировании КИХ-фильтра в среде FDATool применяются
следующие методы: Equiriple — синтез фильтров с равномерными пульсациями АЧХ методом Ремеза; Least-Squares — минимизация среднеквадратичного отклонения АЧХ от заданной и метод окон (Window). В разделе Filter Order зададим порядок КИХ-фильтра, и именно тот, который рекомендует выбрать мегафункция Mega Core FIR (следует обратить внимание на достаточно высокий порядок КИХ-фильтра, выявляемый с ростом отношения FS/Fc, что считается одним из недостатков его использования). Мегафункция также предлагает и метод синтеза — окно Блекмена (Blackman). Расчет фильтра осуществляется после нажатия кнопки Design Filter. На рис. 1 показана АЧХ, вычисленная с помощью формата с плавающей запятой (пунктир) и формата с фиксированной запятой (непрерывная линия).
На рис. 2 показана синтезируемая АЧХ (задается комплексный коэффициент передачи \H(f)\, определенный в диапазоне частот от нуля до FS/2). Частота среза Fcравна 9600 Гц. В мегафункции Mega Core FIR Compiler задается переходная полоса (Transition Bandwith), равная 2400 Гц, и частота среза, равная 9600 Гц (обозначается как cutoff freq (1)).
В методе окон \H(f)\ обратное преобразование Фурье этой характеристики дает бесконечную в обе стороны последовательность отсчетов импульсной характеристики. Для получения КИХ-фильтра заданного порядка эта последовательность усекается путем выбора центрального фрагмента нужной длины. Для ослабления паразитных эффектов в этом методе синтеза усеченная импульсная характеристика умножается на весовую функцию (окно), плавно спадающую к краям.
Вкладка Realize Model позволяет импортировать спроектированный КИХ-фильтр
Рис. 1. Интерфейс среды FDATool. Пример расчета АЧХ КИХ-фильтра
Рис. 2. Характеристики синтезируемой АЧХ (окно Blackman) КИХ-фильтра в среде FDATool
[ [0:2000] .’si п (2.* pi. *[0:0.001:2] .*{1 +[0:0.001:2]. *75))/']
From Workspace 1
Data Type Conversion
Filter simulink
H
xin yout
Gain
Scope
■ ■ BI 1 ■ ill! щ r«pWl| ,|ПГГН— lJ.ll.Jl.lJjl JjU.ljllJllUL*. і llll.llLbUulM
pffpnip" uqrf
Рис. 3. а) Модель КИХ-фильтра в системе MATLAB/Simulink;
б) сигнал до фильтрации КИХ-фильтром нижних частот;
в) сигнал после фильтрации КИХ-фильтром нижних частот с использованием среды FDATool;
г) с использованием мегафункции Core FIR Compiler САПР ПЛИС Quartus
(модель) в Simulink (рис. З). На рис. За показана модель КИХ-фильтра (имя модели Filter simulink), построенная как с использованием базовых элементов (задержка, сумма, коэффициент усиления) цифровых фильтров, так и с использованием S-функции (модель КИХ-фильтра, построенная с использованием мегафункции Mega Core FIR Compiler). На рис. Зб показан сигнал до фильтрации, а на рис. Зв-г — после нее. Меню Targets и опция Generate HDL позволяют сгенерировать код фильтра на языке VHDL (рис. 4). Выберем параллельную архитектуру КИХ-филь-тра, обладающую высокой производительностью.
Ц Generate МСХ. (Dvtct-Готп ГК. order 99)
T«iH tkeclorY a
A#sHeduie Т>л, parcel J
СоеПоа* ниМрМм II
midfclM» Iren J
2\ Ге**-»*»**.
J
Рис. 4. Окно Simulink HDL Coder
Рассмотрим расчет КИХ-фильтра с помощью мегафункции Mega Core FIR Compiler в САПР ПЛИС Quartus (данная мегафункция может быть также использована и в САПР Max+Plus II). Применение Mega Core FIR Compiler позволяет быстро спроектировать цифровой КИХ-фильтр исходя из заданных параметров. Быстрота и малая трудоемкость расчетов делает данное программное обеспечение незаменимым при проектировании КИХ-фильтров в базисе ПЛИС фирмы Altera.
Настроим мегафункцию так, чтобы АЧХ и импульсные характеристики совпадали с характеристиками фильтра, построенного с использованием FDATool системы MATLAB/ Simulink. При запуске мегафункции Mega Core FIR Compiler открываются диалоговые окна мастера, в котором последовательно предлагается задать имя проекта, разрядность входной шины данных КИХ-фильтра, способ представления входных данных: signed — десятичное число со знаком, unsigned — десятичное число без знака.
После нажатия клавиши «Далее» появляется окно выбора способа расчета и формата представления весовых коэффициентов КИХ-фильтра (отводов). Существует возможность чтения коэффициентов как из текстового файла (коэффициенты могут быть получены, например, с использованием системы MATLAB/Simulink), так и генерация с помо-
% CocHicwt Ge*K»*to» LLO
.. . 1
лчогейм Wr*pcMen П Facta 1 Dacanaiion [Ї Facta 1 Autanabcaly Gtnwate Fta Paiametat J l/eui Safrcte Rate |4Ю»*004 H! Fta Type 1
Recto 1 S(0C*»rvJ rg5 R ом 1 dB [ШШ л ІДО RfrOJted
[2400 Hi Bandnath ■ [LowPatt 4 0» I*D! BW [5- p—, Wndow Type | Blackman w I
10 <£ 0 -10 •20 •30 *0 ■50 €0 •70 «) 90
\
\
\ C^oltFwa Ml
Cod
Vrfuet Hi Сиы\ Fteq 12) |з.?5е*006
L QC0
040
J IHAa wm 020
V ML 000 ... _J
Гіео 0 4 8e«0QJ 30*003 1.4e«C04 1 Эе*004 2 4*404 Со* 0 8 1Б 24 3? 40 4В &Б Б4 72 80 88 9Б<8 Doctaf Ftequency пВЬе Caefaenl Value* г Rad < Back | Ной >
Рис. 5. Характеристики проектируемого КИХ-фильтра (АЧХ и импульсная характеристика)
щью встроенного модуля мегафункции Core FIR Compiler с учетом заданных параметров. Вид окна представлен на рис. 5. Мегафункция автоматически оценивает число отводов КИХ-фильтра при заданном пользователем типе окна.
Мегафункция представляет возможность проанализировать влияние преобразования из формата с плавающей запятой в формат с фиксированной запятой с заданной точностью и влияние величины масштабирования коэффициентов КИХ-фильтра на АЧХ.
Следующий шаг — графический анализ влияния ошибок квантования коэффициентов фильтра на его АЧХ. Ошибки квантования — представление коэффициентов фиксированным набором битов, например 8 бит. Операции сложения и вычитания в формате с фиксированной запятой не приводят к необходимости округления результатов — они могут лишь вызвать переполнение. В отличие от сложения умножение чисел с фиксированной запятой приводит к увеличению числа значащих цифр результата и, следовательно, к необходимости округления. Если результат умножения по модулю не превышает единицы, то применение формата с плавающей запятой даст большую точность [4]. Однако операции сложения в формате с плавающей запятой могут приводить к потере точности. В данном примере выбирается опция преобразования из формата с плавающей запятой в формат с фиксируемой запятой (закладка Floating point to fixed point conversion) c последующим масштабированием коэффициентов с точностью 8 бит. В соответствии с заданной точностью, мегафункция автоматически находит масштабный коэффициент. В нашем случае он составляет 318,8. При масштабировании фильтра все его коэффициенты делятся на 318,8 и на это же значение умножается рассчитанный выходной сигнал. Поэтому на рис. 3а сигнал с выхода КИХ-фильтра (модель под именем Altera
FIR filter) умножается на 0,0031368. Временные диаграммы на рис. 3в-г показывают, что спроектированные фильтры работают одинаково, что и требовалось в нашем примере. В качестве масштабирующего множителя можно также задать степень двойки (радиокнопка scale by a factor of) — 256. Покажем коэффициенты КИХ-фильтра в формате с плавающей и с фиксированной запятой, подвергнутые масштабированию:
Parallel FIR Filter 99 TAPS
Coefficient 0 : 8.92292e-G2G 4 bits (signed) 1 Channel Pipeline delay: 10 clock cycles scaled to 0 (0X0)
Coefficient 1 7 G -G -9.3 scaled to G (GXG)
Coefficient 18 : 1.498G1e-GG3 scaled to G (GXG)
Coefficient 19 : -2.89381e-GG4 scaled to G (GXG)
Coefficient 20 : -2.27251e-GG3 scaled to -1 (GXffffffff)
Coefficient 21 G3 -G <4 scaled to G (GXG)
Coefficient 22 : 2.14343e-GG3 scaled to 1 (GX1)
Coefficient 23 : 3.24G95e-GG3 scaled to 1 (GX1)
Coefficient 24 G4 -G 2G5 .G4 scaled to G (GXG)
Coefficient 25 2 9 e G 3 scaled to -1 (GXffffffff)
Coefficient 26 G3 -G 7e NO scaled to -1 (GXffffffff)
Coefficient 27 4.11235e-GG3 scaled to 1 (GX1)
Coefficient 28 6.3542e-GG3 scaled to 2 (GX2)
Coefficient 29 -7.71564e-GG4 scaled to G (GXG)
Coefficient 30 G3 -G NO 82 NO -8. scaled to -3 (GXfffffffd)
Coefficient 31 G3 -G NO scaled to -2 (GXfffffffe)
Coefficient 32 7.3986e-GG3 scaled to 2 (GX2)
Coefficient 33 : 1.1794e-GG2 scaled to 4 (GX4)
Coefficient 34 G3 -G 83 .G5 scaled to G (GXG)
Coefficient 35 G2 О NO 573 scaled to -5 (GXfffffffb)
Coefficient 36 G3 -G 94 9 .7 -9. scaled to -3 (GXfffffffd)
Coefficient 37 : 1.3149e-GG2 scaled to 4 (GX4)
Coefficient 38 : 2.19545e-GG2 scaled to 7 (GX7)
Coefficient 39 G3 -G 8e 9 NO scaled to G (GXG)
Coefficient 40 G2 -G NO 9 NO 2.9 scaled to -9 (GXfffffff7)
Coefficient 41 G2 -G 275 82 .9 scaled to -6 (GXfffffffa)
Coefficient 42 : 2.57444e-GG2 scaled to 8 (GX8)
Coefficient 43 4.69944e-GG2 scaled to 15 (GXf)
Coefficient 44 -1.49761e-GG3 scaled to G (GXG)
Coefficient 45 : -7.4118e-GG2 scaled to -24 (GXffffffe8)
Coefficient 46 G1 72 9e G 2 scaled to -19 (GXffffffed)
Coefficient 47 : 9.417G1e-GG2 scaled to 3G (GX1e)
Coefficient 48 : G.3G1734 scaled to 96 (GX6G)
Coefficient 49 : G.398438 scaled to 127 (GX7f)
Coefficient 50 : G.3G1734 scaled to 96 (GX6G)
Coefficient 51 : 9.417G1e-GG2 scaled to 3G (GX1e)
Coefficient 52 G1 72 9e G 2 scaled to -19 (GXffffffed)
Coefficient 53 : -7.4118e-GG2 scaled to -24 (GXffffffe8)
Coefficient 54 G3 -G NO 7 9 scaled to G (GXG)
Coefficient 55 4.69944e-GG2 scaled to 15 (GXf)
Coefficient 56 : 2.57444e-GG2 scaled to 8 (GX8)
Coefficient 57 : -1.98275e-GG2 scaled to -6 (GXfffffffa)
Coefficient 58 -2.96964e-GG2 scaled to -9 (GXfffffff7)
Coefficient 59 G3 -G 8e 9 NO scaled to G (GXG)
Coefficient 60 : 2.19545e-GG2 scaled to 7 (GX7)
Coefficient 61 : 1.3149e-GG2 scaled to 4 (GX4)
Coefficient 62 : -9.79945e-GG3 scaled to -3 (GXfffffffd)
Coefficient 63 G2 -G 364 573 scaled to -5 (GXfffffffb)
Coefficient 64 : -1.G5834e-GG3 scaled to G (GXG)
Coefficient 65 : 1.1794e-GG2 scaled to 4 (GX4)
Coefficient 66 : 7.3986e-GG3 scaled to 2 (GX2)
Coefficient 67 G3 -G 164 scaled to -2 (GXfffffffe)
Coefficient 68 G3 -G 6e 82 .6 -8. scaled to -3 (GXfffffffd)
Coefficient 69 7. 71 64 G 4 scaled to G (GXG)
Coefficient 70 : 6.3542e-GG3 scaled to 2 (GX2)
Coefficient 71 : 4.11235e-GG3 scaled to 1 (GX1)
Coefficient 72 G3 о 7e .65 scaled to -1 (GXffffffff)
Coefficient 73 G3 -G 7e 49 .62 scaled to -1 (GXffffffff)
Coefficient 74 G4 -G 2G5 .G4 scaled to G (GXG)
Coefficient 75 : 3.24G95e-GG3 scaled to 1 (GX1)
Coefficient 76 : 2.14343e-GG3 scaled to 1 (GX1)
Coefficient 77 G3 -G 265 scaled to G (GXG)
Coefficient 78 : -2.27251e-GG3 scaled to -1 (GXffffffff)
Coefficient 79 : -2.89381e-GG4 scaled to G (GXG)
Coefficient 80 : 1.498G1e-GG3 scaled to G (GXG)
Coefficient 97 7 G -G -9.3 scaled to G (GXG)
Coefficient 98 : 8.92292e-G2G scaled to G (GXG)
Видно, что коэффициенты КИХ-фильтра симметричны относительно центральной величины 127, что обеспечивает линейность фазовой характеристики фильтра.
Далее предлагается выбрать точность представления фильтром промежуточных результатов. Формат хранения этих результатов вынуждает округлять их, что приводит к появлению дополнительных погрешностей (ошибок округления). По умолчанию берется Full Precision (полная точность). На следующем этапе задается фактор интерполяции (или децимации) фильтра, если необходимо спроектировать интерполяционный или децимирующий фильтр (по умолчанию фактор задается равным 1). Следующий шаг — задание архитектуры проектируемого КИХ-фильтра (параллельная или последовательная) и конвейерных свойств фильтра: оптимизация по скорости работы (частоте) или по площади занимаемых ресурсов (число задействованных макроячеек) ПЛИС.
На рис. 6а показана тестовая схема КИХ-фильтра (параллельная архитектура), полученная с использованием мегафункции Core FIR Compiler. На вход clock подается последовательность синхроимпульсов с периодом 40 нс. Вход clken является разрешающим сигналом подачи синхроимпульса clock, поэтому на него подается постоянный сигнал логической единицы. На вход Data[3..0] подается сигнал, подлежащий фильтрации, а с выхода Data0ut[3..0] снимаем профильтрованный сигнал. Для того чтобы протестировать спроектированный КИХ-фильтр, подадим на вход Data[3..0] единичный импульс — аналог дельта-функции. В этом случае выходной сигнал Yout[13..0] является рассчитанным коэффициентом КИХ-филь-тра, который представлен в формате с фиксированной запятой и масштабирован с точностью 8 бит. Результаты моделирования (импульсная характеристика) демонстрируются на рис. 6б.
Приведем фрагмент кода языка VHDL с использованием Simulink HDL Coder, описывающего КИХ-фильтр с параллельной архитектурой:
Рис. 6. Результаты моделирования работы КИХ-фильтра нижних частот: а) тестовая схема; б) импульсная характеристика
-- Discrete-Time FIR Filter (real)
-- Filter Structure : Direct-Form FIR
-- Filter Length : 100
-- Stable : Yes
-- Linear Phase : Yes (Type 2)
-- Arithmetic : fixed
-- Numerator s16,16 -> [-5.000000e-001 5.000000e-001)
-- Input s16,15 -> [-1 1)
-- Filter Internals : Full Precision
-- Output : s33,31 -> [-2 2) (auto determined)
-- Product : s31,31 -> [-5.000000e-001 5.000000e-001) (auto
determined)
-- Accumulator : s33,31 -> [-2 2) (auto determined)
-- Round Mode : No rounding
-- Overflow Mode : No overflow
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.ALL;
ENTITY filter IS
PORT( clk : IN std_logic;
clk_enable : IN std_logic;
reset : IN std_logic;
filter_in : IN std_logic_vector(15 DOWNTO G); --
sfix16_En15
filter_out : OUT std_logic_vector(32 DOWNTO G) --
sfix33_En31);
END filter;
--Module Architecture: filter
ARCHITECTURE rtl OF filter IS
-- Local Functions
-- Type Definitions
TYPE delay_pipeline_type IS ARRAY (NATURAL range <>) OF
signed(15 DOWNTO G); -- sfix16_En15
-- Constants
CONSTANT coeff1 : signed(15 DOWNTO G) := to_signed(G, 16);
-- sfix16_En16
CONSTANT coeff2 : signed(15 DOWNTO G) := to_signed(G, 16);
-- sfix16_En16
CONSTANT coeff3 : signed(15 DOWNTO G) := to_signed(G, 16);
-- sfix16_En16
CONSTANT coeff4 : signed(15 DOWNTO G) := to_signed(1, 16);
-- sfix16_En16
CONSTANT coeff5 : signed(15 DOWNTO G) := to_signed(2, 16);
-- sfix16_En16
CONSTANT coeff6 : signed(15 DOWNTO G) := to_signed(-3, 16);
-- sfix16_En16
CONSTANT coeff7 : signed(15 DOWNTO G) := to_signed(-6, 16);
-- sfix16_En16
CONSTANT coeff8 : signed(15 DOWNTO G) := to_signed(G, 16);
-- sfix16_En16
CONSTANT coeff9 : signed(15 DOWNTO G) := to_signed(12, 16);
-- sfix16_En16
CONSTANT coeff1G : signed(15 DOWNTO G) := to_signed(1G, 16);
-- sfix16_En16
CONSTANT coeff11 : signed(15 DOWNTO G) := to_signed(-13,
16); -- sfix16_En16
CONSTANT coeff12 : signed(15 DOWNTO G) := to_signed(-26,
16); -- sfix16_En16
CONSTANT coeff13 : signed(15 DOWNTO G) := to_signed(G, 16);
-- sfix16_En16
CONSTANT coeff99 : signed(15 DOWNTO G) := to_signed(G, 16);
-- sfix16_En16
CONSTANT coeff1GG : signed(15 DOWNTO G) := to_signed(G, 16); -- sfix16_En16
-- Signals SIGNAL delay_pipeline sfix16_En15 : delay_pipeline_type(G TO 99)
SIGNAL product97 sfix31_En31 : signed(3G DOWNTO G);
SIGNAL product96 sfix31_En31 : signed(3G DOWNTO G);
SIGNAL product95 sfix31_En31 : signed(3G DOWNTO G);
SIGNAL mul_temp sfix32_En31 signed(31 DOWNTO G);
SIGNAL product94 sfix31_En31 : signed(3G DOWNTO G);
SIGNAL mul_temp_1 sfix32_En31 signed(31 DOWNTO G);
SIGNAL product92 sfix31_En31 signed(3G DOWNTO G);
SIGNAL mul_temp_2 sfix32_En31 signed(31 DOWNTO G);
SIGNAL add_temp_73 sfix34_En31 : signed(33 DOWNTO G);
SIGNAL sum75 sfix33_En31 : signed(32 DOWNTO G);
SIGNAL add_temp_74 sfix34_En31 : signed(33 DOWNTO G);
SIGNAL output_typeconvert sfix33_En31 : signed(32 DOWNTO G);
SIGNAL output_register sfix33_En31 : signed(32 DOWNTO G);
BEGIN
-- Block Statements
Delay_Pipeline_process : PROCESS (clk, reset)
BEGIN IF reset = '1' THEN
delay_pipeline(0 TO 99) <= (OTHERS => (OTHERS =>
'0'));
ELSIF clk'event AND clk = '1' THEN IF clk_enable = '1' THEN
delay_pipeline(0) <= signed(filter_in); delay_pipeline(1 TO 99) <= delay_pipeline(0 TO 98);
END IF;
END IF;
END PROCESS Delay_Pipeline_process;
product97 <= resize(delay_pipeline(96), 31);
product96 <= resize(delay_pipeline(95)(15 DOWNTO 0) & '0', 31);
mul_temp <= delay_pipeline(94) * coeff95;
product95 <= mul_temp(30 DOWNTO 0);
mul_temp_1 <= delay_pipeline(93) * coeff94;
product94 <= mul_temp_1(30 DOWNTO 0);
add_temp_74 <= resize(sum74, 34) + resize(product97, 34); sum75 <= add_temp_74(32 DOWNTO 0);
output_typeconvert <= sum75;
Output_Register_process : PROCESS (clk, reset)
BEGIN IF reset = '1' THEN
output_register <= (OTHERS => '0');
ELSIF clk'event AND clk = '1' THEN IF clk_enable = '1' THEN
output_register <= output_typeconvert;
END IF;
END IF;
END PROCESS Output_Register_process;
-- Assignment Statements
filter_out <= std_logic_vector(output_register);
END rtl;
Приведем фрагмент кода VHDL-теста КИХ-фильтра, полученный с использованием Simulink HDL Coder:
LIBRARY IEEE;
USE IEEE.std_logic_1164.alI; USE IEEE.numeric_std.ALL;
ENTITY filter_tb IS END filter_tb;
ARCHITECTURE test OF fiIter_tb IS COMPONENT filter
PORT( clk : IN
clk_enable : IN
reset : IN
filter_in : IN
sfix16_En15
filter_out : OUT std_logic_vector(32 DOWNTO G) sfix33_En31);
END COMPONENT;
std_logic;
std_logic;
std_logic;
std_logic_vector(15 DOWNTO G);
FOR ALL : filter USE ENTITY work.filter(rtl);
-- Type Definitions
TYPE filter_in_table IS ARRAY (0 TO 3771) OF std_logic_vector(15 DOWNTO 0);
TYPE filter_out_table IS ARRAY (0 TO 3771) OF std_logic_vector(32 DOWNTO 0);
-- Constants
CONSTANT filter_in_force : filter_in_table :=
(
to_stdlogicvector(bit_vector'(X»7fff»))(15 DOWNTO 0), to_stdlogicvector(bit_vector'(X»0000»))(15 DOWNTO 0), to_stdlogicvector(bit_vector'(X»0000»))(15 DOWNTO 0), to_stdlogicvector(bit_vector'(X»0000»))(15 DOWNTO 0), to_stdlogicvector(bit_vector'(X»0000»))(15 DOWNTO 0), to_stdlogicvector(bit_vector'(X»0000»))(15 DOWNTO 0),
CONSTANT filter_out_expected : filter_out_table :=
(
to_stdIogicvector(bit_vector'(X»GGGGGGGGG»))(32 DOWNTO G), to_stdIogicvector(bit_vector'(X»GGGGGGGGG»))(32 DOWNTO G), to_stdIogicvector(bit_vector'(X»GGGGGGGGG»))(32 DOWNTO G), to_stdIogicvector(bit_vector'(X»GGGGG7fff»))(32 DOWNTO G), to_stdIogicvector(bit_vector'(X»GGGGGfffe»))(32 DOWNTO G), to_stdIogicvector(bit_vector'(X»1fffe8GG3»))(32 DOWNTO G), to_stdIogicvector(bit_vector'(X»1fffdGGG6»))(32 DOWNTO G),
-- Signals
CONSTANT clk_high CONSTANT clk_low CONSTANT clk_period CONSTANT clk_hold
: time := 5 ns;
: time := 5 ns;
: time := 1G ns; : time := 2 ns;
SIGNAL clk : std_logic;
SIGNAL clk_enable : std_logic;
SIGNAL reset : std_logic;
SIGNAL filter_in : std_logic_vector(15 DOWNTO G);
SIGNAL filter_out : std_logic_vector(32 DOWNTO G);
BEGIN u_filter: filter PORT MAP (
Clk => clk,
clk_enable => clk_enable, reset => reset,
filter_in => filter_in, filter_out => filter_out);
-- Block Statements clk_enable <= '1';
clk_gen: PROCESS BEGIN clk <= '1';
WAIT FOR clk_high; clk <= '0';
WAIT FOR clk_low;
END PROCESS clk_gen;
J /l*ei_ib/c». 1
Л*и_1Ь/с*-._впаЫе /««.lb/reset ;
Q}- 0- ЛЛв«_1ЬЛ*«_ои1 7FFF я
OOOOOOOOG 1 А . . Л . OQQQQFFF.E UFFFDQQQ6
Л*в»_1Ь/и_№«/с*;_епвЫе Л*«_1Ь/и_1*егЛе*е» 1 0
Рис. 7. Моделирование работы КИХ-фильтра в ModelSim SE
reset_gen: PROCESS BEGIN reset <= '1';
WAIT FOR clk_period*2 + clk_hold; reset <= '0';
WAIT;
END PROCESS reset_gen;
filter_in_gen: PROCESS BEGIN
filter_in <= filter_in_force(0);
WAIT FOR clk_period*3 + clk_hold; filter_in <= filter_in_force(1);
WAIT FOR clk_period;
FOR n IN 0 TO 3771 LOOP ASSERT abs(signed( filter_out ) — signed( filter_out_expect-ed(n) )) <= 15
REPORT «Error in filter test: Expected «
& to_hex(filter_out_expected(n))
& « Actual «
& to_hex(filter_out)
SEVERITY ERROR;
IF n + 2 <= 3771 THEN
filter_in <= filter_in_force(n + 2);
END IF;
WAIT FOR clk_period;
END LOOP;
ASSERT FALSE REPORT «**** Test Complete. ****» SEVERITY FAILURE;
END PROCESS filter_in_gen;
END test;
В комментариях приводятся сведения по настройке арифметики проектируемого КИХ-фильтра (вкладка Set quantization parameters, FDATool). Для расчета был выбран формат с фиксированной запятой (Fixed point). Коэффициенты фильтра представляются с помощью двухэлементного вектора [16,16], что соответствует формату 1.16 (MN, где M — об-
щее число двоичных разрядов, используемое для представления чисел; N — число разрядов дробной части, Numerator), часто применяемому для представления чисел в цифровых 16-битовых сигнальных процессорах. Входной сигнал представляется с помощью вектора [16,15] или в формате 1.15. Выходной сигнал фильтра и результат суммирования произведений представляется с помощью вектора [33,31], результат умножения (свертки) — вектором [31,31], то есть с двойной длиной. Это связано с тем, что типичная конфигурация сигнального процессора содержит 32-битовый умножитель-накопитель. Так же указывается диапазон нормализации мантиссы в формате с плавающей запятой. На рис. 7 показано моделирование работы КИХ-фильтра в ModelSim SE с использованием теста. Данные настройки влияют на ошибки квантования коэффициентов и ошибки округления при квантовании арифметических операций.
Применение пакета Signal Processing (среда FDATool) системы MATLAB/Simulink совместно с ModelSim SE позволяет проводить проектирование цифровых фильтров в базисе универсальных и специализируемых процессоров цифровой обработки сигналов с использованием арифметики с фиксированной и плавающей запятой. Основными этапами проектирования является выбор спе-
цификации фильтра, расчет коэффициентов, архитектурная реализация, анализ ошибок (шум округления при квантовании результатов арифметических операций, ошибки квантования коэффициентов и влияние длины входного слова — эффекты конечной разрядности) и реализация в аппаратной и/или программной форме. Программной поддержкой служит генерация кода языка C/C++ вместе c Real-Time Workshop, а генерация кода языка VHDL и Verilog — с HDL Coder для тестирования фильтров в ModelSim SE.
Мегафункция Mega Core FIR Compiler САПР ПЛИС Quartus позволяет проектировать цифровые КИХ-фильтры в базисе ПЛИС фирмы Altera. ■
Литература
1. Мистюков В. Г., Капитанов В. Д. Реализация высокопроизводительных сверхкомпактных КИХ-фильтров на ПЛИС // Scan Engineering Telecom, 1999.
2. Стешенко В. Б. ПЛИС фирмы Altera: элементная база, система проектирования и языки описания аппаратуры. М.: Додэка-XXI, 2002.
3. Сергиенко А. Б. Цифровая обработка сигналов. СПб.: Питер, 2003.
4. Айфичер Э. С., Джервис Б. У. Цифровая обработка сигналов: практический подход, 2-е издание / Пер. с англ. М.: Вильямс, 2004.