Заключение.
Цифровой фильтр высокой частоты
В результате курсового проектирования был получен цифровой фильтр высоких частот порядка M=3 с разрядностью коэффициентов числителя и знаменателя, равной 5. Фильтр был реализован на ПЛИС семейства FLEX10K фирмы ALTERA EPF10К20RC2404. Все пункты ТЗ выполняются. Неравномерность АЧХ составила 1,4 дБ (по ТЗ не более 1,5 дБ), затухание АЧХ — 29,7 дБ (по ТЗ требуется не менее 29 дБ). Входные данные… Читать ещё >
Заключение. Цифровой фильтр высокой частоты (реферат, курсовая, диплом, контрольная)
В результате курсового проектирования был получен цифровой фильтр высоких частот порядка M=3 с разрядностью коэффициентов числителя и знаменателя, равной 5. Фильтр был реализован на ПЛИС семейства FLEX10K фирмы ALTERA EPF10К20RC2404. Все пункты ТЗ выполняются. Неравномерность АЧХ составила 1,4 дБ (по ТЗ не более 1,5 дБ), затухание АЧХ — 29,7 дБ (по ТЗ требуется не менее 29 дБ). Входные данные согласно ТЗ — 8-разрядные — подаются в дополнительном коде, а выходные — 16-разрядные — в прямом коде. По частоте дискретизации имеется большой запас 22,17 МГц (по ТЗ как минимум 4,4 МГц). При минимальных затрачиваемых ресурсах. Количество использованных логических элементов равно 479, что составляет 41% от их общего количества. В итоге, спроектированный фильтр полностью соответствует требованиям ТЗ.
Список использованных источников
- 1. Ссылка URL: http://www.altera.ru/cgi-bin/go?35#s31 June 1999, ver. 1.01, фирма Altera.
- 2. А. Антонью. Цифровые фильтры: анализ и проектирование. Москва. Издательский дом «Радио и связь» 1983 г.
- 3. В. Б. Стешенко. ПЛИС фирмы Altera: элементная база, система проектирования и языки описания аппаратуры. Москва. Издательский дом «Додэка-XXI» 2007 г.
- 4. Угрюмов Е. П. Цифровая схемотехника. — СПб.: БХВ — Санкт-Петербург, 2000. — 528
- 5. А. П. Антонов. Язык описания цифровых устройств Altera HDL. Москва 2001 г.
Приложение
Подключение модулей, использующихся для реализации фильтра.
INCLUDE «segment.inc» ;
INCLUDE «btn.inc» ;
INCLUDE «pkdk.inc» ;
INCLUDE «filtr.inc» ;
INCLUDE «reg.inc» ;
INCLUDE «dkabs.inc» ;
CONSTANT wx = 8; — Разрядность xn.
CONSTANT wy = 16; — Разрядность yn.
CONSTANT mydelay = 1;—1; — 8000.
CONSTANT myclock = 3000;—3000; —25 175.
Задание входов и выходов фильтра.
SUBDESIGN plis.
xn[wx-1.0], f_dis: INPUT;
clk: INPUT;
noreset: INPUT = VCC;
ha, hb, hc, hd, he, hf, hg, hh: OUTPUT;
la, lb, lc, ld, le, lf, lg: OUTPUT;
yn[wy-1.0]: OUTPUT;
mod_yn[wy-1.0]: OUTPUT;
sync: OUTPUT;
VARIABLE.
reset: NODE;
ce: NODE; — Одноразрядная шина для подачи сигнала разрешения тактовых импульсов.
pkdk__reg8[wx-1.0]: NODE;
reg8__filtr[wx-1.0]: NODE;
filtr__reg16[wy-1.0]: NODE;
BEGIN.
reset = !noreset;
—подключение преобразователя прямого кода.
pkdk__reg8[wx-1.0] = pkdk (xn[]) WITH (width = wx);
—подключение входного параллельного 8-разрядного регистра.
reg8__filtr[wx-1.0] = reg (pkdk__reg8[], clk, ce, reset) WITH (width = wx);
—Подключение фильтра.
filtr__reg16[wy-1.0] = filtr (reg8__filtr[], clk, ce, reset);
—Подключение выходного параллельного 16-разрядного регистра.
yn[wy-1.0] = reg (filtr__reg16[wy-1.0], clk, ce, reset) WITH (width = wy);
—Подключение преобразователей двоичного кода в семисегментный.
!(ha, hb, hc, hd, he, hf, hg) = segment (yn[7.4]);
!(la, lb, lc, ld, le, lf, lg) = segment (yn[3.0]);
—Подключение модуля.
mod_yn[wy-1.0] = dkabs (yn[]) WITH (width = wy);
—Подключение антидребезгового устройства%.
ce = btn (f_dis, clk) WITH (delay = mydelay, clock = myclock);
hh = tffe (VCC, clk, ce);
sync = dff (ce, clk,);
END;
Фильтр умножает входные восьмиразрядные и выходные шестнадцатиразрядные данные на постоянные коэффициенты фильтра с последующим суммированием. Синхронизация осуществляется управляющими сигналами тактовых импульсов clk, разрешения тактовых импульсов ce и сброса reset.
INCLUDE «lpm_mult.inc» ;
CONSTANT widthx = 8; —разрядность входных данных.
CONSTANT widthy = 16; —разрядность выходных данных.
CONSTANT ska1 = 4; —сдвиг коэффициента а1.
- —CONSTANT wka2 = 5; —разрядность коэффициента ka2
- —CONSTANT wka3 = 5; —разрядность коэффициента ka3
- —CONSTANT wka4 = 4; —разрядность коэффициента ka4
CONSTANT maxwka = 5; —максимальная разрядность коэффициентов a знаменателя.
CONSTANT skb = 5; —сдвиг коэффициентов числителя для выравнивания произведений.
CONSTANT mkb = 2^skb; —множитель коэффициентов числителя b.
- —CONSTANT wkb1 = 4 + skb; —разрядность коэффициента kb1
- —CONSTANT wkb2 = 5 + skb; —разрядность коэффициента kb2
- —CONSTANT wkb3 = 5 + skb; —разрядность коэффициента kb3
- —CONSTANT wkb4 = 4 + skb; —разрядность коэффициента kb4
CONSTANT maxwkb = 5 + skb; —максимальная разрядность коэффициентов b числителя.
—CONSTANT ka1 = 16; —ska1 = 4; ka1 = 24.
CONSTANT ka2 = 14;
CONSTANT ka3 = 14;
CONSTANT ka4 = 4;
CONSTANT kb1 = 8*mkb;
CONSTANT kb2 = 13*mkb; — отрицательно.
CONSTANT kb3 = 13*mkb;
CONSTANT kb4 = 8*mkb; — отрицательно.
CONSTANT widthp = widthy + maxwka;
CONSTANT widths = widthp;
SUBDESIGN filtr.
datax[widthx-1.0]: INPUT;
clock: INPUT;
ce: INPUT = VCC;
reset: INPUT = GND;
datay[widthy-1.0]: OUTPUT;
—m_out[widthy-1.0]: OUTPUT;
VARIABLE.
blockx1: lpm_mult WITH.
LPM_WIDTHA = widthx,.
LPM_WIDTHB = maxwkb,.
LPM_WIDTHP = widthp — ska1,.
LPM_WIDTHS = widths,.
LPM_REPRESENTATION = «SIGNED» ,.
—LATENCY,.
LPM_PIPELINE = 0,.
INPUT_A_IS_CONSTANT = «NO» ,.
INPUT_B_IS_CONSTANT = «YES» ,.
USE_EAB = «OFF» ,.
MAXIMIZE_SPEED = 6.
blockx[4.2]: lpm_mult WITH.
LPM_WIDTHA = widthx,.
LPM_WIDTHB = maxwkb,.
LPM_WIDTHP = widthp,.
LPM_WIDTHS = widths,.
LPM_REPRESENTATION = «SIGNED» ,.
—LATENCY,.
LPM_PIPELINE = 0,.
INPUT_A_IS_CONSTANT = «NO» ,.
INPUT_B_IS_CONSTANT = «YES» ,.
USE_EAB = «OFF» ,.
MAXIMIZE_SPEED = 6.
);
blocky[4.2]: lpm_mult WITH.
(.
LPM_WIDTHA = widthy,.
LPM_WIDTHB = maxwka,.
LPM_WIDTHP = widthp,.
LPM_WIDTHS = widths,.
LPM_REPRESENTATION = «SIGNED» ,.
—LATENCY,.
LPM_PIPELINE = 1,.
INPUT_A_IS_CONSTANT = «NO» ,.
INPUT_B_IS_CONSTANT = «YES» ,.
USE_EAB = «OFF» ,.
MAXIMIZE_SPEED = 6.
);
BEGIN.
blocky[4.2]. (aclr, clock, clken) = (reset, clock, ce);
—секция 1.
datay[] = blockx1. result[widthy-1.0];
blockx1.dataa[] = datax[];
blockx1.datab[] = kb1;
blockx1.sum[] = blocky2. result[];
—секция 2.
blocky2.dataa[] = datay[];
blocky2.datab[] = -ka2;
blocky2.sum[] = blockx2. result[];
blockx2.dataa[] = datax[];
blockx2.datab[] = -kb2;
blockx2.sum[] = blocky3. result[];
—секция 3.
blocky3.dataa[] = datay[];
blocky3.datab[] = -ka3;
blocky3.sum[] = blockx3. result[];
blockx3.dataa[] = datax[];
blockx3.datab[] = kb3;
blockx3.sum[] = blocky4. result[];
—секция 4.
blocky4.dataa[] = datay[];
blocky4.datab[] = -ka4;
blocky4.sum[] = blockx4. result[];
blockx4.dataa[] = datax[];
blockx4.datab[] = -kb4;
- —blockx4.sum[] = block5y. result[]; —вход sum[]не используется
- —Модуль
IF datay[widthy-1] THEN.
m_out[] = !(datay[]-1);
ELSE.
m_out[] = datay[];
END IF;%.
END;
Преобразователь двоичного кода в код семисегментного индикатора.
SUBDESIGN segment.
i[3.0]: INPUT;—Входы семисегментного индикатора.
a, b, c, d, e, f, g: OUTPUT;—Выходы семисегментного индикатора.
).
BEGIN.
TABLE—Таблица состояний семисегментного индикатора.
i[3.0]=>a, b, c, d, e, f, g;
H" 0″ =>1, 1, 1, 1, 1, 1, 0;
H" 1″ =>0, 1, 1, 0, 0, 0, 0;
H" 2″ =>1, 1, 0, 1, 1, 0, 1;
H" 3″ =>1, 1, 1, 1, 0, 0, 1;
H" 4″ =>0, 1, 1, 0, 0, 1, 1;
H" 5″ =>1, 0, 1, 1, 0, 1, 1;
H" 6″ =>1, 0, 1, 1, 1, 1, 1;
H" 7″ =>1, 1, 1, 0, 0, 0, 0;
H" 8″ =>1, 1, 1, 1, 1, 1, 1;
H" 9″ =>1, 1, 1, 1, 0, 1, 1;
H" A" =>1, 1, 1, 0, 1, 1, 1;
H" B" =>0, 0, 1, 1, 1, 1, 1;
H" C" =>1, 0, 0, 1, 1, 1, 0;
H" D" =>0, 1, 1, 1, 1, 0, 1;
H" E" =>1, 0, 0, 1, 1, 1, 1;
H" F" =>1, 0, 0, 0, 1, 1, 1;
END TABLE;
END;
Антидребезговое устройство.
CONSTANT modul = (delay*clock) DIV 1000;
- —ASSERT (modul>2)
- — REPORT «произведение delay*clock должно быть
- — больше 2000»
- — SEVERITY ERROR;
CONSTANT width = LOG2(modul);
CONSTANT end_state = modul-1;
SUBDESIGN btn.
(btn: INPUT;
clk: INPUT;
out: OUTPUT;
).
VARIABLE.
tr[width-1.0]: dffe;
div_out: NODE;
astart: NODE;
BEGIN.
tr[]. (clk, ena) = (clk, astart);
astart = dff (VCC, !btn, div_out,);
IF tr[ ]. q < end_state THEN.
tr[ ]. d = tr[ ]. q + 1;
ELSE.
tr[]. d = 0;
END IF;
div_out = !dff ((tr[ ]. q == end_state), clk,); —Формирование импульса сброса.
out = dff (dff (VCC, astart, !out,), clk,); —Формирование выходного импульса.
END;
Параметризированный модуль дополнительного кода.
PARAMETERS.
(.
width = 8.
);
SUBDESIGN dkabs.
(.
data[width-1.0]: INPUT;—данные в дополнительном коде.
out[width-1.0]: OUTPUT;—данные в прямом коде.
).
begin.
if data[width-1] then out[] = (!data[width-1.0])+1;
else out[] = data[];
end if;
end;
Преобразователь прямого кода в дополнительный.
PARAMETERS.
(.
width = 8.
);
—CONSTANT width = 8;
SUBDESIGN pkdk.
(.
in[width-1.0]: INPUT;
out[width-1.0]: OUTPUT;
).
BEGIN.
IF in[width -1] THEN.
out[] = (in[width-1], !in[width -2.0])+1;
ELSE.
out[] = in[];
END IF;
END;
Параллельный регистр
data — входные данные с разрядностью width.
out — выходные данные с разрядностью width.
ce — вход разрешения работы.
reset — вход сброса Выполнил студент группы 9110.
Городничев А. В.
PARAMETERS.
(.
width= 8—Разрядность регистра (число триггеров в его составе).
);
SUBDESIGN reg.
(.
data[width-1.0], clk: INPUT;
ce: INPUT = VCC;
reset: INPUT = GND;
out[width-1.0]: OUTPUT;
).
VARIABLE.
tr[width-1.0]: dffe;—Регистр создаем на D-триггерах.
BEGIN.
tr[]. (clk, clrn, ena) = (clk, !reset, ce);—Присоединяем сигналы управления.
tr[]. d = data[];
out[] = tr[]. q;
END;