基于VHDL利用PS2键盘控制的密码锁设计

附件:下载地址

中文摘要

摘 要:现代社会,人们的安全意识正在不断提升。按键密码锁由于其具有方便性、低成本等特征,还是大有用武之地的。但是通常的按键密码锁开发,都是基于单片机技术。因为单片机在性能方面存在着一些不足,还不能完全满足人们对密码锁功能和安全方面进行扩展的需求。所以,本文提出了一种相应的解决方法。
本文阐述了一种基于FPGA平台和VHDL语言的密码锁设计原理与方法。密码锁作为一个小型数字系统,通过利用PS/2接口键盘作为输入模块、FPGA作为核心处理模块、LED数码管作为输出模块,来实现其具体的功能。设计过程中所用的具体芯片型号是XILINX公司的SPARTAN XC3S400,EDA开发工具为ISE ,仿真工具是Modelsim SE。
最后,本文实现了一个简单的密码锁原型系统的设计。该系统开发采用了“从上至下”的设计方针,先设计系统的主要功能模块,然后对功能模块进行具体化实现。最终的密码锁系统,解决了密码锁输入模块的通讯问题,密码锁控制模块的构造问题,密码锁输出模块的显示问题。

关键词:EDAFPGA ; VHDL ; PS/2键盘 ; 密码锁 ; XILINX

A Kind of Design of Password Lock Controled by PS2 Keyboard Based on VHDL
Chao Wu
Director:JunMing Guan
(College of Information Engineering, Huangshan University, Huangshan, China, 245041)

英文摘要
Abstract:Nowadays, people's awareness of safety is rising. The key-pressing password lock still
has its brilliant prospects because of its good features,such as convenience, low cost etc. But the current development of key-pressing password lock is always based on the single chip microcom-puter technology. But this mode has some deficiencies in terms of performance, so it can not fully meet the needs of the extended developing on function and safety. Therefore, this paper proposes a kind of solution.
This paper states a kind of principle and way, which is to design a password lock based on FPGA platform and VHDL language. As a small digital system, this password lock uses PS/2 interface keyboard as the input module, FPGA as the central process module, LED as the output module to implement its function. In the progress of designing, the type of chip is SPARTAN XC3S400 from XILINX company, the intergrated developing environment is ISE, the tool of simulation is Modelsim SE.
Finally, this paper implements a simple prototype system's designing of the password lock . The develpment of this system uses the "top-down" designing approach,firstly to design the system's main function modules, and then to implement each specific functional module.The final password lock system solves the communication problems of the input module, the constructing problems of the control module ,the display problems of the output module .
Key Words:EDA; FPGA; VHDL; PS/2 Keyboard; password lock; XILINX

引 言

  随着社会的发展,人们的安全意识正在不断提升。这就需要更先进的锁类产品来满足人们更高的需求。与普通的机械锁相比,电子密码锁由于具有更高的安全性以及更智能化的操作性,所以逐渐受到人们的青睐。
按照操控方式来分类,目前市场上的电子密码锁设备,大致可划分为如下三种:生物特征密码锁、卡式密码锁和键盘密码锁[1]。其中,生物特征密码锁一般是通过识别人体的某些生理特征来进行工作的产品,如基于指纹识别、声音识别的密码锁[1]。生物特征密码锁由于具有很高的安全性,一般被用在安全性要求极高的行业中,如银行业[1]。卡式密码锁一般是通过识别IC(Integrated Circuit,集成电路)卡等具有存储功能的卡片来进行工作的产品。卡式密码锁又可分为接触式和非接触式两种类型[1]。无论是哪一种都需要人们随身携带卡片,万一卡片丢失损坏或被盗,就会给使用者造成无可挽回的损失。键盘式电子密码锁是通过键盘输入密码信号来进行工作的设备[1] 。从价格和方便性的角度综合考虑,键盘式电子密码锁是比较适合一般大众的。因而,键盘式密码锁具有广泛的研究前景与应用价值。
但是在研究了键盘式电子密码锁设计的相关文献之后,会发现目前此类密码锁在设计的过程中所使用的工具与开发模式存在如下问题:
(1)当前键盘式密码锁产品的设计主要是基于单片机技术,将单片机作为系统的中央处理模块。但是单片机在性能方面存在着一些不足,还不能完全满足人们对功能和安全方面进行扩展的需求。单片机一般只有40个引脚、几KB的存储器容量[2],那么在利用单片机做功能设计和扩展时就受到了很大的限制。比如,要在密码锁键盘识别的基础上,再增加语音识别或指纹识别等功能时,就需要控制芯片拥有更大的存储空间、更快的处理能力。而这是单片机所不具备的。
(2)当前键盘式密码锁产品设计过程中,开发人员在利用单片机进行开发时,主要采用汇编语言或者是C语言[3],这类语言不能够充分模仿硬件电路级的行为,从而增加了开发成本。以汇编语言为例,汇编语言是一些转移指令、运算指令、跳转指令等底层硬件指令的集合[4]。要完成一个简单的功能,如键盘时序的控制,一般就需要写上百行的汇编代码。最终,程序会十分冗长,并且可维护性差。
(3)当前键盘式密码锁产品设计过程中,开发人员针对不同型号的产品一般都要重新设计键盘扫描电路、键盘消抖电路和键盘译码电路等接口电路。而这些重复工作无疑增加了开发人员的负担。
针对上述这些问题,本文提出了一种解决办法。
首先,如果能够采用FPGA(Field Programmable Gate Array,现场可编程门阵列)作为中央处理模块来进行密码锁设计就基本可以解决单片机容量不足和扩展性能力弱的问题。目前的FPGA芯片一般有200个引脚,几MB的存储容量[5],具备密码锁等小型数字系统设计的容量与能力,甚至绰绰有余。
其次,如果能够采用EDA(Electronic Design Automation,电子设计自动化)技术作为密码锁的开发模式来进行设计,就基本可以解决利用汇编或C进行开发的可维护性差的问题。因为在电子设计行业,EDA技术是进行数字系统设计的重要手段,并且在某些复杂系统设计领域中甚至成为主要的手段[6]。在EDA软件的支持下,开发人员需要做的只是描述数字系统的功能与行为,然后将描述的结果交由计算机软件进行处理,最终在下载到FPGA中后便得到想要的电子线路[6]。通过这样的设计方式,使原本需要在硬件上进行的修改,简化到只需要修改程序的程度。本文所采用EDA编程语言是VHDL(Very high speed integrated circuit Hardware Description Language, 超高速集成电路硬件描述语言)语言。VHDL作为一种硬件描述语言,具有功能强大的语言结构,可以用简洁的程序来描述复杂的逻辑行为[7]。它具有多层次的设计描述功能,经过工具软件的层层细化,最后可直接生成电路级的描述,下载到FPGA后便可得到所需要的电子设备[7]。VHDL还支持同步电路、异步电路和随机电路的设计[7],这是其他硬件描述语言所不能比拟的。VHDL支持多种设计方法,既支持自底向上的设计模式,也支持自顶向下的设计模式。所以,在利用VHDL语言进行数字系统设计时,可以极大地发挥开发人员的创造性。
最后,考虑到当前PS/2(Personal System 2,个人系统2)键盘已经集成键盘扫描电路、消抖电路、译码电路[8]。所以,在采用PS/2键盘直接作为密码锁输入电路之后,就可以减轻开发人员重复设计接口电路的工作负担。并且PS/2键盘具有广泛的普及率、丰富的按键等优势。这些因素将给开发者带来巨大的方便。

