Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №7
Проектування сканеру клавіатури із застосуванням діаграм скінчених автоматів для опису об'єктів в САПР Active-HDL
Мета роботи: Вивчити принцип роботи сканера клавіатури. Отримати навички проектування цифрових пристроїв за допомогою скінчених автоматів засобами Active-HDL.
Теоретична частина
Клавіатура більшості обчислювальних пристроїв змонтована у вигляді прямокутної матриці, у точках перетину рядків і стовбців якої розташовуються кнопочні контакти. Скануючий пристрій, що розробляється, повинен визначати номер елемента матриці, який відповідає натисненій клавіші, і видавати відповідний йому двійковий код. 
Сканер працює у двох головних режимах:
Режим очікування: 
На всі рядки матриці клавіатури, які позначені Scan(0), Scan(1), Scan(2), Scan(3) подається логічна одиниця. 
Всі стовбці матриці клавіатури, позначені Ret(0), Ret(1), Ret(2), Ret(3) мають низький рівень сигналу. 
Рівень сигналів Ret перевіряється з кожним синхронізуючим імпульсом ClLK, і, якщо один з них змінить своє значення з '0' на '1', це сигналізує про натиснення однієї з клавіш. При цьому сканер переходить в наступний режим. 
Режим сканування: 
На рядок Scan(0) подається сигнал високого рівня, а на всі інші рядки - низького рівня. 
Перевіряється рівень сигналів Ret. 
Якщо рівень одного з Ret (наприклад, Ret(1)) зміниться з "низького" на "високий", це означає, що було замкнено контакт, який розташований на перетині рядка Scan(0) та стовбця Ret(1). Тобто номер елемента матриці клавіатури, якому відповідає натиснена клавіша, знайдено. 
Сканер передає цю інформацію у кодер для формування відповідного коду обраної цифри або операції та знову переходить до режиму очікування. 
Якщо рівень всіх рядків Ret залишається низьким, то проводиться перевірка наступного рядка матриці, і т.д. 
Приклад роботи сканера у випадку натиснення клавіши '3':
№
Дії
Результати
Висновки
1.
Scan = "1111"
Ret = "0000"
Сканер знаходиться в стані очікування.
2.
Scan = "1111"
Ret = "0010"
Одержано інформацію про натиснення клавіши. Сканер переходить в режим сканування.
3.
Scan = "0001"
Ret = "0000"
Натиснена клавіша не знаходиться в першому рядку матриці.
4.
Scan = "0010"
Ret = "0000"
Натиснена клавіша не знаходиться в другому рядку матриці.
5.
Scan = "0100"
Ret = "0010"
Натиснена клавіша знаходиться на перетині третього рядка і другого стовбця матриці.
6.
KeyCode = Scan & Ret
KeyCode = "01000010"Strobe = '1'
Сканер переходить в режим очікування.
Тексти VHDL-кодів:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity Keyboard is 
port (
	CLK: in STD_LOGIC;
	ret: in STD_LOGIC_VECTOR (3 downto 0);
	KeyCode: out STD_LOGIC_VECTOR (7 downto 0);
       Strobe: out STD_LOGIC;
	Scan: inout STD_LOGIC_VECTOR (3 downto 0));
end Keyboard;
architecture Keyboard of Keyboard is
-- diagram signals declarations
signal Cond: STD_LOGIC;
-- SYMBOLIC ENCODED state machine: Sreg0
type Sreg0_type is (
    S1, S2, S3, S4, S5, S0
);
-- attribute enum_encoding of Sreg0_type: type is ... -- enum_encoding attribute is not supported for symbolic encoding
signal Sreg0: Sreg0_type;
begin
----------------------------------------------------------------------
-- Machine: Sreg0
----------------------------------------------------------------------
Sreg0_machine: process (CLK)
begin
	if CLK'event and CLK = '1' then
	-- Set default values for outputs, signals and variables
		-- ...
	--Cond <= ret(0) or ret(1) or ret(2) or ret(3); 
case Sreg0 is
			when S1 =>
				Scan <= "0001";
				if Cond = '0' then				       
					Sreg0 <= S2;				
elsif Cond = '1' then
					Sreg0 <= S5				
end if;
			when S2 =>
				Scan <= "0010";
				if Cond = '0' then	
					Sreg0 <= S3;
				elsif Cond = '1' then	
					Sreg0 <= S5;
				end if;
			when S3 =>
				Scan <= "0100";
				if Cond = '0' then	
					Sreg0 <= S4;
				elsif Cond = '1' then	
					Sreg0 <= S5;
				end if;
			when S4 =>
				Scan <= "1000";
				if Cond = '1' then	
					Sreg0 <= S5;
				elsif Cond = '0' then	
					Sreg0 <= S0;
				end if;
			when S5 =>
				Strobe <= '1';
				if Cond = '0' then	
					Sreg0 <= S0;
				elsif Cond = '1' then	
					Sreg0 <= S5;
				end if;
			when S0 =>
				Scan <= "1111";
				Strobe <= '0';
				if Cond='0' then	
					Sreg0 <= S0;
				elsif Cond = '1' then	
					Sreg0 <= S1;
				end if;
--vhdl_cover_off
			when others =>
				null;
--vhdl_cover_on
		end case;
	end if;
end process;
-- signal assignment statements for combinatorial outputs
KeyCode_assignment:
KeyCode <= Ret&Scan when (Sreg0 = S5) else
           "00000000" when (Sreg0 = S0) else
           "00000000";
end Keyboard;
Макет діаграми скінчених автоматів:
Часові діаграми роботи ПЗП:
Висновки: я вивчив принцип роботи сканера клавіатури. Отримав навички проектування цифрових пристроїв за допомогою скінчених автоматів засобами Active-HDL.