VHDL课程设计-PS2键盘

合集下载

PS2接口键盘的输入识别电路设计

PS2接口键盘的输入识别电路设计

河海大学计算机与信息学院(常州)课程设计报告题目PS2接口键盘的输入识别电路设计专业、学号授课班号278605学生姓名指导教师完成时间2012年9月3日摘要本次HDL项目设计的主要目标是PS2接口键盘的输入识别电路设计。

PS/2 键盘是一种常用的计算机输入设备,稍加改动, 便可很方便的应用在各种嵌入式系统中。

本文提出了一种利用 FPGA 来设计 PS/2 接口的方法, 查阅了解资料PS/2 接口协议,运用verilog HDL语言编写程序,并用Quartus II编译,写入试验箱。

结果实现了0~9十个数字的识别并且按下Backspace能够清空四个数码管,表明此方法有容易实现模块化和移植性强的特点。

关键词: PS/2 接口嵌入式系统FPGAABSTRACTThe HDL project design goal is PS2 port keyboard input recognition circuit design.PS / 2 keyboard is a commonly used computer input devices, a little change can be very convenient application in a wide variety of embedded systems. This paperpresents a use of FPGA design PS / 2 interface, data access for PS / 2 interface protocol, using verilog HDL language programming and Quartus II compiler, write test chamber.0 to 9 ten numeric identification results and press the Backspace to clear the fourdigital tube,This method is easy to achieve modularity and portability. Keyword:PS / 2 interface Embedded Systems FPGA系统设计一、要求的设计目标1、设计要求:(1)以通用的PS2键盘为输入,设计一个能够识别PS2键盘输入编码的电路,并把键值通过数码管显示;(2)至少能够识别0~9的数字键。

FPGA基础设计_PS2键盘控制及短按、长按

FPGA基础设计_PS2键盘控制及短按、长按

FPGA基础设计_PS2键盘控制及短按、长按
PS2键盘也是一个经典的实验,可能很多人接触如何对通信协议、时序编程就是从这个实验开始学习的。

USB键盘已经很普及,现在市场上还是有一些USB转PS2的转接头,还有一些转换芯片。

这个实验虽然简单,不过不知道您有考虑过单按一次输出一个有效脉冲、短按、长按等这些是如何实现的么?这就涉及到一些时钟、边沿检测等设计问题。

PS2协议实现
我们见到的PS2的接口电路应该都是这样的:
一根时钟线、一根数据线完成通信,PS2通信的帧格式如下所示,时钟的下降沿数据有效:
按键在被按下时,会发送一个字节,这个码就是通码;按键在释放时,会发送两个字节,这个码就做断码(当然也有例外)。

每一个按键都有唯一的通码和断码,据此进行判断按下的是哪个键,从而执行对应的功能。

如一部分按键的通码和断码如下所示:
可以看出断码其实就是在通码前加了一个F0,比如A的通码是1C,则它的断码是F01C。

另外一些特殊功能的按键,在通码和断码前都会加个E0。

PS2解码的代码如下所示:
//-----------------ps2_clk下降沿捕获--------------------
//clk相当于中间采样点的作用,第一个下降沿到来说明起始位开始
reg ps2_clk0,ps2_clk1,ps2_clk2;//缓冲寄存器
wire ps2_clk_neg; //1表示检测到下降沿
reg ps2_state;
always @ (posedge clk or negedge rst_n)
if (!rst_n)
{ps2_clk0,ps2_clk1,ps2_clk2} 《= 3‘d0;
else。

基于VHDL的键盘扫描电路设计教材

基于VHDL的键盘扫描电路设计教材

毕业论文(设计)题目:基于VHDL的键盘扫描电路设计系:机电工程系学生姓名:专业:电子信息工程班级:指导教师:起止日期: 2012.10.15——2013.01.06 2013年1 月6 日基于VHDL的键盘扫描电路设计(东海科学技术学院机电工程系,浙江舟山 316000)摘要随着科技的发展,时代的进步,生活的需要,在我们生活的很多地方领域,都有键盘的应用,而且它的应用非常广,当然键盘扫描的方法也有很多种。

键盘是单片机系统设计中一种主要的信息输入接口,合理的设计,不仅可以节省系统的设计成本,更可以使仪器设备的操作变得更为简单、方便、快捷,很大程度上提高系统综合性能。

随着信息产业和微电子技术的发展,很多系统设计技术已经成为信息产业最热门的技术之一,在很多地方上都有应用,比如航空航天、医疗保健、通讯、广播、工业、测量测试等很多热门领域。

并且随着工艺的进步和技术的发展,向更广泛的应用领域扩展。