1 密码锁的功能分析与电路分析
1.1 密码锁的功能概要描述

  因为本文的主要目的是在提供一种密码锁设计的方法,而不是完成一个具体的商业应用产品。基于这种思想设计出的密码锁,只完成了最基本的功能模型,而在性能、安全等方面,没有作过多的考虑。
密码锁的核心功能主要是两个:修改密码与密码匹配。因为一般修改密码的过程是先输入旧密码进行确认,然后输入新密码激活。这就与密码匹配在功能上重叠了,所以本文将密码锁的核心功能实现为:密码设置与密码匹配。其中,密码设置是将修改密码简化为输入新密码进行激活,去除了旧密码确认的步骤。
密码锁如果要完成不同的功能,一般就需要同时具有数字键和控制键等不同性质的按键来进行输入判别。不同性质的按键输入对应着不同的密码锁状态。比如,在初始状态下只能够进行ENTER键和F1、F5键的接收(如图1-1所示),输入其他任何键都将进入空状态。这样可以起到约束密码锁的输入输出的作用,防止异常输入输出的发生。


图1-1 密码锁的状态转换图

在本文设计的密码锁中,具体按键列表如图1-2所示:

图1-2 按键列表图

1.2 密码锁的功能详细描述

密码锁的设计主要达到以下功能:
(1)密码设置:首先按下F1键,然后按下0到9中的任四位数字,最后按下确认ENTER键,那么先前输入的四位数便可作为密码。之所以将密码的位数限制为四位,是由于本项目所用FPGA开发板出厂时,只焊接了四位LED数码管。而在现实生活中,对电路进行简单扩充之后,如多焊接几位数码管,便可满足人们不同的需要。
(2)密码判别:首先按下F5键,然后按下0到9输入四位码,最后按下确认ENTER键,那么先前输入的四位数便会与FPGA中内存中的原密码进行匹配。如果匹配成功, 则蜂鸣器有节奏地响起宣告成功;如果匹配不成功,还有2次开锁机会,当3次匹配都不成功时,蜂鸣器便会长鸣宣告失败。

1.3 密码锁的顶层设计

因为VHDL语言支持“自顶向下”的设计模式,所以在进行程序的初始设计时,可以先通过对整个系统的功能进行规划,勾勒出整个数字系统的顶层功能模块图如图1-3所示,然后在顶层功能模块图基础之上逐步细化,最终可以得到密码锁的详细模块设计图如图1-4所示。
需要说明的是,顶层功能模块在设计时只需要设计若干个大型模块与抽象的接口即可,不需要对大型模块进行细化。当顶层模块搭建出来之后,一定要检查其大型模块或抽象接口的正确性。因为顶层模块的设计,是数字系统后续设计过程的基准。若在此阶段产生任何问题,其修复代价将在后续的设计过程中翻倍。在保证大型模块或抽象接口的正确性的情况下,可以进行大型模块的细化,以及抽象接口的具体定义。


图1-3 顶层模块图

