PS/2
电信工程学院
05102
苏君
050051
17
设计制作一个PS/2键盘接口控制器。
1. 按照PS/2键盘接口标准设计一个控制器,接收PS/2键盘发送的数据,用数码管显示接收到的键值(只显示0~9,a~z,部分不便用数码管显示的字符可自行设定显示方式,接收到其他键值则不显示); 2. 选做:用8×8点阵做显示屏,显示所有按键的键值。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY ps2 IS
Port(
key_clk, data, reset: IN STD_LOGIC; --初始化ps2输入端口
TSCode: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
--将8个数据位转换成数码管 END ps2;
ARCHITECTURE ps2_datatranslation OF ps2 IS
SIGNAL COUNT : STD_LOGIC_VECTOR(3 DOWNTO 0); --定义一计数器来控制键盘八位数据传输到
Tscode中
SIGNAL Trans_Input : STD_LOGIC_VECTOR(8 DOWNTO 0); --包含初始位一直到应答位 SIGNAL Read : STD_LOGIC; --读取当前bit是否为数据彼特bit SIGNAL SCAN_CODE : STD_LOGIC_VECTOR(7 DOWNTO 0); --扫描8位数据比特
BEGIN
PROCESS
BEGIN
WAIT UNTIL ( key_clk'EVENT AND key_clk = '0'); --下降沿触发 IF reset = '1' THEN COUNT <= "0000"; Read <= '0'; --按下复位键计数器和数据端口清零 ELSE IF data = '0' AND Read = '0' THEN Read<= '1'; --如果数据线为低电平,则开始读取数据流
ELSE IF Read = '1' THEN --开始处理8位数据流
IF COUNT < "1001" THEN
--只处理9个从键盘传来的数据流
COUNT <= COUNT + 1; --计数器加一
Trans_Input(7 DOWNTO 0) <= Trans_Input(8 DOWNTO 1); --将新的数据传入
Trans_Input(8) <= data; --丛数据流读取新的数据
ELSE
SCAN_CODE <= Trans_Input(7 DOWNTO 0); --将新的数据存储到变量中
Read <= '0'; --讲数据读取关闭
COUNT <= "0000"; --计数器置零
END IF;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(SCAN_CODE)
--将SCAN_CODE中的数据传送到TSCODE中 BEGIN
CASE SCAN_CODE IS
WHEN "01000101" => TSCode <= "11111100"; --0
WHEN "00010110" => TSCode <= "01100000"; --1
WHEN "00011110" => TSCode <= "11011010"; --2
WHEN "00100110" => TSCode <= "11110010"; --3
WHEN "00100101" => TSCode <= "01100110"; --4
WHEN "00101110" => TSCode <= "10110110"; --5
WHEN "00110110" => TSCode <= "10111110"; --6
WHEN "00111101" => TSCode <= "11100000"; --7
WHEN "00111110" => TSCode <= "11111110"; --8
WHEN "01000110" => TSCode <= "11110110"; --9
WHEN "00011100" => TSCode <= "11101110"; --A
WHEN "00110010" => TSCode <= "00111110"; --B
WHEN "00100001" => TSCode <= "10011100"; --C
WHEN "00100011" => TSCode <= "01111010"; --D
WHEN "00100100" => TSCode <= "10011110"; --E
WHEN "00101011" => TSCode <= "10001110"; --F
WHEN "00110100" => TSCode <= "10111111"; --G
WHEN "00110011" => TSCode <= "00101110"; --H
WHEN "01000011" => TSCode <= "01110000"; --I
WHEN "00111011" => TSCode <= "11110000"; --J
WHEN "01000010" => TSCode <= "10011101"; --K
WHEN "01001011" => TSCode <= "00011100"; --L
WHEN "00111010" => TSCode <= "11110011"; --M
WHEN "00110001" => TSCode <= "11101100"; --N
WHEN "01000100" => TSCode <= "00111010"; --O
WHEN "01001101" => TSCode <= "11001110"; --P
WHEN "00010101" => TSCode <= "11111101"; --Q
WHEN "00101101" => TSCode <= "11101111"; --R
WHEN "00011011" => TSCode <= "10110111"; --S
WHEN "00101100" => TSCode <= "10001100"; --T
WHEN "00111100" => TSCode <= "01111100"; --U
WHEN "00101010" => TSCode <= "00111000"; --V
WHEN "00011101" => TSCode <= "10011111"; --W
WHEN "00100010" => TSCode <= "01101111"; --X
WHEN "00110101" => TSCode <= "01110110"; --Y
WHEN "00011010" => TSCode <= "11011011"; --Z
WHEN OTHERS => TSCode <= "00000000";
END CASE;
END PROCESS;
END ps2_datatranslation;
按下ps/2键盘,在数码管显示接收到的键值,只显示0~9,a~z接受到其他
的不显示。
Ps/2接口键盘,实验开发板
在点击键盘过程中,实验板上的led始终无法显示,在查看了代码后,发现读取数据有错误,主要是循环判断出错,于是改变了循环的条件后,数据传送成功。
在本学期,我选择了ps/2接口实验,选择这项实验并非是出于爱好,而是想了解各种
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
是怎样通过具体语言来实现的。在刚开始时,对实验毫无头绪,面对各种资料,始终无法摸
清头绪。经过一周的查讯资料和同学交流,才知道ps/2的原理。于是自己便动手尝试编写了一些程序,同时参考vhdl实验手册中的接口技术部分。在完成后,立刻就烧入了实验板
中,结果以失败告终,但是通过林丰伟同学的帮助,我找到了自己程序中的错误,原先译码
的变量最终没有赋值给TSCode变量,这直接导致了实验板中始终接受不到任何信息。于是
在修改了代码之后,经过不断的试验,终于在Led上能显示按键的键值。接下来是要在数码管上显示,参阅了材料,原来只要把TSCode中的值相应做修改即可,从而最终成功的做出了实验。让我收获最大的还是通过本次实验,是我了解到了将协议转化成编程语言的过程。