本次设计主要是运用VHDL硬件描述语言和图形设计综合方法,在MAX+PLUSⅡ软件平台的环境下建立波形文件,生成电路符号,设置输入端口,实现程序的模拟仿真,得到仿真波形图,才完成了键盘扫描电路的程序设计。

这个电路设计是一个关于小型的计算器的键盘按键电路的设计,主要由5个部分组成,它们分别为分频器电路、键盘扫描计数器电路、按键检测电路、按键抖动消除电路和键盘编码电路。

本次设计主要是设计一个4×4矩阵式的键盘扫描电路,它具有列扫描和行扫描的功能,有2个输入端口,分别为clk和col,同时也有2个输出端口,分别为row和bianma,按下按键的数据通过端口行、列线输入到FPGA芯片中去,FPGA芯片内部的扫描模块会将数据传送到编码器中进行编码,最终完成本次电路的设计。

在生活中是这种小型的计算器是非常常用的,虽然体型很小,但却被广泛的使用,很多其他的东西都是在这种小型的计算器的键盘的基础上设计的。

关键词:键盘扫描;VHDL;MAX+PLUSⅡ;仿真AbstractWith the development of science and technology, the progress of the times, the need of the life, we live in a lot of place fields, there are keyboard application, but its application is very wide, of course, the keyboard scanning method also has a lot of, the keyboard is the design of single-chip microcomputer system a main information input interface, a reasonable design, not only can save the design cost of system, it can make the equipment operation more simple, convenient, fast, greatly improve the overall system performance. With the development of information industry and the development of microelectronic technology, a lot of system design technology has become the information industry one of the hottest technologies, in many places have applications, such as aerospace, medical care, communication, broadcast, industrial, testing and many other hot areas. And with the technology progress and technology development, to the more widespread application domain expansion.The main design is the use of VHDL hardware description language and graphic design method in the MAX+PLUS software platform, established under the wave file, generating circuit symbols, set the input port, procedures to achieve the simulation, get the simulation waveform, to complete the keyboard scanning circuit design program. The circuit design is a small calculator keyboard circuit design, mainly is composed by 5 parts, which respectively as the divider circuit, keyboard scan counter circuit, key detection circuit, key jitter elimination circuit and keyboard coding circuit. The design is the design of a 4 x 4 matrix keyboard scanning circuit, it has a column scanning and scanning function, having 2 input ports, respectively CLK and col, but also has 2 output ports, respectively row and bianma, press the key data through the port line, line input to the FPGA chip, FPGA chip inside the scanning module can transmit data to the encoder for encoding, the final completion of the circuit design. In life is such a small calculator is very common, though very small in size, but it is widely used, many other things are in such a small calculator keyboard design based on.Key words:keyboard scan; VHDL ; MAX+PLUS Ⅱ;simulation目录第1章绪论 (1)1.1研究的意义和背景 (1)1.2键盘在国内外的发展状况 (1)1.3本课题研究的主要问题 (2)第2章键盘扫描电路总体设计 (3)2.1 设计工具的简介 (3)2.1.1VHDL硬件描述语言 (3)2.1.2MAX+PLUSⅡ的简介 (3)2.1.3FPGA芯片的介绍 (5)2.2键盘扫描电路的基本流程 (7)2.3键盘扫描电路的原理框图 (8)第3章键盘扫描电路的模块电路设计 (10)3.1分频器电路 (10)3.2键盘扫描计数器电路 (11)3.3按键检测电路 (12)3.4按键抖动消除电路 (13)3.5 键盘编码电路 (13)3.6 扫描电路总电路图 (14)第4章顶层设计 (16)4.1端口定义 (16)4.2仿真结果 (17)4.3电路符号 (17)第5章软件调试 (18)5.1 分频器电路中 (18)5.2键盘扫描计数器电路中 (19)5.3按键检测电路中 (20)5.4按键抖动消除电路中 (20)5.5键盘编码电路中 (21)总结 (23)致谢 (24)[参考文献] (25)附录 (26)第1章绪论1.1研究的意义和背景键盘与我们的生活息息相关,可以说是在我们的生活中是无处不在的,比如说手机键盘、电视机的键盘、电脑的键盘等等。

超完美VHDL数码管显示键值_PS2键盘控制实验

超完美VHDL数码管显示键值_PS2键盘控制实验

共四个文件:顶层,分频,读键,显示。