在图1-3中需要重点提出的是,各大型模块之间的数据流向问题。有的箭头是单向,代表的是数据流向是单向;有的箭头是双向,代表的是数据流向是双向。其中,“输入模块”代表的是PS/2键盘接口电路处理模块,这二者之间的数据流向总是单向的,“键盘输入模块”向“输入模块”发送数据;“处理控制模块”代表的是密码锁的核心控制模块,“输入模块”与“处理控制模块”之间的数据流向也是单向的,总是“输入模块”向“处理控制模块”发送数据;而整个密码锁系统中存在的唯一一条双向数据流,是在“数据存储模块”与“处理控制模块”之间,“数据存储模块”要得到“处理控制模块”中的数据来更新密码,而“处理控制模块”要得到“数据存储模块”中的原始密码进行匹配操作。
根据顶层模块图的设计结果,可以进行下一步的详细设计,得到密码锁的详细模块图,结果如下图1-4所示:


图1-4 密码锁的详细模块图

1.4 密码锁输入模块

  密码锁输入模块总共包含有PS/2键盘时钟过滤、键盘扫描码接收两个子模块。这个大型模块涉及到键盘与FPGA主机之间的通讯协议问题,其实也是整个系统设计中遇到的难题之一。
首先,键盘与主机之间要进行握手[9]。握手是通讯方面的术语,是指双方在同步传输方式下进行时间节拍信号的协商。如果通讯双方采用的是同步传输方式,那么通讯的双方需要先控制数据传输的节奏,然后在同一时钟信号下才能传递数据[10]如图1-5所示;如果双方采用的是异步传输方式,则通讯的双方不需要先控制数据传输的节奏,就可以直接传递数据,因为异步传输的数据具有固定的格式,从而携带了时序信息[10]。异步通讯方式中,每一个单元的数据称为一帧[10],如图1-6所示。正是由于异步传输需要通讯的双方进行数据帧的解析,所以相对于同步传输来说,这会增加数据的处理时延,显得较慢一些[10]。


图1-5 同步传输

图1-6 异步传输

1.4.1键盘时钟过滤进程

  PS/2接口的外形与端口定义如下图1-7所示,其中时钟端口(CLOCK)便是用来进行通讯双方握手的引脚。而数据端口(DATA)是用来传递数据的引脚,双方传递数据的引脚只有这一根线,只能进行串行传输。对串行通信的原理的具体阐述,在本小节后面会有所涉及。

图1-7 PS/2接口定义

在采用这样的引脚定义基础上,PS/2键盘到主机单向通讯的原理如下:
PS/2设备有主从之分,主设备采用female插座,从设备采用male插座。现在广泛使用的PS/2键盘鼠标均工作在从设备方式下。主从设备之间数据通信采用双向同步串行方式传输[9]。
首先,PS/2键盘与主机间的通讯方式是串行的,是一位一位地进行数据的传递[9],因为PS/2接口只有一根数据线。此处需要说明的是,数据的传送方式按照其通讯过程中传送的字节数,可以分为串行和并行两种方式,如下图1-8所示:


图1-8 串行通信与并行通信的区别

  其次,此处还需说明的是,PS/2键盘与主机间的通讯方式是同步的,而同步时钟来自于键盘内部自带的晶振。
PS/2键盘发送到主机的每一帧(frame)数据包含11位(bit)数据[11]。每位数据会在键盘时钟的下降沿被主机从数据端口(DATA)读入[11],其时序图如下图1-9所示:


图1-9 PS/2数据帧格式

这些数据位的含义分别是:1个起始位总是为0, 8 个数据位低位在前,1 个奇校验位,1个停止位总是为1[11]。键盘与主机间的通讯数据,称为键盘的扫描码,扫描码由键盘的矩阵电路产生。每当按下键盘的一个键后,就会产生一个相应的扫描码。正如键按下就会有扫描码(通码)发往主机一样,只要键释放,也会有扫描码(断码)发往主机[11]。每个键都有它自己唯一的通码和断码。第二套扫描码集(见附录)中,大多数按键的通码是一个字节;而断码有两字节,第一个字节是F0h,第二个字节就是这个按键的通码。不同的按键,对应着不同的通码与断码,这就产生了一张键盘扫描码表,在附录中可以查询每个键的扫描码。在该密码锁的设计中,所用到的按键都是通码有一个字节,断码有两字节的按键。
键盘与主机间的PS/2接口的6个引脚中传递信息的引脚有两个:时钟脚(clk)和数据脚(data)。系统设计中,之所以不直接将键盘时钟信号作为系统(FPGA)时钟输入信号,却还要加一个键盘时钟过滤进程的原因是FPGA对时钟边沿是很敏感的,可是PS/2键盘的时钟比较抖,包含很多的毛刺[12]。所以我们一定要注意适当滤波,否则接收到的扫描码的8位数据会出错。该设计采用的解决方法是,让PS/2键盘的时钟过2次D触发器;如果这2个的D触发器的输出是“10”,就可以判定是PS/2键盘时钟下降沿了,而不是毛刺,然后开始从数据线上读取数据。
需要说明的是: D触发器是一种应用在数字电路上具有记忆功能的逻辑元器件[13]。D触发器有一个输入、一个输出和一个时脉输入,当时脉由0转为1时,输出的值会和输入的值相等[13]。此类触发器可用于防止因为噪声所带来的错误,以及通过管道增加处理资料的数量[13]。D触发器的符号表示与真值表的详细信息如下图1-10所示:

