You are on page 1of 5

ПРОЕКТ “ДВІЙКОВИЙ ЛІЧИЛЬНИК”

Мета виконання даного проекту полягає в тому, щоб


навчити вас розробляти цифрові системи на основі
лічильників, а крім того повторно використовувати в своїх
проектах раніш розроблені блоки.

2.1 Теоретичні відомості

Двійковий лічильник – цифровий пристрій, який має вхід


синхронізації й багаторозрядний вихід, та функціонує наступним
чином. При кожному передньому фронті синхроімпульсу значення на
виході лічильника збільшується (або зменшується) на одиницю.
Можлива реалізація лічильника, коли замість переднього фронту
використовується задній фронт (зріз) синхроімпульсу. Закон
функціонування лічильника зазвичай описують послідовністю
десяткових еквівалентів двійкових значень, які мають місце на його
виході, наприклад: “0, 1, 2, 3, 4, 5, 6, 7” або “3, 2, 1, 0”. При досягненні
свого максимального значення підсумовуючий лічильник переходить в
мінімальне значення і процес рахування продовжується. Наприклад: “0,
1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...” При досягненні свого мінімального значення
лічильник, що віднімає, переходить в максимальне значення і процес
рахування продовжується. Наприклад “3, 2, 1, 0, 3, 2, ...”.
Часто двійковий лічильник чисельно характеризують так званим
коефіцієнтом рахування (КCT) – кількістю значень в періоді
функціонування лічильника. Так для наведеного вище приклада
підсумовуючого лічильника КCT = 8, а для лічильника, що віднімає
КCT = 4.

Опис двійкового лічильника мовою VHDL


Інтерфейс найпростішого двійкового лічильника складається з
синхровходу (CLK), входу скидання (Res) та багаторозрядного виходу
через який видається стан внутрішньої пам'яті лічильника. Для
визначеності будемо розглядати 4-х розрядний лічильник.

57
Зміна стану лічильника зазвичай виконується за переднім фронтом
синхроімпульсу (CLK). Виділення моменту переднього фронту сигналу в
мові VHDL забезпечується наступною функцією:

rising_edge(CLK)

Ця функція повертає значення «true», якщо сигнал, записаний в


якості її вхідного параметру (в даному прикладі це сигнал CLK)
змінюється зі значення 0 на значення 1, тобто якщо має місце передній
фронт цього сигналу.
Лічильник повинен мати пам'ять для зберігання свого
внутрішнього стану. В найпростішому випадку, коли лічильник рахує
від мінімально можливого до максимально можливого для даної
розрядності значення, процес його функціонування описується в такий
спосіб:

якщо Res='1' то обнулити стан лічильника;


інакше, якщо має місце передній фронт синхроімпульсу (CLK)
то інкрементувати стан лічильника.

Як видно при такому описі лічильник може змінювати свій


внутрішній стан у разі настання двох події:
– подія перша виникає в тому випадку коли на вхід Res
подається логічна одиниця. В результаті настання цієї події
внутрішній стан лічильника обнулюється;
– друга подія виникає у випадку наявності переднього фронту
сигналу на вході CLK. В результаті настання цієї події
внутрішній стан лічильника інкрементується.
При досягненні максимального значення в результаті дії
інкременту лічильник переповнюється і переходить в мінімальне
значення.
Розглянемо VHDL-опис 4-х розрядного підсумовуючого
лічильника з КCT = 16 (закон функціонування 0, 1, 2, … , 14, 15),
побудований на викладених вище принципах.

58
01 -- Listing 4.1
02
03 library IEEE;
04 use IEEE.STD_LOGIC_1164.all;
05 use IEEE.STD_LOGIC_UNSIGNED.all;
06
07 entity counter16 is
08 port(
09 CLK : in STD_LOGIC;
10 Res : in STD_LOGIC;
11 Q : out STD_LOGIC_VECTOR(3 downto 0)
12 );
13 end counter16;
14 architecture counter16 of counter16 is
15 signal mem: STD_LOGIC_VECTOR(3 downto 0);
16 begin
17
18 process (CLK, Res, mem)
19 begin
20 if Res = '1' then mem <= "0000";
21 elsif (rising_edge(CLK)) then
22 mem <= mem + 1;
23 end if;
24 end process;
25
26 Q <= mem;
27
28 end counter16;