绝对正确。

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity top isport(clr : in std_logic;clk : in std_logic;ps2clk : in std_logic;ps2data : in std_logic;a_to_g : out STD_LOGIC_VECTOR (6 downto 0);sel : out STD_LOGIC_VECTOR (3 downto 0);dp : out STD_LOGIC);end top;architecture Behavioral of top issignal clk4,sclk : std_logic;signal dat : std_logic_vector(15 downto 0);component divclk isport(clk : in std_logic; ------50MHZclk400 : out std_logic; -------400KHZscanclk : out std_Logic);end component;component key_board isport( clr : in std_logic;clk400 : in std_logic; --400KHZps2clk : in std_logic;ps2data : in std_logic;dataout : out std_logic_vector(15 downto 0));end component;component disp isport(clr : in std_logic;scanclk : in std_logic;datain : in std_logic_vector(15 downto 0);a_to_g : out STD_LOGIC_VECTOR (6 downto 0);sel : out STD_LOGIC_VECTOR (3 downto 0);dp : out STD_LOGIC);end component;begininst1: divclk port map(clk,clk4,sclk);inst2: key_board port map(clr,clk4,ps2clk,ps2data,dat);inst3: disp port map(clr,sclk,dat,a_to_g,sel,dp);end Behavioral;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity divclk isport(clk : in std_logic; ------50MHZclk400 : out std_logic; -------400KHZscanclk : out std_Logic);end divclk;architecture Behavioral of divclk isbeginprocess(clk)variable count : std_logic_vector(19 downto 0):=X"00000"; beginif(rising_edge(clk))thencount:=count+1;end if;clk400<=count(2);scanclk<=count(12);end process;end Behavioral;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity key_board isport( clr : in std_logic;clk400 : in std_logic; --400KHZps2clk : in std_logic;ps2data : in std_logic;dataout : out std_logic_vector(15 downto 0));end key_board;architecture Behavioral of key_board issignal clk : std_logic:='0';signal data : std_logic:='0';signal shift1,shift2 : std_logic_vector(10 downto 0);signal ps2c,ps2d : std_logic;beginps2c<=ps2clk;ps2d<=ps2data;dataout<=shift1(8 downto 1) & shift2(8 downto 1);process(clk400,clr)variable tempclk : std_logic_vector(7 downto 0):=X"00"; variable tempdata: std_logic_vector(7 downto 0):=X"00"; beginif(clr='0') thentempclk:=X"00";tempdata:=X"00";clk<='0';data<='0';else if(clk400'event and clk400='1') thentempclk(0):=ps2c;tempclk(7 downto 1):=tempclk(6 downto 0);tempdata(0):=ps2d;tempdata(7 downto 1):=tempdata(6 downto 0); end if;end if;if(tempclk="11111111") thenclk<='1';elseif(tempclk="00000000") thenclk<='0';end if;end if;if(tempdata="11111111") thendata<='1';elseif(tempdata="00000000") thendata<='0';end if;end if;end process;process(clk,clr)beginif(clr='0')thenshift1<=(others => '0');shift2<=(others => '0');else if(clk'event and clk='0') thenshift1(10)<=data;shift1(9 downto 0)<=shift1(10 downto 1);shift2(10)<=shift1(0);shift2(9 downto 0)<=shift2(10 downto 1);-- shift1(0)<=data;-- shift1(10 downto 1)<=shift1(9 downto 0);-- shift2(0)<=shift1(10);-- shift2(10 downto 1)<=shift2(9 downto 0);end if;end if;end process;end Behavioral;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity disp isport(clr : in std_logic;scanclk : in std_logic;datain : in std_logic_vector(15 downto 0);a_to_g : out STD_LOGIC_VECTOR (6 downto 0);sel : out STD_LOGIC_VECTOR (3 downto 0);dp : out STD_LOGIC);end disp;architecture Behavioral of disp issignal S : std_logic_vector(1 downto 0);signal digit : std_logic_vector(3 downto 0);begindp<='1';process(scanclk)beginif rising_edge(scanclk) thenif(clr='0')thenS<="00";elseS<=S+1;end if;end if;end process;process(S)begincase S iswhen "00" =>digit<=datain(3 downto 0);sel<="0001";when "01" =>digit<=datain(7 downto 4);sel<="0010";when "10" =>digit<=datain(11 downto 8);sel<="0100";when others =>digit<=datain(15 downto 12);sel<="1000";end case;end process;process(digit)begin-- case digit is-- when X"0" => a_to_g<="0000001";-- when X"1" => a_to_g<="1001111";-- when X"2" => a_to_g<="0010010";-- when X"3" => a_to_g<="0000110";-- when X"4" => a_to_g<="1001100";-- when X"5" => a_to_g<="0100100";-- when X"6" => a_to_g<="0100000";-- when X"7" => a_to_g<="0001111";-- when X"8" => a_to_g<="0000000";-- when X"9" => a_to_g<="0000100";-- when X"A" => a_to_g<="0001000";-- when X"B" => a_to_g<="1100000";-- when X"C" => a_to_g<="0110001";-- when X"D" => a_to_g<="1000010";-- when X"E" => a_to_g<="0110000";-- when X"F" => a_to_g<="0111000";-- when others => a_to_g<="ZZZZZZZ";-- end case;case digit iswhen X"0" => a_to_g<="1111110";when X"1" => a_to_g<="0110000";when X"2" => a_to_g<="1101101";when X"3" => a_to_g<="1111001";when X"4" => a_to_g<="0110011";when X"5" => a_to_g<="1011011";when X"6" => a_to_g<="1011111";when X"7" => a_to_g<="1110000";when X"8" => a_to_g<="1111111";when X"9" => a_to_g<="1111011";when X"A" => a_to_g<="1110111";when X"B" => a_to_g<="0011111";when X"C" => a_to_g<="1001110";when X"D" => a_to_g<="0111101";when X"E" => a_to_g<="1001111";when X"F" => a_to_g<="1000111";when others => a_to_g<="ZZZZZZZ";end case;end process;end Behavioral;。