图1-10 D触发器的符号表示与真值表

时钟过滤进程主要的vhdl代码是:

--sysclk是开发板上的晶振时钟信号-50MHZ;
if rising_edge(sysclk) then
---这两个D触发器构成了一个移位寄存器;
ps2clk_r() <= ps2clk_r();
ps2clk_r() <= ps2clk;
----这里的ps2clkfall代表了PS2键盘时钟的下降沿信号;
ps2clkfall<=';
end if

正如上面注释中所说,在设计时钟过滤进程中,在代码添加了类似于“移位寄存器”的功能,而这样写的结果是,在经过了ISE的布线仿真之后,可能会在真实的系统电路中,生成这样一个“非循环移位寄存器”装置。
此处需要说明的是: 在数字电路中,用来存放二进制数据或代码的电路称为寄存器[13]。寄存器是由具有存储功能的触发器组合起来构成的[13]。一个触发器可以存储一位二进制代码,存放N位二进制代码的寄存器,需用N个触发器来构成[13]。寄存器按功能可分为:基本寄存器和移位寄存器[13]。移位寄存器中的数据可以在移位脉冲作用下一次逐位右移移出或左移移出[13]。数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,串行输入、并行输出。 所下图1-11所示,提供了一个串行输入、并行输出的模型。


图1-11 串行输入、并行输出的一位移位寄存器

1.4.2 键盘扫描码接收进程

当接收键盘的扫描码时,每接收完11位完整的数据,就要把这11位数据作为一帧传送出去。对于完成这样的操作,本文采用解决的方法是,用一个12位的移位寄存器作为载体进行实现,其中移位寄存器的高11位用于存放数据,最低一位作为标志位。当通讯过程中检测到此标志位时,就代表已有一帧数据接收完毕,可以打包送走了。在VHDL语法中,一般用并置运算符“&”实现此移位寄存器功能,并置运算符主要是进行位(bit)级的合并操作[7]。
扫描码接收进程主要的VHDL代码是:

' then
-----这个q是一个12位的移位寄存器;
)=' then
--- ps2data是串行输入的;
q <= ps2data & ";
else
----每帧接收结束标志是:
q()=';
q <= ps2data & q( );
end if
end if 

并且,此处这个12位的移位寄存器具有串行输入/并行输出的功能。
试验过程中发现,虽然PS/2键盘内部的消抖电路已经对按键进行消抖,但是一个键按下后,既要发送通码,又要发送断码,而断码一般是不需要接受的;并且按下一个键的时间长短也是不确定的,准确地说,会产生类似于毛刺的短信号输入。这些问题,都可能影响设计的最终实现,使后面控制进程产生错误判断。此处采取了这样的解决方法,因为该设计中所使用的按键都是一个字节通码、两个字节断码的按键(断码的内容F0H+通码),那么可以设置一个缓冲区,一次性接受3个扫描码。若缓冲区内第一个扫描码与第三个扫描码的内容相同,则可以认定缓冲区中的第一个扫描码是键盘上某一个按键的通码。
主要的vhdl代码是:

 );
---- reg3 =reg1表示每当一帧数据接收结束,便会触发此进程
if reg3 =reg1 then
reg3<=reg2;
reg2<=reg1;
reg1<=q( );
end if

代码中,信号量reg1,reg2, reg3指代缓冲区当中的三个寄存器。当reg3= reg1时,程序便可以将断码给剔除掉了。这时,可将reg3作为按键的最终扫描码向后面的控制模块传递了。
需要说明的是,信号量signal类型,在VHDL语言中是进程间进行数据交换的一种手段,相当于高级语言中的全局变量[7]。采用信号量对象,可以把设计实体连接在一起形成一个模块[7]。在硬件电路中,信号量代表一条硬件连线,但有时信号量会被综合成一个寄存器。信号可以在architecture、package、entitiy中声明,是全局量可以在全局使用[7]。

1.5 密码锁控制模块

密码锁控制模块主要由扫描码译码判断进程、密码锁控制进程、密码匹配进程,三个子模块组成。

1.5.1 密码锁控制进程

该设计中的密码锁有专门的控制按键:F1加密键、F5解密键、ENTER确认键。因为控制模块主要是以这些命令键作为控制输入的,所以每当一帧数据接收结束,就要对扫描码按键进行译码识别,再做出相应的操作。
而不同的命令的执行,又是通过定义具有不同控制信号来实现的。在VHDL语法中,“信号”这一数据类型可以在多个进程间传递信息。所以,该设计就采用了全局变量的方式,定义了多个这样的信号,通过按键和一些其他因素来触发这些控制信号,进而触发相关命令的执行。在完成相应的任务后,又须及时“回收”这些信号,使得系统恢复原来的状态。需要注意的是,信号不应当在VHDL的多个并行语句中(如多个进程中)进行赋值操作,否则vhdl的时序控制操作很可能会无法现实同步,甚至编译无法通过。
主要的vhdl代码是:

--加密信号
';
----解锁信号
';
----数码接收情况的旗帜信号
';
-------------
--- 每接收一完帧数据后判断是否是F1(");
 )=" then