!!!
Підключення пакета IEEE.STD_LOGIC_UNSIGNED.all, яке
здійснюється в рядку 05 необхідне для можливості реалізації
оператора інкремента, що застосовується в рядку 22.

!!!
В 22 рядку після оператора «+» записане значення 1 без
поміщення його в лапки, з чого випливає, що це десятинне
значення. Слід пам’ятати, що при використанні мови VHDL

59
десяткові значення не слід поміщати в лапки; однорозрядні
двійкові значення слід поміщати в одинарні лапки, як це зроблено
в 20 та 21 рядках для двійкової одиниці, а багаторозрядні двійкові
значення – в подвійні лапки як це зроблено в 20 рядку для
обнуління вмісту 4-х розрядного сигналу mem.

Коментар до наведеного VHDL-опису Listing 4.1:


Рядки 03 – 06 – підключення бібліотеки та необхідних пакетів.
Рядки 07 – 13 – опис інтерфейсу лічильника.
Рядок 09 – опис входу синхронізації лічильника.
Рядок 10 – опис входу скидання лічильника.
Рядок 11 – опис 4-х розрядного виходу, на який буде видаватися
поточний стан лічильника.
Рядок 14 – початок архітектурної секції опису.
Рядок 15 – оголошення 4-х розрядного сигналу mem, який описує
внутрішню пам'ять лічильника.
Рядки 18, 19 – відкриття процесу (процес необхідний, оскільки
умовний оператор if в мові VHDL може розміщатися тільки в тілі
процесу).
Рядок 20 – обробка події скидання лічильника – обнуління
внутрішньої пам'яті лічильника при одиничному значенні на вході
скидання.
Рядки 21, 22 – обробка події наявності переднього фронту сигналу
CLK – якщо має місце передній фронт сигналу CLK, то інкрементувати
вміст внутрішньої пам'яті лічильника.
Рядок 23 – закриття умовного оператора.
Рядок 24 – закриття процесу.
Рядок 26 – видача вмісту внутрішньої пам'яті на вихідний порт.
Рядок 28 – закриття архітектурної секції опису.

2.2 Постановка задачі лабораторної роботи

В даному проекті необхідно виконати розробку, синтез та


моделювання двійкового лічильника.

60
2.3 Процес виконання проекту

Реалізація проекту буде складатися з наступних кроків.


Крок 1.1 (створення проекту). Створіть у системі Quartus II
порожній (empty) проект, аналогічно тому, як ви це робили на першому
кроці попередньої лабораторної роботи.
Крок 1.2 (опис двійкового лічильника з КCT =16). Додайте в
проект новий VHDL-файл і дайте йому ім'я counter16. Як в системі
Quartus II додавати файли в проект, та як дати їм ім'я, дивіться в
поясненні до 2-го кроку попередньої лабораторної роботи, там ці
питання розглянуті детально.
Помістіть в цей файл опис двійкового 4-х розрядного
підсумовуючого лічильника з КCT = 16 (див. лістинг 4.1).
Крок 1.3. Зробіть доданий до
проекту лічильник пристроєм верхнього
рівня ієрархії. Для цього перейдіть на
вкладку Files вікна Project Navigator.
Натисніть правою кнопкою миші на
імені файлу counter16.vhd, та
оберіть в меню, що відкрилося, пункт
Set as Top-Level Entity.
Крок 1.4 (синтез та
моделювання проекту). Виконайте
синтез та моделювання проекту. Для
цього виконайте ті ж самі дії, що ви
робили при виконанні кроків 3 – 6 попередньої лабораторної роботи
(див. пояснення до цих кроків в файлі завдання попередньої роботи).
Для кожного кроку в протоколі лабораторної роботи наведіть
скріншоти та опис процесу виконання відповідного кроку.

2.4 Контрольні питання

1. Який пакет бібліотеки IEEE обов’язково необхідно підключати


при застосуванні в VHDL описі оператора інкременту?
2. В якому випадку цифрові літерали мови VHDL беруться в
одинарні лапки, в якому в подвійні лапки і в якому записуються
без лапок?

61

You might also like