HDL-PS2接口键盘课程设计

HDL-PS2接口键盘课程设计

课程设计报告题目HDL项目设计摘要:键盘是最常用人机接口设备之一,在嵌入式系统中有着相当广泛的应用。

一般自行设计的简易矩阵键盘仅仅是按行、列排列起来的矩阵开关。

当需要较多的按键时,则会占用较多的I/O 端口,在软件上则要进行上电复位按键扫描及通信处理,而且还要加上按键的去抖动处理,增大了软硬件开销。

而PS/2 键盘,内嵌自动去除按键抖动设计,自动地识别键的按下与释放,软硬件开发简便,价格便宜,稳定可靠,将PS/2 键盘作为嵌入式系统的输入设备已经成为可行的方案。

本设计是以现场可编程逻辑器件(FPGA)为核心的PS/2接口键盘的输入识别电路。

利用QuartusⅡ软件编写verilog HDL硬件描述语言程序以实现键盘部分简单键值的识别与输出。

本设计主要以程序为核心,硬件电路的搭建使用FPGA实验箱,将程序顶层文件里定义的输入输出端口与实验箱管脚进行相应的配置,除实验箱上的reset键以外,外设是一个与实验箱通过PS/2接口相连的键盘。

当系统上电后,实验箱上的数码管可以依次显示从键盘上输入的键值,并具有数码管清零功能。

关键词:Ps/2接口键盘、输入识别、FPGA 、Quartus Ⅱ、Verilog HDLAbstractThe keyboard, as one of the most commonly used man-machine interface equipment, has a wide application in embedded systems. General to design simple matrix keyboard is only per row, column arrangement up matrix switch. When need more button, will occupy more I/O port, in software, must carry on the power on the reset button scanning and communication processing, but also add buttons to jitter processing, increases the software and hardware cost. And PS / 2 keyboard, inline automatic remove key jitter design, automatically identify key press and release, software and hardware development is simple, cheap, stable and reliable, the PS / 2 keyboard as embedded system input device has become feasible scheme.This design based on field programmable logic devices (FPGA) is the core of the PS / 2 interface keyboard input identification circuit. Use verilog HDL Quartus Ⅱwriting software hardware description language program to realize the keyboard part simple key value of the recognition and output. This design mainly program as the core, the construction of the hardware circuit using FPGA experimental box, will be the top procedure defined in the file input/output port and experimental XiangGuan foot carries on the corresponding configuration, in addition to the experiment box on the reset button beyond, peripheral is a and experimental box through the PS / 2 interface connected keyboard. When the system is powered on, experiment box on the digital tube display can in turn from the keyboard input key value, and has the digital tube reset function.Keywords: Ps / 2 interface keyboard input identification FPGA,QuartusⅡVerilog HDL目录摘要2一.系统设计 51.1设计目标 51.2方案对比与确定 51.3总体设计框图及说明 61.3.1 总体设计框图 61.3.2总体设计端口说明 6 1.4模块电路设计及说明 7 1.4.1键盘数据接收部分 71.4.2数码管显示部分 8二.结果与讨论92.1调试步骤 9 2.2调试现象 92.3问题与分析 9三.软件设计103.1程序流程图 103.2程序设计 11四.心得体会17五.参考文献17六.附录18第一章系统设计1.1系统设计目标(1)以通用的PS2键盘为输入,设计一个能够识别PS2键盘输入编码的电路,并把键值通过数码管显示;(2)至少能够识别0~9的数字键。

一种基于VHDL的PS/2键盘接口设计

一种基于VHDL的PS/2键盘接口设计

一种基于VHDL的PS/2键盘接口设计【摘要】介绍了一种基于VHDL的PS/2键盘接口设计方法,在EP2C5T144C8芯片上实现。

仿真和硬件测试表明,该设计具有可靠性高和可移植性强等优点,可方便地应用于各种基于FPGA/CPLD的嵌入式系统。