----按下了F1键后,加密信号触发;
encode<=';
elsif reg3 =reg1  )=" then
----按下了F5(")键,解锁信号触发;
breakcode<=';
----flag0=' 时,表示接收密码已达4位
elsif flag0=' then
---- 回收加密信号
encode<=';
elsif flag0='then
----回收解密信号
breakcode<=';
end if;

1.5.2 控制模块存储区的处理

该设计中将已设定好的密码存储到密码存储区,而解锁过程中输入的待比较的密码会存入解码存储器。并且,还需设置一个显示缓存区,存储要显示的数据。在系统的设计中,这几个存储区是通过定义寄存器来实现的。这里,可以通过type用户自定义类型来定义数组作为寄存器实现这些存储区功能的。
主要的vhdl代码是:

---- ram定义成了一个数组(4个11位寄存器);
 )  );
---- 显示缓存区
signal coderam :ram ;
---- 解码存储区
signal breakcoderam :ram;
---- 密码存储区
signal encoderam :ram ;

输入数码时,这些临时的数码首先存入显示缓存区,并在数码管上进行同步显示。4位码输入结束后,再按下F2键,便将显示缓存区中的数码转存到解码存储区或密码存储区中。

1.5.3 密码匹配比较进程

该设计有3次解锁机会,每次在按下解锁键F5,输完4位密码后,再按下ENTER键,便会触发启动密码匹配进程。因为原始密码存在缓冲区encoderam中,解锁临时密码存在缓冲区breakcoderam中,只需判断encoderam和breakcoderam是否相等即可,相等则解锁成功,触发解锁信号使蜂鸣器有节奏播放一段时间。反之,触发蜂鸣器使之长鸣。两个寄存器中的数值比较结果会传递到密码锁控制进程,由密码锁控制进程来触发蜂鸣器。
需要说明的是,蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电 ,定时器等电子产品中作发声器件[14],内部结构如图1-12所示。


图1-12 常用蜂鸣器原理图

1.6 密码锁的设计输出

本密码锁采用4个共阴极数码管作为显示输出。输出的内容主要可分为:(1)必要的便于人机交互的界面;(2)密码数值输入显示。此外,还采用了蜂鸣器作为辅助输出。

1.6.1 数码管的位选控制进程

由于要求在不同的数码管上显示不同的数值,该设计中采用数码管动态显示方法。需要说明的是,动态显示的原理是:利用人的眼睛的视觉暂留特性,依次点亮各位数码管,循环让4位数码管显示,这样可以达到让不同数码管同时显示不同数值的效果。本文采用了具有自启动功能的状态机来实现数码管动态显示功能,具体到VHDL语法中,该设计则采用了“if-elsif-else”结构,对数码管进行位选,依次点亮数码管。
主要的vhdl代码是:

---定义部分---
----这里的变量count作为一个同步计数器;
;
---代码部分---
if rising_edge(sysclk)then
-----开发板上的晶振时钟信号-50MHZ
 then
-----该设计中每个数码管每次只连续显示了1ms;
count:=count+;
----shift是在结构体中定义的数码管位选信号,所以,现在点亮的    ----是左边最高位;
shift<=";
elsif count<= then
count:=count+; shift<=";
elsif count<= then
count:=count+; shift<=";
elsif count<= then
count:=count+; shift<=";
;
end if;
end if;

代码中的shift变量用于对数码管的为选进行赋值,起到轮流点亮的作用。

1.6.2 数码管的段选显示控制进程

  最后,进行输出模块的设计。输出模块的设计好坏直接影响到人机交互效果。所以,我们采取数码管动态显示的方式,多存储一些数码管显示的数据码,以提高显示的丰富性。当前很多开发板为了节省资源,对数码管部件的连线都采用了数据线共用机制[15]。开发板上共有4个数码管,每个数码管都有8根数据线、一根控制线。如果不采用数据线共用机制,则一共需要(8+1)×4=36根数据线,现在只需要8+4=12根数据线如图1-13所示。但是,这样就为我们进行动态显示增加了难度。我们拟采取的方法是,要利用人眼睛的视觉暂留效应,轮流让4位数码管点亮,形成视觉上的动态效果。

图1-13 数码管引脚原理图

  在该设计中输入数码时,数码首先在右边最低位暂时显示,按下ENTER键后,便“填充”到左边还未显示的最高位数码管上。该设计中显示缓存区coderam是作为每位数码管显示的数据来源。数组coderam(0 to 3)的从低到高四位数据正好对应位选shift的"0111"、"1011"、"1101"、"1110"。coderam(0 to 3)向每位数码管段选赋值时,也是采用了状态机的方法,循环对led(7 downtown 0)进行赋值。

1.6.3 数码管的译码显示控制进程

  要利用键盘的扫描码进行相应的显示,就需要一个能把扫描码转换成数码管段选显示的译码器。该设计中,这个译码器是通过vhdl语法中的“case-when”分支语句来实现的。

1.6.4 蜂鸣器控制进程

  蜂鸣器播放乐曲的功能,是通过对蜂鸣器引脚进行有规律地高低电平的赋值。重要的是把握好延时的节奏。该设计中,采用同步计数器实现此延时功能。
需要说明的是,计数器是用来累计时钟脉冲(CP脉冲)个数的时序逻辑部件。按CP脉冲输入方式,计数器分为同步计数器和异步计数器两种。
同步计数器:计数脉冲引到所有触发器的时钟脉冲输入端,使应翻转的触发器在外接的CP脉冲作用下同时翻转[7],如下图1-14所示。
异步计数器:计数脉冲并不引到所有触发器的时钟脉冲输入端,有的触发器的时钟脉冲输入端是其它触发器的输出,因此,触发器不是同时动作[7]。

