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