Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра «Електронні обчислювальні машини»
Лабораторна робота №2
Розробка та моделювання декодера для семисегментного індикатора
Мета роботи: вивчити методи опису поведінки об'єктів за допомогою архітектур та процесів, шляхи застосування оператора вибору case, навчитись моделювати поведінку об'єктів в САПР Active-HDL.
Теоретична частина:
Для візуалізації процесів, що протікають в складному цифровому пристрої, необхідно виводити значення сигналів на 7-сегментний індикатор. Необхідно розробити на VHDL пристрій "декодер", що перетворює вхідний 4-розрядний двійково-десятковий код у сигнал для одного розряду 7-сегментного індикатора. Кожний розряд індикатора являє собою 7 сегментів, подання логічної одиниці на які викликає їх свічення. Наприклад, подання на індикатор числа "1101101" приведе до висвічення цифри "3":
Інтерфейс декодера:
4-розрядний вхідний порт X типу std_logic_vector (3 downto 0),
вихідний 7-розрядний порт Y типу std_logic_vector (6 downto 0):
Якщо на вхід Х пристрою об'єкта поданий код від 0 до 9, декодер сформувати на виході Y сигнал, який задає зображення цього числа. Для кодів 10..15 на виході формується сигнал "0000000" (жоден сегмент індикатора не світиться). Декодер повинен оновлювати сигнал Y кожний раз, коли змінюється значення вхідного порту Х.
Текст VHDL-опису декодера:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity decoder is
port(
X : in STD_LOGIC_VECTOR(3 downto 0);
Y : out STD_LOGIC_VECTOR(6 downto 0)
);
end decoder;
architecture decoder of decoder is
begin
process (X)
subtype TOutput is STD_LOGIC_VECTOR(6 downto 0);
constant ZERO: TOutput := "1110111";
constant ONE: TOutput := "0100100";
constant TWO: TOutput := "1011101";
constant THREE: TOutput := "1101101";
constant FOUR: TOutput := "0101110";
constant FIVE: TOutput := "1101011";
constant SIX: TOutput := "1111011";
constant SEVEN: TOutput := "0100101";
constant EIGHT: TOutput := "1111111";
constant NINE: TOutput := "1101111";
constant GT_NINE:TOutput := "0000000";
begin
if X'event then
c1: case Conv_Integer(X) is
when 0 => Y <= ZERO;
when 1 => Y <= ONE;
when 2 => Y <= TWO;
when 3 => Y <= THREE;
when 4 => Y <= FOUR;
when 5 => Y <= FIVE;
when 6 => Y <= SIX;
when 7 => Y <= SEVEN;
when 8 => Y <= EIGHT;
when 9 => Y <= NINE;
when others => Y <= GT_NINE;
end case c1;
end if;
end process;
end decoder;
Часові діаграми роботи декодера:
Висновки: У мові VHDL присутні оператори процедурних мов програмування. Такі як case, if і тд. Також є можливість оголошувати константи та нові типи даних.