图1-14 同步四位二进制加法计数器

2 系统开发流程

利用Xilinx ISE平台进行开发设计的流程,具体可分为四个步骤:即输入(Design Entry)、仿真(Simulate)、综合(Synthesis)、下载(Download)[16]。

2.1 设计输入

首先,在新建项目project时,输入项目名称(project name)和项目的目录(directory)。最重要的是,选择顶层设计模式(Top-level module type),因为本文采用vhdl语言进行设计,故在此处选择HDL模式如下图2-1-0所示。

图2-1-0 创建vhdl项目

2.1.1 ise平台设计输入方式选择的考量

在ise平台中,有硬件描述语言(HDL)和原理图,以及波形输入及状态机输入方法[17]。但是,这几种输入方式,有着不同的适用场合,设计人员在进行开发时,需要随机应变。下面就对这几种输入方式进行对比:
(1)原理图(Schematic):
原理图输入是一种常用的基本的输入方法,其是利用元件库的图形符号和连接线在ISE软件的图形编辑器中作出设计原理图,ISE中设置了具有各种电路元件的元件库,包括各种门电路、触发器、锁存器、计数器、各种中规模电路、各种功能较强的宏功能块等用户只要点击这些器件就能调入图形编辑器中[17]。
优点:直观、便于理解、元件库资源丰富[17]。
缺点:可维护性差,不利于模块建设与重用。当所选用芯片升级换代后,所有的原理图都要作相应的改动[17]。
原理图文件的创建细节,如下图2-1-1所示:


图2-1-1 原理图文件的创建

原理图文件的编辑窗口细节,如下图2-1-2所示:


图2-1-2 原理图文件的编辑窗口

(2)波形输入及状态机输入方法:
使用波形输入法时,只要绘制出激励波形的输出波形,ISE软件就能自动地根据响应关系进行设计;而使用状态机输入时,只需设计者画出状态转移图,ISE软件就能生成相应的HDL代码或者原理图。其中ISE工具包中的StateCAD就能完成状态机输入的功能[17]。
优点:直观、便于理解。
缺点:这两种设计方法只能在某些特殊情况下缓解设计者的工作量,并不适合所有的设计。
状态机文件的创建细节,如下图2-1-3所示:

图2-1-3 原理图文件的创建

状态机文件的编辑窗口细节,如下图2-1-4所示:

 图2-1-4 原理图文件的编辑窗口

(3)硬件描述语言(HDL):
通过VHDL或Verilog HDL来设计系统的功能。
优点:利于由顶向下设计,利于模块的划分与复用,可移植性好,通用性强,设计不因芯片的工艺和结构的变化而变化,更利于向ASIC的移植[17]。
缺点:比较复杂,不利于理解。
HDL文件的创建细节,如下图2-1-5所示:

图2-1-5 Hdl文件的创建

HDL文件的编辑窗口细节,如下图2-1-6所示:


图2-1-6 原理图文件的编辑窗口

2.1.2 ise平台设计输入属性设置

在进行fpga的开发时,因为程序是与硬件直接相关的,所以必须指定vhdl程序将来要运行的环境,如fpga所属的器件家族、具体的器件型号、封装的端口数目、速度等级等等。然后,在编译实现的过程的,ise会调入相应的硬件架构信息如图2-1-7所示,生成与平台相关的代码。这一属性设置,在ise中提供了十分便捷的操作方式,可以在创建项目时指定,也可以在后续的设计过程中重新指定,如图2-1-8所示。


图2-1-7 ise自带库文件列表


图2-1-8 ise修改硬件属性对话框

2.1.3 调用ise自带的vhdl程序语法功能

  当编写完程序之后,可以通过ISE中的Synthesis实现功能模块的check syntax选项,对程序进行语法检查。如下图2-1-9所示,在进行语法检查后,会产生相关的日志信息。

Started process "Check Syntax".
=========================================================================
* HDL Compilation *
=========================================================================
Compiling vhdl file C:/Xilinx/bin/first/main.vhd in Library work.
 - C:/Xilinx/bin/first/main.vhd Line . Unexpected symbol read: _.
 - C:/Xilinx/bin/first/main.vhd Line . parse error, unexpected IDENTIFIER, expecting COMMA or COLON
 - C:/Xilinx/bin/first/main.vhd Line . Undefined symbol 'f1_break'.
 - C:/Xilinx/bin/first/main.vhd Line . f1_break: Undefined symbol (last report in this block)
ERROR: XST failed
Process "Check Syntax" did not complete.

图2-1-9 ise在进行语法检查时生成的日志

2.1.4 ise平台下仿真测试

  本文采用的仿真平台是modelsim,需要说明的是,modelsim并非xilinx ise自带的一个组件,而是由第三方公司开发设计的。在xilinx环境中进行测试仿真时,有两种方式:通过配置ise自带的图形化工具,来自动产生测试代码;或者手工编写测试代码。前者在测试规模较小时,还是十分方便的。而当测试规模比较大时,就能力不足了。此时采用手工编写代码的方式较好。