【关键词】PS/2接口;VHDL;FPGA1.引言随着社会的发展,嵌入式系统技术越来越多的应用到工业控制、汽车电子、航空航天、环境监测等领域中。

键盘作为嵌入式系统中的人机接口设备得到了广泛应用。

目前,嵌入式系统中采用的键盘有:独立按键式键盘、简易矩阵键盘。

独立按键式键盘有键盘个数少,可靠性低等缺点;而简易矩阵键盘的原理是行、列式的矩阵开关,需要单独设计制作,通用性和可移植性不强,且按键数较多时I/O利用率低,软件上为了提高可靠性还要进行延时去抖动、按键扫描以及与CPU 的通信处理等,一方面降低了系统的效率,另一方面增加了系统设计的成本。

微机系统中的PS/2键盘,具有内嵌式自动去除按键抖动设计,能自动地识别键的按下与释放,软硬件开发成本低且性能稳定;因此,将PS/2键盘作为嵌入式系统中的输入设备已成为业界研究的热点。

目前,关于PS/2键盘控制的应用大部分采用单片机或微机控制;与此相比,FPGA具有灵活性更强,集成度更高,容易移植等特点。

本文在分析PS/2协议、工作原理的基础上,给出了一种基于VHDL硬件描述语言的PS/2键盘接口的设计方法,并实现于Cyclone II EP2C5T144C8芯片上。

2.PS/2键盘接口协议2.1 物理特性PS/2设备接口用于许多现代的鼠标和键盘,常用为6脚mini-DIN,其引脚结构和外形如图1所示。

图1 PS/2硬件接口外形图PS/2设备分主从设备,其物理特性要求保证时钟、数据、电源和地线间的互相连接。

PS/2键盘靠PC的PS/2端口提供+5V电源,时钟和数据管脚为集电极开路形式,必须接大阻值的上拉电阻(一般设置在主设备中),主从设备间的数据通信采用双向同步方式传输,时钟信号一般由从设备产生。

基于FPGA的PS2键盘控制设计及仿真实现

基于FPGA的PS2键盘控制设计及仿真实现

本科毕业论文(设计)论文题目:基于FPGA的PS2键盘控制设计及仿真实现作者声明本毕业论文(设计)是在导师的指导下由本人独立撰写完成的,没有剽窃、抄袭、造假等违反道德、学术规范和其他侵权行为。

对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

因本毕业论文(设计)引起的法律结果完全由本人承担。

特此声明作者专业:通信工程作者学号:作者签名:年月日基于FPGA的PS2键盘控制设计及仿真实现The Design and Simulation Implementation of the PS2 Keyboard Control based on FPGA2013年5月10日摘要本文简述了PS2键盘的特点和工作原理,重点介绍了在FPGA 上实现PS2键盘的结构设计和VHDL代码设计。

PS2键盘具有价格低、通用可靠,且连接线少(仅使用2根信号线)的特点。

并可满足多种系统的要求。

FPGA(Field Programmable Gate Array)是一类高集成度的可编程逻辑器件,它结合EDA技术以硬件描述语言、电路原理图、状机等形式输入设计逻辑;并提供功能模拟、时序仿真等模拟手段,再经过一系列的变换,将输入逻辑转换成FPGA器件所需的编程文件,以实现专用集成电路ASIC。

应用FPGA设计PS2键盘控制器,不仅有硬件电路简单,更具灵活性,集成度高更容易移植等特点,更重要的是现代EDA(电子设计自动化)技术提供了一种很好的途径,利用VHDL硬件描述语言和FPGA器件可以很方便地构建键盘扫描模块。

设计使得使用VHDL语言基于FPGA芯片实现PS2键盘成为研究的方向。

本文对基于VHDL的PS2键盘实现进行了研究,并设计了PS2键盘。

所做的主要工作为:(1)以PS2键盘控制的基本理论为依据,对其进行了详细的讨论。

(2)本设计中采用了自上而下的层次化、模块化的设计思想,将整个接口划分为多个模块,同时利用VHDL语言的描述方法对各个功能模块进行了设计,最终完成了PS2键盘的系统设计。

基于VHDL利用PS_2键盘控制的密码锁设计_胡彩霞

基于VHDL利用PS_2键盘控制的密码锁设计_胡彩霞

《》2011年第5期在传统的数字电路设计实验中,如果要构建一个小型数字系统,通常要在数字电路试验箱中进行繁琐的搭线操作。

由于试验箱资源的限制使得所设计的数字系统功能会受到很大限制。

而FPGA 由于其集成度高和支持可在线编程的特点,修改电路设计变得如同修改程序一样方便[1]。

本文以电子密码锁的设计为实例,介绍了利用硬件编程语言VHDL 自顶向下地进行此系统的行为描述与结构设计,并介绍了PS/2键盘到主机的单向通信过程。

