Курсовая Цифровой фильтр высокой частоты
Работа добавлена на сайт bukvasha.net: 2015-10-25Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Цифровой фильтр высокой частоты
Курсовая работа по дисциплине: Основы проектирования цифровых устройств на ПЛИС
Студент Горюнов Д.Ю.
Рязанский государственный радиотехнический университет
Рязань
Введение
В данном курсовой работе я(?!) буду разрабатывать и моделировать цифровой фильтр высокой частоты (БИХ). Характеристики этого фильтра указаны в выданном преподавателем задании.
Фильтр будет выполнен на основе программируемой логической интегральной схемы EPF10K20RC240-4 из семейства FLEX10K фирмы Altera с помощью специальных программ MAX+plus II 10.2 BASELINE и MATLAB 6.5.
ПЛИС семейств FLEX10K - самая популярная элементная база для реализации алгоритмов ЦОС. Их часто используют так, как они имеют большую логическую емкость, удобную архитектуру с встроенными блоками памяти(EAB, Embedded Array Block), высокую надежность и приемлемую цену, относительно других ПЛИС. Этого достаточно для решения проблем, возникающих у разработчиков.
Анализ, формализация и декомпозиция задачи
В данной работе я(?!) буду проектировать цифрой фильтр с бесконечной импульсной характеристикой третьего порядка.
Запишем линейное разностное уравнение для БИХ-фильтра:
Преобразуем данное уравнение и получаем три формы реализации БИХ-фильтра:
1)Прямая форма 1
2)Прямая форма 2
3)Транспонированная прямая форма 2
Для фильтра порядка М=3 получим:
Проанализировав формы реализаций фильтров, прихожу к выводу, что нужно использовать транспонированную прямую форму 2,так как имеет встроенный конвейер и наименьшее количество сумматоров(?!). Данную форму можно представить в виде трех блоков, которые мы в последствии и будем использовать при программировании:
Рис.4 Блок Mult_a
Рис.5 Блок Mult_b Рис.6 Блок Mult_c
Программировать будем ПЛИС фирмы Altera FLEX10K20RC240-4.Укажем характеристики этой схемы:
Логическая емкость | 20000 |
Число логических элементов | 1152 |
Число логических блоков | 144 |
Память (бит) | 12288 |
Используемые выводы | 189 |
Число строк | 6 |
Каналов в строке | 144 |
Число столбцов | 24 |
Каналов в столбце | 24 |
Таблица 1
В задании были получены коэффициенты фильтра. Но они дробные и поэтому MAX+plus с ними работать не может. Необходимо их перевести в целые числа. Это производится с помощью масштабирования. Масштабирование коэффициентов производится путем умножения заданных коэффициентов ai на 2m и bi на 2n. Выбираем n и m так, чтобы выполнялись условия технического задания(отклонение АЧХ в полосе пропускания и затухание АЧХ в полосе непропускания). С учетом этого выберем m=n=6.
Используем MATLAB и получаем характеристики фильтра при различных округлениях:
-без округления
-с отбрасыванием дробной части (fix);
-с округлением до ближайшего целого (round);
-с округлением до ближайшего меньшего целого (floor);
-с округлением до ближайшего большего целого (ceil);
Выбираем округление до ближайшего целого, так как это единственное округление, которое удовлетворяет техническому заданию. Оно соответствует красному графику.
(Отклонение АЧХ в полосе пропускания: не более ± 0,6 дБ
Затухание АЧХ в полосе непропускания: не менее 29 дБ)
(Определите реальные величины отклонений!!)
Рис.10 Импульсная характеристика фильтра
Рис.11 Переходная характеристика фильтра
Рис.12 ФЧХ фильтра
Рис.13 Карта нулей и полюсов фильтра
Данный фильтр является устойчивый, так как все полюса находятся внутри единичной окружности.
Выпишем округленные и отмасштабированные коэффициенты:
№ | Заданные коэффициенты (DEC) | Округлённые коэффициенты (DEC) | Округлённые коэффициенты в дополнительном коде (BIN) |
b1 | 0.126464868216455 | 8 | 1000 |
b2 | -0.211575649599258 | -14 | 10010 |
b3 | 0.211575649599257 | 14 | 1110 |
b4 | -0.126464868216455 | -8 | 11000 |
a1 | 1.000000000000000 | -64 | 1000000 |
a2 | 0.927241545063816 | -59 | 1000101 |
a3 | 0.888040485768699 | -57 | 1000111 |
a4 | 0.284717905073458 | -18 | 1101110 |
Таблица 2(??)
(Все коэффициенты отрицательные??)
Выпишем значения импульсной и переходной характеристик:
№ | g(t) | h(t) |
0 | 0,125 | 0.125 |
1 | -0,334 | -0,209 |
2 | 0,415 | 0,206 |
3 | -0,244 | -0,0401 |
4 | -0,0488 | -0,0882 |
5 | 0,148 | 0.0588 |
6 | -0,0236 | 0,0354 |
7 | -0,0957 | -0,0595 |
8 | 0,0678 | 0,00865 |
9 | 0,0302 | 0,0354 |
10 | -0,0607 | -0,0235 |
Таблица 3
Разработка и обоснование структурной схемы устройства
Фильтр-это основной блок для реализации технического задания.
Для работы фильтр использует дополнительный код. По техническому заданию на входе имеем 8-разрядный параллельный прямой код. Поэтому перед фильтром целесообразно поставить преобразователь прямого кода в дополнительный код.
Так как данные на вход фильтра поступают с различными задержками, для безошибочной работы требуется поставить 8-разрядный параллельный регистр. Также регистры нужны для снижения логической нагрузки на логические элементы, вследствие чего освобождаются ресурсы ПЛИС для выполнения других функций. Так как фильтр тоже задерживает сигнал, то на выходе так же поставим параллельный регистр (разрядность определяется техническим заданием, т.е выходной параллельный регистр будет 16-разрядным).
Семисегментные индикаторы(их два) позволяют контролировать работу ПЛИС. Они указывают младшие разряды выходного сигнала в удобной для пользователя форме. Антидребезговая система убирает дребезг в кнопке управления ПЛИС.
Краткое описание блоков структурной схемы :
1. btn – антидребезговая схема и преобразователь асинхронного сигнала в синхронный.
2. reg_in и reg_out –параллельные параметризированные регистры
3. preobr_cod – преобразователь кода , предназначен для преобразования входного прямого кода в дополнительный код;
4. filter_gor – основной блок преобразования
5. tffe-триггер
6. l7segment и h7segment – семисегментные индикаторы(?!), необходимы для проверки работы устройства.
Рис.14 Структурная схема устройства
Составление и описание принципиальной схемы устройства.
Разработка и отладка программы на языке AHDL
Для конфигурирования ПЛИС семейства FLEX10K существуют следующие способы:
Пассивная последовательная (последовательное ПЗУ, ByteBlaster, BiteBlaster, JTAG, микроконтроллер);
Пассивная параллельная синхронная (микроконтроллер);
Пассивная параллельная синхронная (микроконтроллер);
В проекте будет использовано JTAG конфигурирование. Для конфигурирования посредством JTAG выводы MSEL0, MSEL1 необходимо подключить к земле.
JTAG (Joint Test Action Group) - объединенная группа по вопросам тестирования – разработала спецификации для периферийного сканирования (BST – Boundary Scan Test). BST-технология позволяет выполнить эффективное тестирование компонентов на прецизионных печатных платах. BST-технология может тестировать выводы без использования щупов и пробников и выполняет сбор необходимых функциональных данных в нормальном режиме функционирования микросхемы. Для работы в JTAG-режиме используются четыре выделенных вывода: TDI, TDO, TMS, и TCK, и вспомогательный вывод TRST. Все остальные выводы во время JTAG-конфигурирования находятся в третьем состоянии. JTAG-конфигурирование нельзя начинать до завершения других режимов конфигурирования. Во время JTAG-конфигурирования конфигурационные данные загружаются в микросхему на печатной плате через разъемы кабелей MasterBlaster или ByteBlasterMV.
1)TDI – Вход тестовых данных.( Вход последовательной загрузки инструкций, программирующих и тестовых данных. Данные синхронизируются фронтом импульсов на выводе TCK.)
2)TDO – Выход тестовых данных.( Последовательный выход инструкций, программирующих и тестовых данных. Данные синхронизируются спадом импульсов на выводе TCK. Если данные из микросхемы не поступают - вывод находится в третьем состоянии)
3)TMS – Выбор режима тестирования (режим контроллера BST)( Вход управления режимом конечного автомата (контроллера) TAP. Конечный автомат синхронизируется фронтом сигнала на входе TCK. Поэтому состояние вывода TMS должно быть установлено перед фронтом сигнала TCK.)
4)TCK – Тактовый вход контроллера BST(Тактовый синхровход схемы BST. Некоторые операции синхронизируются фронтом, а некоторые спадом сигнала на TCK.)
5) TRST– Вход прекращения тестирования (дополнительный)( Вход асинхронного сброса схемы периферийного сканирования."0" на выводе – сбрасывает BST-схему периферийного сканирования. Вывод TRST является дополнительным в соответствии со стандартом IEEE STD. 1149.1.)[2]
(Какое отношение имеет выделенный материал к разделу??)
При разработке программы потребовалось написать на языке AHDL следующие модули:
1)Преобразователь кода из прямого в дополнительный(Имя?):
Если старший бит входных данных равен нулю, то код не изменяется, если равен единице,то все разряды кроме старшего инвертируются, а затем к младшему прибавляется единица.
2)Антидребезговая схема(Имя?):
На выходе триггера схемы (Где он? Привести схему! Неясно, как утраняется дребезг) по тактовому сигналу появляется единица, при появлении следующего тактового импульса на выходе сигнал устанавливается в ноль.В итоге на выходе получаем импульс длительностью в один такт, который поступает на входы СЕ блоков фильтра и который разрешает срабатывание тактового импульса. Кнопка антидребезга нужна для отладки на макете.
3) основной блок схемы-фильтр(Имя?):
Входная 8-ми разрядная последовательность умножается на заданные коэффициенты числителя и складывается с произведением коэффициентов знаменателя, взятых с противоположным знаком, и последовательности 16-ти разрядных переменных. (Как формируется 16-разрядный код?? Как разрабатывался фильтр?)
Составление фильтра состоит в соединении отдельных модулей, в данной работе используются 3 модуля. Они соединены один за другим.
4)Параллельные параметризированные регистры(Имя?) предназначенны для хранения информации в течение периода частоты дискретизации
5)Семисегментный индикатор(?!) (Имя?) отображает четырехразрядные данные.
(Содержание раздела не соответствует названию.)
Определить, каким образом (как) реализовать операции (действия, блоки, модули), представленные на структурной схеме. Это можно сделать в виде:
Алгоритмов работы и их описания . Привести описание алгоритма на языке AHDL с пояснениями;
Структурных схем и их описания. Привести описание структурной схемы на языке AHDL с пояснениями;
Фрагментов программ на языке AHDL и их описание.
При описании работы желательно привести временные диаграммы работы блока (модуля, операции, действия)
Определение быстродействия, импульсной и переходной характеристик устройства
Проанализировав быстродействие(Каким образом??), получены следующие данные:
-период тактовых импульсов-115.8 нс
-частота дискретизации-8.63 МГц
По заданию:
Частота дискретизации: 2,8 МГц
Соответственно, получаем большой запас по частоте:
8.63-2.8=5.83 МГц.
Сравним значения отсчетов импульсной и переходной характеристик,полученных с помощью MAX+PLUS II, MATLAB и отладочного модуля. Это необходимо для проверки правильности работы всего устройства.
№ | Matlab 6.5 | MAX+plus II (DEC) | MAX+plus II (HEX) | MAX+plus II (переведенные) | Отладочный модуль |
1 | 0,125 | 800 | 0320 | 0.125 | 20 |
2 | -0,334 | 63398 | F7A6 | -0.334 | A6 |
3 | 0,415 | 2658 | 0A62 | 0.4153 | 62 |
4 | -0,244 | 63964 | F9DC | -0.246 | DC |
5 | -0,0488 | 65219 | FEC3 | -0.0491 | C3 |
6 | 0,148 | 994 | 03B0 | 0.1553 | B0 |
7 | -0,0236 | 65390 | FF6E | -0.024 | 6E |
8 | -0,0957 | 64919 | FD97 | -0.0965 | 97 |
9 | 0,0678 | 433 | 01B1 | 0.0676 | B1 |
10 | 0,0302 | 191 | 00BF | 0.0298 | BF |
11 | -0,0607 | 65147 | FE7B | -0.0615 | 7B |
12 | 0,00998 | 66 | 0042 | 0.01 | 42 |
13 | 0,0362 | 231 | 00E7 | 0.0361 | E7 |
14 | -0,0242 | 65373 | FF5D | -0.0254 | 5D |
15 | -0,0108 | 65461 | FFB5 | -0.011 | B5 |
Таблица 4 Отсчеты импульсной характеристики
№ | Matlab 6.5 | MAX+plus II (DEC) | MAX+plus II (HEX) | MAX+plus II (переведенные) | Отладочный модуль |
1 | 0,125 | 800 | 0320 | 0.125 | 20 |
2 | -0,209 | 64198 | FAC6 | -0.20906 | C6 |
3 | 0,206 | 1320 | 0528 | 0.20625 | 28 |
4 | -0,0401 | 65285 | FF05 | -0.0397 | 05 |
5 | -0,0882 | 64968 | FDC8 | -00875 | C8 |
6 | 0,0588 | 375 | 0177 | 0.05859 | 77 |
7 | 0,0354 | 230 | 00E6 | 0.0359 | E6 |
8 | -0,0595 | 65149 | FE7D | -0.0592 | 7D |
9 | 0,00865 | 46 | 002E | 0.0718 | 2E |
10 | 0,0354 | 237 | 00ED | 0.037 | ED |
11 | -0,0235 | 65385 | FF69 | -0.02375 | 69 |
12 | -0,0133 | 65451 | FFAB | -0.0135 | AB |
13 | 0,0226 | 146 | 0092 | 0.0228 | 92 |
14 | -0,00278 | 65519 | FFEF | -0.00285 | EF |
15 | -0,0141 | 65445 | FFA5 | -0.01425 | A5 |
Таблица 5 Отсчеты переходной характеристики
Переведенные отсчеты получаем путем деления прямых десятичных значений(??), полученных из дополнительного кода) на 6400(так как масштабирующий коэффициент 26 =64 и амплитуда входного воздействия принята равной 100).
(Как получены отрицательные значения?)
Заключение
В данной работе был спроектирован цифровой фильтр высокой частоты, удовлетворяющий всем требованиям технического задания. Проект занял на интегральной схеме 60% ресурсов или 694 логических ячеек. Были получены навыки программирования ПЛИС. Погрешность характеристик фильтра связана с округлением его коэффициентов. (??)
(Как выполнены требования ТЗ?)
Список литературы
Угрюмов Е.П. Цифровая схемотехника: Учебное пособие. Санкт-Петербург(?Издательство?)2000 г .
Конфигурирование ПЛИС Altera со статической памятью конфигурации. Р.А. Мяльк. Санкт-Петербург (?Издательство?)2003 г .
Стешенко В.Б. Плис фирмы ALTERA: элементная база, система проектирования и языки описания аппаратуры. М., ДОДЭКА-XXI, 2007 (2002).
Антонов А.П. Язык описания цифровых устройств Altera AHDL. :Практический курс. М., Радио Софт,2001 г .
Приложение
%
Курсовая работа по дисциплине:
"Основы проектирования цифровых устройств на ПЛИС"
На тему: "Цифровой фильтр высокой частоты"
Выполнил: студент группы 5110
Горюнов Д.Ю.
Проверил: Соколов Ю.П.
%
include "filter.inc";
include "button.inc";
include "ppreg.inc";
include "pk_dk.inc";
include "7segment.inc";
constant razx = 8;--Что означают приведенные константы?
constant razy = 16;--Откуда они появились?
constant razb = 4;
constant raza = 8;
subdesign final
(
data[razx-1..0],clk,knopka : input;
reset : input = gnd;
out[razy-1..0] : output;
synhr,h : output;
la,lb,lc,ld,le,lf,lg : output;
ha,hb,hc,hd,he,hf,hg : output;
)
variable
preobr_cod : pk_dk with (width = razx);
h7seg,l7seg : 7segment;
reg_in : ppreg with (width = razx);
reg_out : ppreg with (width = razy);
btn : button with ( delay = 1, clock = 3175); --8000 25175
filtr_gor : filter with
(
wx = 8, --разрядность шины xn
wy = 16, --разрядность шины yn—Откуда появились параметры??
wc1 = 5, -- разрядность коэффициентов b
wc2 = 7, -- разрядность коэффициентов a
rs = 6, --расширение коэффициента b
ws = 23, --разрядность шины sum
wp = 23, --разрядность шины result
b1 = 8, --коэффициент b1
b2 = B"10010", --коэффициент b2
b3 = 14, --коэффициент b3
b4 = B"11000", --коэффициент b4
a2 = B"1000101", --коэффициент a2
a3 = B"1000111", --коэффициент a3
a4 = B"1101110", --коэффициент a4
wm = 6 –сдвиг—Что значит параметр?
);--Значения параметров НЕ ПРИВЕДЕНО в пояснительной записке!!
ce : node;
begin
reg_in.(clk,reset)=(clk,!reset);
reg_out.(clk,reset)=(clk,!reset);
btn.clk = clk;
filtr_gor.(clk,reset)=(clk,!reset);
preobr_cod.in[] = data[];
reg_in.data[] = preobr_cod.out[];
filtr_gor.vxod[]=reg_in.out[];
reg_out.data[]=filtr_gor.vixod[];
out[]=reg_out.out[];
l7seg.i[]=out[3..0];
h7seg.i[]=out[7..4];
(la,lb,lc,ld,le,lf,lg) = l7seg.(a,b,c,d,e,f,g);
(ha,hb,hc,hd,he,hf,hg) = h7seg.(a,b,c,d,e,f,g);
btn.btn = knopka;
ce = btn.out;
filtr_gor.ce = ce;
reg_in.ce = ce;
reg_out.ce = ce;
synhr = ce;
h = tffe(VCC,clk, , ,ce);
end;
%
Фильтр
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
include "mult_a1.inc";
include "mult_b.inc";
include "mult_c.inc";
PARAMETERS
(
wx = 8, --разрядность шины xn
wy = 16, --разрядность шины yn
wc1 = 5, -- разрядность коэффициентов b
wc2 = 7, -- разрядность коэффициентов a
rs = 6, --расширение коэффициента b
ws = 23, --разрядность шины sum
wp = 23, --разрядность шины result
b1 = 8, --коэффициент b1
b2 = B"10010", --коэффициент b2
b3 = 14, --коэффициент b3
b4 = B"11000", --коэффициент b4
a2 = B"1000101", --коэффициент a2
a3 = B"1000111", --коэффициент a3
a4 = B"1101110", --коэффициент a4
wm = 6 --сдвиг
);
subdesign filter
(
vxod[wx-1..0], clk : input;
ce : input=vcc;
reset : input=gnd;
vixod[wy-1..0] : output;
)
variable
sec_up : mult_a1 with (widthx = wx, widthc = wc1+rs, widths = ws, widthp = wp, bn= b1*(2^rs));
sec_mid1 : mult_b with (widthx = wx, widthy = wy, widthc1 = wc1+rs, widthc2=wc2, widthp = wp, an = a2, bn = b2*(2^rs));
sec_mid2 : mult_b with (widthx = wx, widthy = wy, widthc1 = wc1+rs, widthc2=wc2, widthp = wp, an = a3, bn = b3*(2^rs));
sec_down : mult_c with (widthx = wx, widthy = wy, widthc1 = wc1+rs, widthc2=wc2, widthp = wp, an = a4, bn = b4*(2^rs));
V[wy-1..0] : node;
begin
sec_mid1.(clock,clken,aclr) = (clk,ce,reset);
sec_mid2.(clock,clken,aclr) = (clk,ce,reset);
sec_down.(clock,clken,aclr) = (clk,ce,reset);
sec_up.xn[]=vxod[];
sec_mid1.xn[]=vxod[];
sec_mid2.xn[]=vxod[];
sec_down.xn[]=vxod[];
V[] = sec_up.result[wm+wy-1..wm];
sec_mid1.yn[]=V[];
sec_mid2.yn[]=V[];
sec_down.yn[]=V[];
sec_up.sum[]=sec_mid1.result[];
sec_mid1.sum[]=sec_mid2.result[];
sec_mid2.sum[]=sec_down.result[];
vixod[]=V[];
end;
%
Преобразователь кода из прямого в дополнительный
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
parameters
(
width=8
);
subdesign pk_dk
(
in[width-1..0] : input;
out[width-1..0] : output;
)
variable
sign : node;
begin
sign = in[width-1] ;
if sign then out[] = (sign,!in[width-2..0])+1;
else out[] = in[];
end if;
end;
%
Параллельный параметризированный регистр
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
PARAMETERS
(
width=8
);
SUBDESIGN ppreg
(
data[width-1..0],clk : input;
ce : input = vcc;
reset : input = gnd;
out[width-1..0] : output;
)
variable
out[width-1..0] : dffe;
begin
out[].(clk,clrn,ena)=(clk,!reset,ce);
out[] = data[];
end;
%
Антидребезг
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
PARAMETERS
(
delay = 1 --величина задежки в микросекундах
, clock = 5175 -- тактовая частота в килогерцах
);
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 button
(
btn : INPUT;
clk : INPUT;
out : OUTPUT;
)
VARIABLE
div_out : NODE;
astart : NODE;
tr[width-1..0] : dffe;
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;
%
Модуль преобразования данных для представления на семисегментном индикаторе
Взят из раздаточного материала
%
% -a- %
% f| |b %
% -g- %
% e| |c %
% -d- %
% %
% 0 1 2 3 4 5 6 7 89 A b C d E F %
% %
SUBDESIGN 7segment
(
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;
%
модуль mult_a1
Взят из раздаточного материала
%
INCLUDE "lpm_mult.inc";
PARAMETERS
( widthx = 8, --число разрядов шины xn[]
widthc = 10, --число разрядов коэффициентов
widths = 18, --число разрядов шины sum[]
widthp = 18, --число разрядов шины result[]
bn = 100 --коэффициент bn числителя
);
SUBDESIGN mult_a1
( xn[widthx-1..0] : INPUT;
sum[widths-1..0] : INPUT;
result[widthp-1..0] : OUTPUT;
)
VARIABLE
mult_x : lpm_mult WITH (
LPM_WIDTHA = widthx,
LPM_WIDTHB = widthc,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
--LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6 );
BEGIN
mult_x.dataa[] = xn[];
mult_x.datab[] = bn;
mult_x.sum[] = sum[];
result[] = mult_x.result[];
END;
%
Модуль mult_b
Взят из раздаточного материала
%
INCLUDE "lpm_mult.inc";
PARAMETERS
(
widthx = 8, --число разрядов шины xn[]
widthy = 8, --число разрядов шины yn[]
widthc1 = 10, --число разрядов коэффициентов b
widthc2 = 10, --число разрядов коэффициентов а
widthp = 18, --число разрядов шины result[]
an = 100, --коэффициент -an знаменателя (отрицательный - hex)
bn = 100 --коэффициент bn числителя
);
CONSTANT widths= widthp;
SUBDESIGN mult_b
(
xn[widthx-1..0] : INPUT;
yn[widthy-1..0] : INPUT;
sum[widths-1..0] : INPUT;
clock : INPUT;
clken : INPUT = VCC;
aclr : INPUT = GND;
result[widthp-1..0] : OUTPUT;
)
VARIABLE
mult_x : lpm_mult WITH (
LPM_WIDTHA = widthx,
LPM_WIDTHB = widthc1,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
mult_y : lpm_mult WITH (
LPM_WIDTHA = widthy,
LPM_WIDTHB = widthc2,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
--LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
BEGIN
mult_x.(clock, clken, aclr) = (clock, clken, aclr);
mult_x.dataa[] = xn[];
mult_x.datab[] = bn;
mult_x.sum[] = mult_y.result[];
result[] = mult_x.result[];
mult_y.dataa[] = yn[];
mult_y.datab[] = an;
mult_y.sum[] = sum[];
END;
%
Модуль mult_c
Взят из раздаточного материала
%
INCLUDE "lpm_mult.inc";
PARAMETERS
(
widthx = 8, --число разрядов шины xn[]
widthy = 8, --число разрядов шины yn[]
widthc1 = 10, --число разрядов коэффициентов b
widthc2 = 10, --число разрядов коэффициентов a
widthp = 18, --число разрядов шины result[]
an = 100, --коэффициент an знаменателя
bn = 100 --коэффициент bn числителя
);
CONSTANT widths= widthp;
SUBDESIGN mult_c
(
xn[widthx-1..0] : INPUT;
yn[widthy-1..0] : INPUT;
--sum[widths-1..0] : INPUT;
result[widthp-1..0] : OUTPUT;
clock : INPUT;
clken : INPUT = VCC;
aclr : INPUT = GND;
)
VARIABLE
mult_x : lpm_mult WITH (
LPM_WIDTHA = widthx,
LPM_WIDTHB = widthc1,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
mult_y : lpm_mult WITH (
LPM_WIDTHA = widthy,
LPM_WIDTHB = widthc2,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
--LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
BEGIN
mult_x.(clock, clken, aclr) = (clock, clken, aclr);
mult_x.dataa[] = xn[];
mult_x.datab[] = bn;
mult_x.sum[] = mult_y.result[];
result[] = mult_x.result[];
mult_y.dataa[] = yn[];
mult_y.datab[] = an;
END;
Для подготовки данной работы были использованы материалы с сайта http://referat.ru/
В данной работе был спроектирован цифровой фильтр высокой частоты, удовлетворяющий всем требованиям технического задания. Проект занял на интегральной схеме 60% ресурсов или 694 логических ячеек. Были получены навыки программирования ПЛИС. Погрешность характеристик фильтра связана с округлением его коэффициентов. (??)
(Как выполнены требования ТЗ?)
Список литературы
Угрюмов Е.П. Цифровая схемотехника: Учебное пособие. Санкт-Петербург(?Издательство?)
Конфигурирование ПЛИС Altera со статической памятью конфигурации. Р.А. Мяльк. Санкт-Петербург (?Издательство?)
Стешенко В.Б. Плис фирмы ALTERA: элементная база, система проектирования и языки описания аппаратуры. М., ДОДЭКА-XXI, 2007 (2002).
Антонов А.П. Язык описания цифровых устройств Altera AHDL. :Практический курс. М., Радио Софт,
Приложение
%
Курсовая работа по дисциплине:
"Основы проектирования цифровых устройств на ПЛИС"
На тему: "Цифровой фильтр высокой частоты"
Выполнил: студент группы 5110
Горюнов Д.Ю.
Проверил: Соколов Ю.П.
%
include "filter.inc";
include "button.inc";
include "ppreg.inc";
include "pk_dk.inc";
include "7segment.inc";
constant razx = 8;--Что означают приведенные константы?
constant razy = 16;--Откуда они появились?
constant razb = 4;
constant raza = 8;
subdesign final
(
data[razx-1..0],clk,knopka : input;
reset : input = gnd;
out[razy-1..0] : output;
synhr,h : output;
la,lb,lc,ld,le,lf,lg : output;
ha,hb,hc,hd,he,hf,hg : output;
)
variable
preobr_cod : pk_dk with (width = razx);
h7seg,l7seg : 7segment;
reg_in : ppreg with (width = razx);
reg_out : ppreg with (width = razy);
btn : button with ( delay = 1, clock = 3175); --8000 25175
filtr_gor : filter with
(
wx = 8, --разрядность шины xn
wy = 16, --разрядность шины yn—Откуда появились параметры??
wc1 = 5, -- разрядность коэффициентов b
wc2 = 7, -- разрядность коэффициентов a
rs = 6, --расширение коэффициента b
ws = 23, --разрядность шины sum
wp = 23, --разрядность шины result
b1 = 8, --коэффициент b1
b2 = B"10010", --коэффициент b2
b3 = 14, --коэффициент b3
b4 = B"11000", --коэффициент b4
a2 = B"1000101", --коэффициент a2
a3 = B"1000111", --коэффициент a3
a4 = B"1101110", --коэффициент a4
wm = 6 –сдвиг—Что значит параметр?
);--Значения параметров НЕ ПРИВЕДЕНО в пояснительной записке!!
ce : node;
begin
reg_in.(clk,reset)=(clk,!reset);
reg_out.(clk,reset)=(clk,!reset);
btn.clk = clk;
filtr_gor.(clk,reset)=(clk,!reset);
preobr_cod.in[] = data[];
reg_in.data[] = preobr_cod.out[];
filtr_gor.vxod[]=reg_in.out[];
reg_out.data[]=filtr_gor.vixod[];
out[]=reg_out.out[];
l7seg.i[]=out[3..0];
h7seg.i[]=out[7..4];
(la,lb,lc,ld,le,lf,lg) = l7seg.(a,b,c,d,e,f,g);
(ha,hb,hc,hd,he,hf,hg) = h7seg.(a,b,c,d,e,f,g);
btn.btn = knopka;
ce = btn.out;
filtr_gor.ce = ce;
reg_in.ce = ce;
reg_out.ce = ce;
synhr = ce;
h = tffe(VCC,clk, , ,ce);
end;
%
Фильтр
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
include "mult_a1.inc";
include "mult_b.inc";
include "mult_c.inc";
PARAMETERS
(
wx = 8, --разрядность шины xn
wy = 16, --разрядность шины yn
wc1 = 5, -- разрядность коэффициентов b
wc2 = 7, -- разрядность коэффициентов a
rs = 6, --расширение коэффициента b
ws = 23, --разрядность шины sum
wp = 23, --разрядность шины result
b1 = 8, --коэффициент b1
b2 = B"10010", --коэффициент b2
b3 = 14, --коэффициент b3
b4 = B"11000", --коэффициент b4
a2 = B"1000101", --коэффициент a2
a3 = B"1000111", --коэффициент a3
a4 = B"1101110", --коэффициент a4
wm = 6 --сдвиг
);
subdesign filter
(
vxod[wx-1..0], clk : input;
ce : input=vcc;
reset : input=gnd;
vixod[wy-1..0] : output;
)
variable
sec_up : mult_a1 with (widthx = wx, widthc = wc1+rs, widths = ws, widthp = wp, bn= b1*(2^rs));
sec_mid1 : mult_b with (widthx = wx, widthy = wy, widthc1 = wc1+rs, widthc2=wc2, widthp = wp, an = a2, bn = b2*(2^rs));
sec_mid2 : mult_b with (widthx = wx, widthy = wy, widthc1 = wc1+rs, widthc2=wc2, widthp = wp, an = a3, bn = b3*(2^rs));
sec_down : mult_c with (widthx = wx, widthy = wy, widthc1 = wc1+rs, widthc2=wc2, widthp = wp, an = a4, bn = b4*(2^rs));
V[wy-1..0] : node;
begin
sec_mid1.(clock,clken,aclr) = (clk,ce,reset);
sec_mid2.(clock,clken,aclr) = (clk,ce,reset);
sec_down.(clock,clken,aclr) = (clk,ce,reset);
sec_up.xn[]=vxod[];
sec_mid1.xn[]=vxod[];
sec_mid2.xn[]=vxod[];
sec_down.xn[]=vxod[];
V[] = sec_up.result[wm+wy-1..wm];
sec_mid1.yn[]=V[];
sec_mid2.yn[]=V[];
sec_down.yn[]=V[];
sec_up.sum[]=sec_mid1.result[];
sec_mid1.sum[]=sec_mid2.result[];
sec_mid2.sum[]=sec_down.result[];
vixod[]=V[];
end;
%
Преобразователь кода из прямого в дополнительный
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
parameters
(
width=8
);
subdesign pk_dk
(
in[width-1..0] : input;
out[width-1..0] : output;
)
variable
sign : node;
begin
sign = in[width-1] ;
if sign then out[] = (sign,!in[width-2..0])+1;
else out[] = in[];
end if;
end;
%
Параллельный параметризированный регистр
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
PARAMETERS
(
width=8
);
SUBDESIGN ppreg
(
data[width-1..0],clk : input;
ce : input = vcc;
reset : input = gnd;
out[width-1..0] : output;
)
variable
out[width-1..0] : dffe;
begin
out[].(clk,clrn,ena)=(clk,!reset,ce);
out[] = data[];
end;
%
Антидребезг
Выполнил ст.гр.№ 5110
Горюнов Д.Ю.
%
PARAMETERS
(
delay = 1 --величина задежки в микросекундах
, clock = 5175 -- тактовая частота в килогерцах
);
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 button
(
btn : INPUT;
clk : INPUT;
out : OUTPUT;
)
VARIABLE
div_out : NODE;
astart : NODE;
tr[width-1..0] : dffe;
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;
%
Модуль преобразования данных для представления на семисегментном индикаторе
Взят из раздаточного материала
%
% -a- %
% f| |b %
% -g- %
% e| |c %
% -d- %
% %
% 0 1 2 3 4 5 6 7 8
% %
SUBDESIGN 7segment
(
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;
%
модуль mult_a1
Взят из раздаточного материала
%
INCLUDE "lpm_mult.inc";
PARAMETERS
( widthx = 8, --число разрядов шины xn[]
widthc = 10, --число разрядов коэффициентов
widths = 18, --число разрядов шины sum[]
widthp = 18, --число разрядов шины result[]
bn = 100 --коэффициент bn числителя
);
SUBDESIGN mult_a1
( xn[widthx-1..0] : INPUT;
sum[widths-1..0] : INPUT;
result[widthp-1..0] : OUTPUT;
)
VARIABLE
mult_x : lpm_mult WITH (
LPM_WIDTHA = widthx,
LPM_WIDTHB = widthc,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
--LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6 );
BEGIN
mult_x.dataa[] = xn[];
mult_x.datab[] = bn;
mult_x.sum[] = sum[];
result[] = mult_x.result[];
END;
%
Модуль mult_b
Взят из раздаточного материала
%
INCLUDE "lpm_mult.inc";
PARAMETERS
(
widthx = 8, --число разрядов шины xn[]
widthy = 8, --число разрядов шины yn[]
widthc1 = 10, --число разрядов коэффициентов b
widthc2 = 10, --число разрядов коэффициентов а
widthp = 18, --число разрядов шины result[]
an = 100, --коэффициент -an знаменателя (отрицательный - hex)
bn = 100 --коэффициент bn числителя
);
CONSTANT widths= widthp;
SUBDESIGN mult_b
(
xn[widthx-1..0] : INPUT;
yn[widthy-1..0] : INPUT;
sum[widths-1..0] : INPUT;
clock : INPUT;
clken : INPUT = VCC;
aclr : INPUT = GND;
result[widthp-1..0] : OUTPUT;
)
VARIABLE
mult_x : lpm_mult WITH (
LPM_WIDTHA = widthx,
LPM_WIDTHB = widthc1,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
mult_y : lpm_mult WITH (
LPM_WIDTHA = widthy,
LPM_WIDTHB = widthc2,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
--LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
BEGIN
mult_x.(clock, clken, aclr) = (clock, clken, aclr);
mult_x.dataa[] = xn[];
mult_x.datab[] = bn;
mult_x.sum[] = mult_y.result[];
result[] = mult_x.result[];
mult_y.dataa[] = yn[];
mult_y.datab[] = an;
mult_y.sum[] = sum[];
END;
%
Модуль mult_c
Взят из раздаточного материала
%
INCLUDE "lpm_mult.inc";
PARAMETERS
(
widthx = 8, --число разрядов шины xn[]
widthy = 8, --число разрядов шины yn[]
widthc1 = 10, --число разрядов коэффициентов b
widthc2 = 10, --число разрядов коэффициентов a
widthp = 18, --число разрядов шины result[]
an = 100, --коэффициент an знаменателя
bn = 100 --коэффициент bn числителя
);
CONSTANT widths= widthp;
SUBDESIGN mult_c
(
xn[widthx-1..0] : INPUT;
yn[widthy-1..0] : INPUT;
--sum[widths-1..0] : INPUT;
result[widthp-1..0] : OUTPUT;
clock : INPUT;
clken : INPUT = VCC;
aclr : INPUT = GND;
)
VARIABLE
mult_x : lpm_mult WITH (
LPM_WIDTHA = widthx,
LPM_WIDTHB = widthc1,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
mult_y : lpm_mult WITH (
LPM_WIDTHA = widthy,
LPM_WIDTHB = widthc2,
LPM_WIDTHP = widthp,
LPM_WIDTHS = widths,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
--LPM_PIPELINE = 1,
MAXIMIZE_SPEED = 6
);
BEGIN
mult_x.(clock, clken, aclr) = (clock, clken, aclr);
mult_x.dataa[] = xn[];
mult_x.datab[] = bn;
mult_x.sum[] = mult_y.result[];
result[] = mult_x.result[];
mult_y.dataa[] = yn[];
mult_y.datab[] = an;
END;
Для подготовки данной работы были использованы материалы с сайта http://referat.ru/