图形化工具使用,需要创建testbechwaveform文件,如下图2-1-10所示。

2-1-10 创建testbechwaveform文件

在配置窗口中,先配置相关端口的时序如图2-1-11所示,然后运行modelsim得到仿真结果如图2-1-12所示。


图2-1-11 图形化测试工具配置界面

图2-1-12 modelsim运行结果

3 系统完整代码

  由于年代过于久远,代码的文本文件找不到了。

4 系统实现

在ise平台下,系统实现分为主要分为3个步骤:

4.1 查看实现报告

这项操作会生成实现的报告文件,其中涉及底层实现的部分细节如下图4-1-1所示。

图 4-1-1 高层实现的部分细节

4.2 查看系统RTL原理图

此项功能会生成由vhdl文件定义的系统原理图。生成的结果中不仅包含顶层模块的结构如下图4-2-1所示,还包含系统某些元器件的构成如图4-2-2所示。

图 4-2-1 顶层模块

图 4-2-2 元器件构成

4.3 硬件系统效果图

系统集成后的效果,如下图4-3-1所示。

图 4-3-1 硬件效果图

5 总结

  本文提出了以FPGA开发平台,进行密码锁小数字系统设计的一种方法。在实践过程中,可以加深对数字电路中的触发器、计数器、寄存器、状态机等概念的理解,也加深了对数字逻辑中“时序”概念的掌握。上述器件的功能都可以通过具体的vhdl程序来实现,再利用这些“器件”来搭建小型数字系统。还有,在进行数字系统的设计时,应当采用“由上而下”的设计方法,事先进行系统设计的行为功能描述,再构思各功能模块间的接口。并且,在进行具体的程序设计前,一定要把相关的技术背景资料准备好,如FPGA芯片的端口资源与存储资源。具体到本例中,还需要主机与键盘的PS/2接口通讯机制的资料。

参考文献
[1] mtxeleven.电子锁-百度百科[EB/OL]. http://baike.baidu.com/view/1863977.htm, 2012-04-09.
[2] ben_kasim.单片机-百度百科[EB/OL]. http://baike.baidu.com/view/1012.htm,
2012-04-13.
[3] 李升.单片机原理与接口技术[M].北京:北京大学出版社, 2011-7:2-7、56-80.
[4] 王爽.汇编语言[M].北京:清华大学出版社, 2008年.
[5] 张庆玲,杨勇.FPGA原理与实践[M].北京:北京航天航空大学出版社,2006年.
[6] 潘松. EDA技术实用教程[M].北京: 科学出版社, 2006年9月.
[7] 邢建平 等.VHDL程序设计教程[M]. 北京: 清华大学出版社, 2005年10月。
[8] 网站编辑等.键盘构造及工作原理-电子发烧友[EB/OL]. http://www.elecfans.com/ emb/jiekou/2009031129537.html, 2009年03月11日.
[9] 魏军辉 等.基于FPGA的PS/2键盘接口的设计[J].微计算机信息,2008年.
[10] 杨立. 微机原理与接口技术[M]. 天津: 天津大学出版社, 2010年01月.
[11] 陈曦. PS/2接口协议解析及用[EB/OL]. http://www.dzjs.net/html/zonghejishu/
2006/0901/513.html, 2006-09-01.
[12] 杨秀增 等.基于FPGA的标准PS/2键盘接口电路设计[J].南宁师范高等专科学校学报,2009年.
[13] 江晓安,董秀峰,杨颂华.数字电子技术[M].陕西:西安电子科技大学出版社,
2008年.
[14] 猪无为.蜂鸣器-百度百科[EB/OL]. http://baike.baidu.com/view/183969.htm,
2012-04-12.
[15] 刘明章.基于fpga的嵌入式系统设计[M]. 国防工业出版社, 2007-9-1.
[16] 王诚,薛小刚等编著.FPGA/CPLD设计工具Xilinx ISE使用详解[M].北京:人民邮电出版社,2005年.
[17] qingruxue. xilinx ise-百度百科[EB/OL]. http://baike.baidu.com/view/
1616079.htm, 2011-06-04.

致谢

(写得惨不忍睹,结论:不删,留着吧。)

  在此,向我的论文指导老师——官**老师,表达我的谢意与敬意。有时,在向官老师求教的过程中,他会十分耐心地跟你讲解知识,但并不是把内容直接告诉你,而是会指引你去获取知识的途径与方法。更多的时候,是在与官老师交流的过程中,他会把你当作自己的朋友,不仅谈学习上的事,也会谈生活上的事,让你受到启发。
还要向参考文献中涉及到的专著或论文的作者表达谢意,没有他们的劳动成果,我的论文完成时间可能要翻倍。
最后,感谢我的父亲,是他供养了我的大学开支。
回顾我的大学四年,每当学起技术来,总是磕磕绊绊。有时,自己想学习点东西,又总是浮于表面。总是把大部分时间,都吭哧吭哧花在读死书上,没有认真动手去实现过某个软件作品。曾经有一段时间,因为要完成老师的课程设计,我开了两个多星期的夜车。那段时间很累,也很充实,可这样的时刻在我的大学里毕竟太少了。有一次看到潘爱民老师的博客文章,发现他也在感叹时光的短暂、生命的虚度。现在社会中的诱惑确实太多了,如果不能抵制诱惑,时间总是会显得不够用。作为一名技术者,如果始终不能忍受那份孤独,心总是安静不下来,是很难持久坚持下去的。
当我处在大学校园的象牙塔内时,可以很随性地选择自己喜欢的技术来学习。但是在公司里,就没有这般自由了,公司里会有诸多的限制,往往选择一个技术方向,就要一直干下去。
这篇论文的诞生,也是正是由于自己的随性催生出来的。前段时间在写论文时,我总是会想起自己作为一名技术者,刚刚入门时的那份激动。那时,我会激动到吃饭时都在想着如何把设计完善得更好,激动到睡觉时都在想着如何解决程序上的BUG。现在想起来,那时的我是那么的可爱。

