Санкт-Петербургский государственный политехнический университет
Факультет технической кибернетики
Кафедра автоматики и вычислительной техники
Отчет по лабораторной работе №3
(Учебная дисциплина «Автоматизации проектирования дискретных устройств»)
Работу выполнил студент группы №3081/2
Работу принял преподаватель___________
Санкт-Петербург
2010
1. Контроллер клавиатуры.
Контроллер должен осуществлять прием и преобразование сигналов от клавиатуры. Клавиатура представляет собой матрицу 4х4 в узлах которой расположены кнопки. Кнопки образуют связь между проводниками строки (ROW) и столбца (COL).
Рис 1.1. Схема клавиатуры.
Строки и колонки через подтягивающие резисторы подключены к земле, поэтому на не подключенных проводниках будет низкий уровень сигнала.
Сканирование клавиатуры происходит следующим образом.
COL[3..0] – подключены к выводам контроллера и является сканирующим портом. На выход COL[3..0] подается значение состоящее из одной единицы и нулей.
ROW[3..0] – подключены к выводам контроллера как входы и являются читающим портом. Если клавиша не нажата, то на ROW[3..0] будут все нули, а если нажата и на эту колонку подана 1 с выходов COL[3..0], то в соответствующем разряде ROW[3..0] будет 1. По значениям ROW[3..0] и COL[3..0] можно будет понять какая нажата клавиша.
Рис 1.2. Схема контроллера
клавиатуры.
Двоичный счетчик Counter_Scan работает в режиме прямого двоичного счета, перебирая все четырехразрядные двоичные комбинации кода QC[3..0]. Два старших разряда этого кода декодируются дешифратором Decoder_Col, а два младших разряда поступают на управляющие входы мультиплексора Mux_ROW.
Таким образом при сканировании одной колонки проверяются поочередно все клавиши в ней. Если нажата какая либо из клавиш, то по сигналу E_SEL происходит остановка счетчика Counter_Scan QC[3..0] является скан-кодом нажатой клавиши.
При нажатии клавиши, контроллер формирует выходной сигнал Ready, показывающий, что кнопка нажата и данные сканирования готовы.
Для обеспечения длительности цикла работы счетчика Counter_Scan порядка 20 мс (необходимо для устранения дребезга контактов клавиатуры) на его вход clk_en подается сигнал E_Clk с выхода переноса пятнадцатиразрядного счетчика Prescaler.
Моделирование работы контроллера клавиатуры:
Рис 1.3. Моделирование
контроллера клавиатуры.
В данном тесте моделируется нажатие клавиш — A, 5 и *.
При нажатии A, на ROW[3..0] установился сигнал 0001 при сканировании 4й колонки (код COL[3..0] = 1000). Счетчик продолжает считать до 1111, так как первая строка опрашивается последней по заданному порядку сканирования.
Преобразователь скан-кода клавиши в семисегментный код.
Для отображения нажимаемых клавиш, можно использовать семисегментные индикаторы, но для этого необходим преобразователь скан-кода клавиши в семисегментный.
Преобразователь построен в соответствии со следующей таблицей:
Клавиша |
Скан-код |
Семисегментный код |
1 |
0011 |
0110000 |
2 |
1011 |
1101101 |
3 |
0111 |
1111001 |
4 |
0000 |
0110011 |
5 |
1000 |
1011011 |
6 |
0100 |
1011111 |
7 |
0001 |
1110000 |
8 |
1001 |
1111111 |
9 |
0101 |
1111011 |
0 |
1010 |
1111110 |
A |
1111 |
1110111 |
B |
1100 |
0011111 |
C |
1101 |
1001110 |
D |
1110 |
0111101 |
* |
0010 |
0110111 |
# |
0110 |
0110110 |
Листинг 1. Seven_Segments.vhd.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Seven_Segments is
port(
DATA: in std_logic_vector (3 downto 0);
A: out std_logic;
B: out std_logic;
C: out std_logic;
D: out std_logic;
E: out std_logic;
F: out std_logic;
G: out std_logic
);
END ENTITY Seven_Segments;
ARCHITECTURE Seven_Segments_arch of Seven_Segments is
signal SevSeg : std_logic_vector (7 downto 1);
BEGIN
SevSeg <= "0110000" WHEN DATA="0011" ELSE
"1101101" WHEN DATA="1011" ELSE
"1111001" WHEN DATA="0111" ELSE
"0110011" WHEN DATA="0000" ELSE
"1011011" WHEN DATA="1000" ELSE
"1011111" WHEN DATA="0100" ELSE
"1110000" WHEN DATA="0001" ELSE
"1111111" WHEN DATA="1001" ELSE
"1111011" WHEN DATA="0101" ELSE
"1111110" WHEN DATA="1010" ELSE
"1110111" WHEN DATA="1111" ELSE
"0011111" WHEN DATA="1100" ELSE
"1001110" WHEN DATA="1101" ELSE
"0111101" WHEN DATA="1110" ELSE
"0110111" WHEN DATA="0010" ELSE
"0110110";
A <= SevSeg(1);
B <= SevSeg(2);
C <= SevSeg(3);
D <= SevSeg(4);
E <= SevSeg(5);
F <= SevSeg(6);
G <= SevSeg(7);
END ARCHITECTURE;
Рис. 1.4. Использование
преобразователя в 7сегментный код.
При нажатии клавиш на клавиатуре, они высвечиваются на индикаторах.
2. Контроллер динамической индикации.
Контроллер динамической индикации осуществляет поочередное обращение к знакоместам на семисегментном индикаторе, в отличие от статической индикации, где обращение идет одновременно ко всем знаклместам.
Рис.2.1. Схема контроллера
динамической индикации.
Counter_CDI - счетчик, обеспечивающий циклическое обращение к знакоместам в режиме разделения времени. Частота переключения счетчика порядка 800 Гц определяется сигналом CNT_en, подаваемым на его вход разрешения работы.
Decoder_Col - обеспечивает выбор одного знакоместа в каждый момент времени, задаваемый состоянием счетчика.
Mux_CDI - работая синхронно с дешифратором, обеспечивает подключение данных, соответствующих активному в данный момент знакоместу.
Отладка контроллера осуществлялась с помощью стандартных средств отладки пакета Quatus II, а именно редактора ISSPE.
Рис.2.2. Отладка контроллера
динамической индикации с помощью ISSPE.
В ISSPE задаем скан-коды клавиш и смотрим как они отображаются
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.