该设计中所用芯片的具体型号是XILINX 公司的具有40万门、208个管脚的SPARTAN XC3S400。

设计过程中下载模式采用主串模式,将程序下载到开发板上的EPROM 中,再由FPGA 将EPROM 中的程序读入片内编程RAM 中。

采用的EDA 开发工具为ISE 6,仿真工具是Modelsim 5.8a 。

1.数字密码锁的基本功能1.1功能描述:密码锁的设计主要达到以下四个功能:(1)密码锁加密:按下F1加密键,再按下0到9中的任四位数字作为密码。

(2)输入码激活:按下F2激活键,将已输入的四位数码作为密码或解锁码。

(3)解锁:按下F5解密键,输入的解锁码会与原密码会进行匹配。

如果成功,则开启密码锁;如果不成功,可继续解码,共有3次解密机会,当3次解密都不成功时,蜂鸣器产生报警信号宣告操作失败。

(4)数码输入:只有在按下F1加密键或F5解密键的前提下,按下0到9的数值才能显示到数码管上。

显示顺序是:随机按下的数码首先显示在四位数码管的最低位上,若确定此数码是想要的数码,再按下ENTER 键,便将此数码向左移动至左边第一个未显示的数码管上。

比如,初始时数码管显示为“XXXX ”(X 表示什么都不显示),按下一个9后,显示的是“XXX9”,再按下ENTER 键后,显示为“9XXX ”。

当输入的数码已达四位数时,按下F2激活键,便可将这四位数作为密码。

由于开发板上只有4个数码管,所以密码设定为4位,在实际中为了增加安全性,可以设置为更多位,还可将字母键扩展为密码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VHDL课程设计-PS2键盘目录一、课程设计的目的与任务 (3)二、课程设计题目 (3)1、指定题目: (3)2、自选题目: (3)三、课程设计的内容与要求 (3)1、设计内容 (4)2、设计要求 (4)四、实验仪器设备 (4)五、设计方案 (4)1、PS2解码 (4)2、设计思路 (6)3、模块设计 (7)4、各模块分析 (8)(1)PS2时钟检测模块8(2)PS2解码模块10(3)PS2组合模块12(4)控制LED模块14(5)PS2总的组合模块16六、综合与仿真 (17)1、综合 (17)2、仿真 (18)(1)电平检测模块仿真 (18)(2)LED灯控制模块仿真 (18)(3)PS2_module总模块仿真 (19)七、硬件下载 (23)八、心得体会 (24)九、参考文献 (24)一、课程设计的目的与任务(1)熟练掌握EDA工具软件QuartusII的使用;(2)熟练用VHDL硬件描述语言描述数字电路;(3)学会使用VHDL进行大规模集成电路设计;(4)学会用CPLD\FPGA使用系统硬件验证电路设计的正确性;(5)初步掌握EDA技术并具备一定的可编程逻辑芯片的开发能力;二、课程设计题目1、指定题目:0 :多功能计数器;1 :数字秒表;2 :简易数字钟;3 :简易频率计;4 :彩灯控制器;5 :交通灯控制器;6 :四路智力竞赛抢答器;7 :简易微波炉控制器;8 :表决器;9 :数字密码锁;我的的学号尾数是2,所以我要做的题目是简易数字钟。

由于我之前已经学过Verilog HDL和VHDL,所以简易数字钟相对于我比较简单,我完成了简易数字钟并验收后,再选择了另一个自选题目来完成。

简易数字钟:设计一个以“秒”为基准信号的简易数字钟,显示时、分、秒,同时可实现整点报时和清零(我已经完成,而且已经验收了)。

2、自选题目:在完成了数字钟的设计后,我选择了另一个设计的题目,那就是PS2键盘扫描。

所以这次课程设计我的报告主要详细写的是PS2键盘扫描的程序,而不是简易数字钟。

PS键盘扫描:设计一个PS键盘扫描程序,能接受键盘的输入时钟和数据,区别哪一个键输入,同时解译通码和断码,使用LED灯来显示收到的数据。

三、课程设计的内容与要求1、设计内容(1)系统功能的分析;(2)实现系统功能的实际方案;(3)编写各功能模块的VHDL语言程序;(4)对各功能模块进行编译、综合、仿真、分析;(5)顶层文件设计(6)对整个系统进行编译、综合、仿真、分析;(7)在CPLD\FPGA实验开发系统试验箱上进行硬件验证;(8)写实验报告;2、设计要求(1)按所布置的题目要求,每一位学生独立完成全过程;(2)分模块层次化设计;(3)各功能模块的底层文件必须用VHDL语言设计,顶层文件可用VHDL语言设计,也可以用原理图设计。

四、实验仪器设备(1)PC机;(2)QuartusII软件;(3)黑金FPGA实验开发系统,芯片为Cyclone II的EP2C5Q208C8;五、设计方案1、PS2解码图1为PS2的接口图。