附录
附:键盘扫描码对应表

本文单独的权限声明:未经许可,严禁任何形式的转载。

基于VHDL利用PS2键盘控制的电子密码锁设计的更多相关文章

  1. ARM开发(3)基于STM32的矩阵键盘控制蜂鸣器

    一 矩阵键盘控制蜂鸣器原理:  1.1 本实验实现8*7矩阵键盘上按键控制蜂鸣器响.  1.2 实验思路:根据电路图原理,找出矩阵键盘行列所对应的引脚,赋予对应的按键值,然后控制蜂鸣器响.  1.3 ...

  2. [转]基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

    原文出处: https://blog.csdn.net/Forrest_Z/article/details/55002484 准备工作 1.下载串口通信的ROS包 (1)cd ~/catkin_ws/ ...

  3. 基于ROS和beaglebone的串口通信方式,使用键盘控制移动机器人

    一.所需工具包 1.ROS键盘包:teleop_twist_keyboard  2.ROS串口通讯包:serial $ cd ~/catkin_ws/src $ git clone https://g ...

  4. 50元制作PS2键盘无线监控装置

    0×00    什么是Arduino  Arduino实际上就是一种开发板,将微控制器和必需的元件集成在一块电路板上,扩展出完善的接口和针脚,就可以接上各种各样的传感器,完成你心中的设计,你也可以把它 ...

  5. Shiro入门之二 --------基于注解方式的权限控制与Ehcache缓存

    一  基于注解方式的权限控制 首先, 在spring配置文件applicationContext.xml中配置自动代理和切面 <!-- 8配置自动代理 -->    <bean cl ...

  6. 基于jQuery的数字键盘插件

    有时,我们需要在网页上使用软键盘.今天,就给大家带来一个基于jQuery的数字键盘插件,除了jQuery,不需要依赖任何文件资源.纯数字键盘,有退格,有清除,不支持输入小数(需要的可以自己改一下,主要 ...

  7. 基于数传电台的组态王控制实现远程采集控制器PLC

    「物联网应用案例」基于数传电台的组态王控制 一.案例介绍 采用亚控科技组态王结合亿佰特E90系列数传电台实现远程采集控制PLC.在这里主要介绍通信环境的搭建,故不采用过于复杂的控制程序,但为了体现控制 ...

  8. 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转

    今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...

  9. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

    package com.lw.HomeWork1;//包名 2 import java.util.Scanner; public class Demo18 { /** * @param args */ ...

随机推荐

  1. MyEclipse、IDEA常用快捷键

    一.MyEclipse快捷键 1. ctrl+shift+r:打开资源这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字 ...

  2. Intellij IDEA调试功能总结

    public class Demo { public static void f1() { System.out.println("one"); System.out.printl ...

  3. 【转】Git命令大全(非常齐全)

    $ git init  // 初始化一个Git仓库$ git status   // 查看仓库的状态$ git add .   // 将所有修改添加到暂存区$ git add *  // Ant风格添 ...

  4. 【LOJ】#2186. 「SDOI2015」道路修建

    题解 就是线段树维护一下转移矩阵 分成两种情况,一种是前面有两个联通块,一种是前面有一个联通块 从一个联通块转移到一个联通块 也就是新加一列的三个边选其中两条即可 从一个联通块转移到两个联通块 不连竖 ...

  5. mysql过滤数据

    1.大纲 WHERE - 学习如何使用WHERE子句根据指定的条件过滤行记录. AND运算符 - 介绍如何使用AND运算符以组合布尔表达式以形成用于过滤数据的复杂条件. OR运算符 - 介绍OR运算符 ...

  6. BeautifulSoup使用总结

    一.介绍 BeautifulSoup为一个python库,它可以接收一个HTML或XML的字符串或文件,并返回一个BeautifulSoup对象,之后我们可以使用BeautifulSoup提供的众多方 ...

  7. 使用Runnable接口创建线程

    实现Runnable接口的类必须使用Thread类的实例才能创建线程.通过Runnable接口创建线程分为两步: 1.将实现Runnable接口的类实例化. 2.建立一个Thread对象,并将第一步实 ...

  8. AWT事件模型

    1.什么是事件 1)事件------描述发生了什么的对象 [事件与异常类似,是由一个个类构成的,当一个事件产生的时候,实际上是由对应的那个事件的类来生成了一个对象,这个对象封装了与这个事件相关的信息, ...

  9. Android Intent Service

    Android Intent Service 学习自 Android 官方文档 https://blog.csdn.net/iromkoear/article/details/63252665 Ove ...

  10. 不同浏览器的userAgent

    一.IE浏览器 //IE6 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" //IE7 "Mozill ...