- •Мова опису апаратури ahdl
- •1. Опис комбінаційних схем
- •1.1. Шифратор
- •1.2. Дешифратор
- •1.3. Мультиплексор
- •1.4. Демультиплексор
- •1.5. Перетворювач коду
- •1.6. Компаратор
- •1.7. Суматор
- •1.8. Шинні приймачі-передавачі
- •1.9. Схеми монтажного «і» і «або»
- •2.1. Регістри
- •2.1.1. Паралельний регістр
- •2.1.2. Регістр зсуву
- •2.1.3. Регістр зсуву з паралельним завантаженням даних
- •2.1.4. Універсальний регістр
- •2.1.5. Циклічний регістр зсуву
- •Часть 2. Практическое использование языка ahdl. М. 2005.- 34 с.
- •1. Опис комбінаційних схем……………………………… 3
- •1.1. Шифратор ………………………………………………………………. 3
1.6. Компаратор
Компаратор - це комбінаційний пристрій, призначений для порівняння двох чисел А і В за ознаками: дорівнює (А_Е_В), не дорівнює (А_NE_B), більше (А_М_В), менше (A_L_B), більше або дорівнює (А_МЕ_В), менше або дорівнює(А_LЕ_В).
Розглянемо параметризований опис компаратора, що забезпечує порівняння двох WIDTH-розрядних чисел за всіма можливими ознаками.
PARAMETERS (WIDTH = 7);
SUBDESIGN LPM_CP
(
A[WIDTH..0],B[WIDTH..0]:INPUT;--вхідні порівнювані коди.
A_M_B : OUTPUT; --А більше В.
A_L_B : OUTPUT; --А менше В.
A_E_B : OUTPUT; --А дорівнює В.
A_NE_B : OUTPUT; --А не дорівнює В.
A_ME_B : OUTPUT; --А більше або дорівнює В.
A_LE_B : OUTPUT; --А менше або дорівнює В.
)
BEGIN
IF USED (A_M_B) GENERATE -- Якщо використається вивід
-- А_М_B, то йому
A_M_B =(A[] > B[]); -- присвоюється значення одиниці
-- у випадку, якщо код А[]більший за код В[].
END GENERATE;
IF USED (A_L_B) GENERATE -- якщо використовується
-- вивід А_L_B, то йому
A_L_B = (A[] < B[]); -- присвоюється значення
-- одиниці у випадку
END GENERATE; -- якщо код А[]менший за код В[].
IF USED (A_NE_B) GENERATE -- Якщо використовуються
-- виводи А_NE_B і А_Е_B, то
--виводу А_NE_B присвоюється інверсне
IF USED (A_E_B) GENERATE -- значення виводу А_Е_В.
A_NE_B = !A_E_B;
ELSE GENERATE -- В протилежному випадку (тобто,
-- якщо вивід А_Е_В
A_NE_B = (A[] != B[]); -- не використовується)
-- виводу А_NE_В присвоюється значення
END GENERATE; -- одиниці, якщо коди не рівні.
END GENERATE;
IF USED (A_E_B) GENERATE -- Якщо використається вивід
-- А_E_B, то йому
A_E_B = (A[] == B[]); -- присвоюється значення
-- одиниці у випадку
END GENERATE; -- логічної рівності кодів А[] і В[].
IF USED (A_ME_B) GENERATE -- Якщо використаються
-- виводи А_ME_В, А_M_B і А_Е_B
-- то виводу А_МE_B присвоюється
IF USED (A_M_B) GENERATE -- значення одиниці
IF USED (A_E_B) GENERATE -- у випадку якщо одиниця
-- присутня або на виводі А_Е_В
A_ME_B = A_E_B # A_M_B; -- або на виводі А_M_В.
ELSE GENERATE -- В протилежному випадку
--(використовується А_М_B і не
-- використовується А_Е_В)
A_ME_B = (A[] == B[]) OR A_M_B; виводу А_ME_В
END GENERATE; -- присвоюється значення
-- одиниці або у випадку логічної рівності -- кодів А[] і В[], або значення виводу A_M_B.
ELSE GENERATE -- Якщо використовуються виводи і A_E_B
IF USED (A_E_B) GENERATE -- але не використовується -- вивід А_M_В, то виводу А_ME_В
A_ME_B = A_E_B OR(A[] > B[]); -- присвоюється
-- значення одиниці або у випадку,
-- якщо A[] > B[]або значення А_E_В.
ELSE GENERATE -- Якщо виводи A_M_B і А_Е_B не
-- використовуються, то виводу
A_ME_B = (A[] >= B[]); -- А_ME_B присвоюється одиниця,
-- якщо код А[] більший
END GENERATE; -- або дорівнює коду В[].
END GENERATE;
END GENERATE;
IF USED (A_LE_B) GENERATE -- якщо використовуються
-- виводи А_LE_В, А_L_B і А_Е_В
IF USED (A_L_B) GENERATE -- то виводу А_LE_В
-- присвоюється значення одиниці
IF USED (A_E_B)GENERATE -- у випадку, якщо одиниця
-- присутня або на виводі А_Е_В
A_LE_B = A_E_B # A_L_B; -- або на виводі А_L_В.
ELSE GENERATE -- В протилежному випадку
--(використовується А_L_В
-- і не використовується А_Е_В)
A_LE_B = (A[] == B[]) OR A_L_B; -- виводу А_LE_В
END GENERATE; -- присвоюється значення одиниці
-- або у випадку логічної рівності кодів
-- А[] і В[], або значення виводу A_L_B.
ELSE GENERATE -- Якщо використовується вивід
-- A_E_B, але не використається
IF USED (A_E_B) GENERATE -- вивід А_L_В,
-- то виводу А_LE_В
A_LE_B = A_E_B OR (A[] < B[]); -- присвоюється
-- значення одиниці або в -- випадку, якщо A[] < B[],
-- або значення А_E_В.
ELSE GENERATE -- Якщо виводи A_L_B і А_Е_B не
-- використовуються, то виводу
A_LE_B = (A[] <= B[]); -- А_LE_B присвоюється
-- одиниця, якщо код А[] менший
-- або дорівнює коду В[].
END GENERATE;
END GENERATE;
END GENERATE;
END;
Примітка: Представлений текст програми наведений з коментарями, що пояснюють виконання заданого алгоритму роботи.
Використовуючи даний параметризований модуль як компонент, користувач має можливість вибирати:
розрядність компаратора (визначається значенням параметра WIDTH);
необхідні ознаки порівняння.
Оператори IF GENERATE і вбудована в пакет MAX+plus II функція USED дають можливість створювати параметризовані модулі, архітектура яких визначається не тільки значеннями параметрів, але й набором використовуваних виводів.
Результати моделювання компаратора при WIDTH=8 показаний на рис.14.
Рис. 14.