我使用的的右边的PS2接口,即1脚为数据脚,5脚为时钟脚,同时我编写的VHDL代码只对1脚和5脚操作。

图2 PS2协议时序图图2为PS2协议时序图。

由图可以解读出,PS2协议对数据的读取时“CLK 的下降沿”有效,而数据的放置时在“CLK的上升沿”。

PS2频率比较慢,大概为10KHz。

第N位属性0 开始位1~8 数据位9 校验位10 结束位表1 PS2数据说明PS2的一帧数据时11位。

对PS2进行解码,我们需要得到的是1~8位的数据位。

其他的位,可以使用取巧的方法编写。

键盘的编码有“通码(Make)”和“断码(Break)”之分。

通码相当于某个按键按下了,断码相当于某个按键释放了。

假设,我们按下了“Z”键不放,大约每秒有10个X“1A”的通码(10KHz),而当我们释放“Z”键,就会输出断码X“F0”和X“1A”。

同时,键盘编码一次只能有一个输出,即多个按键同时按下时,只有一个有效。

下表为第二套PC键盘扫描码。

键名通码断码-键名通码断码-键名通码断码A1C F0,1C946F0,46[54FO,54 B32F0,32`0E F0,0E INSERT E0,70E0,F0,70 C21F0,21-4E F0,4E HOME E0,6C E0,F0,6C D23F0,23=55FO,55PG UP E0,7D E0,F0,7D E24F0,24\5D F0,5D DELETE E0,71E0,F0,71 F2B F0,2B BKSP66F0,66END E0,69E0,F0,69表2 PC键盘第二套扫描码2、设计思路(1)PS2时钟的检测;(2)PS2数据的接受并提取需要的8位数据; (3)对PS2提取的8位数据进行解码,确定按键; (4)通过LED 灯显示按键的解码的结果; (5)设置多个按键,多种LED 显示方式;对于PS2键盘扫描程序,我的设计思路是一个模块一个功能,这样能清晰分辨模块,同时易于修改代码。

代码条理清晰,便于解读。

而对于多个模块则使用层次化的形式来编写,顶层文件并不包含功能的设定,只包含各个子功能模块。

3、模块设计PS2键盘扫描分为:电平检测,PS2解码,PS2组合,LED 控制和总PS 组合六个模块。

下面为各个模块的简易模块图。

(1)PS2时钟检测模块:图3 电平检测模块图(2)PS2解码模块:图4 PS2解码模块图(3)PS2组合模块:图5 PS2组合模块图(4)控制LED 模块:PS2解码模块PS2_Data PS2_Da H_L_SPS2_DoPS2_CLK_H_L_Sig电平检测模块PS2解码模块PS2_DataPS2_DaPS2_Done_SigPS2_CLK_Pin_InH_L电平检测模块图6 LED 控制模块图(5)PS2总的组合模块:图7 PS2模块图4、各模块分析(1) PS2时钟检测模块PS2电平检测模块主要的作用是检测PS2接口键盘的时钟信号,因为PS2的协议规定数据是在时钟的下降沿读取的。

所以电平检测模块要检测PS2时钟的下降沿,有下降沿来临时,要做相应的数据读取动作。

下面是代码的分析。

LIBRARY IEEE;--库USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ ENTITY PS2_detect_module IS--实体声明PORT( CLK,RSTn : IN STD_LOGIC; PS2_CLK_Pin_In : IN STD_LOGIC; H_L_Sig : OUT STD_LOGIC; --电平由高变低,输出一个信号 L_H_Sig : OUT STD_LOGIC--电平由低变高,输出一个信号);END ENTITY PS2_detect_module;------------------------------------------------------------------------------------------------------------------------------------------ ARCHITECTURE PS2_detect OF PS2_detect_module IS --结构体声明SIGNAL H_L_F1 : STD_LOGIC :='1';--声明4个信号,用于电平输入的变PS2_Done_SigPS2PS2_Data_Pin_InPS2_CLK_Pin_In Data电平检测模块 电平检测模块 PS2_Data Data_O 电平检测模块PS2_Done化SIGNAL H_L_F2 : STD_LOGIC :='1'; --4个信号都赋了初值SIGNAL L_H_F1 : STD_LOGIC :='0';SIGNAL L_H_F2 : STD_LOGIC :='0';BEGINPROCESS(CLK,RSTn)BEGINIF (CLK'event AND CLK='1') THEN --同步进行IF (RSTn='0') THEN --同步复位动作H_L_F1 <= '1';H_L_F2 <= '1';L_H_F1 <= '0';L_H_F2 <= '0';ELSEH_L_F1 <= PS2_CLK_Pin_In;H_L_F2 <= H_L_F1;L_H_F1 <= PS2_CLK_Pin_In;L_H_F2 <= L_H_F1;END IF;END IF;END PROCESS;H_L_Sig <= H_L_F2 AND (NOT H_L_F1); --输出信号L_H_Sig <= L_H_F1 AND (NOT L_H_F2);END ARCHITECTURE PS2_detect; --结构体结束在结构体中声明了4个信号,用于电平的检测F2信号是接着F1信号的,如果F1信号变化了,F2信号还不会立即变化,F2还会保持F1的前一个状态,以两者的逻辑关系,可以判断输入的是上升沿还是下降沿。

结果如表格3。

表3 电平检测变化表(2)PS2解码模块LIBRARY IEEE; --库USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ ENTITY PS2_decode_module IS --实体声明PORT(CLK,RSTn : IN STD_LOGIC;H_L_Sig : IN STD_LOGIC;PS2_Data_Pin_In : IN STD_LOGIC;PS2_Done_Sig : OUT STD_LOGIC;PS2_Data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ENTITY PS2_decode_module;------------------------------------------------------------------------------------------------------------------------------------------ ARCHITECTURE PS2_decode OF PS2_decode_module ISSIGNAL Done : STD_LOGIC :='0'; --声明一个完成信号SIGNAL i : STD_LOGIC_VECTOR(4 DOWNTO 0) :="00001"; --声明步骤iSIGNAL Data : STD_LOGIC_VECTOR(7 DOWNTO 0) :=X"32";BEGINPROCESS(CLK,RSTn,i)BEGINIF (CLK'event AND CLK='1') THENIF (RSTn='0') THENi <= "00001";Done <= '0';Data <= X"00";ELSECASE i ISWHEN "00000" => i <= "00001";WHEN "00001" => IF (H_L_Sig='1') THEN i <= "00010";Data(0) <= PS2_Data_Pin_In;END IF;WHEN "00010" => IF (H_L_Sig='1') THEN i <= "00011";Data(1) <= PS2_Data_Pin_In;END IF;WHEN "00011" => IF (H_L_Sig='1') THEN i <= "00100";Data(2) <= PS2_Data_Pin_In;END IF;WHEN "00100" => IF (H_L_Sig='1') THEN i <= "00101";Data(3) <= PS2_Data_Pin_In;END IF;WHEN "00101" => IF (H_L_Sig='1') THEN i <= "00110";Data(4) <= PS2_Data_Pin_In;END IF;WHEN "00110" => IF (H_L_Sig='1') THEN i <= "00111";Data(5) <= PS2_Data_Pin_In;END IF;WHEN "00111" => IF (H_L_Sig='1') THEN i <= "01000";Data(6) <= PS2_Data_Pin_In;END IF;WHEN "01000" => IF (H_L_Sig='1') THEN i <= "01001";Data(7) <= PS2_Data_Pin_In;END IF;WHEN "01001" => IF (H_L_Sig='1') THEN i <= "01010";END IF;WHEN "01010" => IF (H_L_Sig='1') THEN i <= "01011";END IF;WHEN "01011" => IF (Data=X"F0") THEN i <= "01100";ELSE i <= "10110";END IF;WHEN "01100" => IF (H_L_Sig='1') THEN i <= "01101";END IF;WHEN "01101" => IF (H_L_Sig='1') THEN i <= "01110";END IF;WHEN "01110" => IF (H_L_Sig='1') THEN i <= "01111";END IF;WHEN "01111" => IF (H_L_Sig='1') THEN i <= "10000";END IF;WHEN "10000" => IF (H_L_Sig='1') THEN i <= "10001";END IF;WHEN "10001" => IF (H_L_Sig='1') THEN i <= "10010";END IF;WHEN "10010" => IF (H_L_Sig='1') THEN i <= "10011";END IF;WHEN "10011" => IF (H_L_Sig='1') THEN i <= "10100";END IF;WHEN "10100" => IF (H_L_Sig='1') THEN i <= "10101";END IF;WHEN "10101" => IF (H_L_Sig='1') THEN i <= "10110";END IF;WHEN "10110" => IF (H_L_Sig='1') THEN i <= "10111";Done <= '1';END IF;WHEN "10111" => IF (H_L_Sig='1') THEN i <= "00001";Done <= '0';END IF;WHEN OTHERS => i <= "00001";END CASE;END IF;END IF;END PROCESS;PS2_Data <= Data;PS2_Done_Sig <= Done;END ARCHITECTURE PS2_decode;这个模块我有点偷懒,只对键盘输入的8位有效数据进行了提取,其他位基本是忽略了,第一位开始位忽略了,然后是读取8位有效数据,第9步和第10步跳过了检测位和结束位,然后是判断。

相关文档
最新文档