《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 设计应用 > 基于FPGA的电子密码锁的研制
基于FPGA的电子密码锁的研制
来源:微型机与应用2010年第16期
王显海, 贾金玲, 陈光建, 张海军, 于文军
(四川理工学院, 四川 自贡643000)
摘要: 介绍在QUATUSII环境下,采用FPGA可编程逻辑器件开发的电子密码锁,并利用状态机(FSM)实现键盘消抖及系统主控模块的行为控制,从实际工程设计角度阐述了系统所有模块及其工作原理、软件设计方法,提出了系统设计注意要点。研制中对主要模块的程序进行了仿真,并对整机系统进行了实测,表明其功能满足设计要求。
Abstract:
Key words :

摘  要: 介绍在QUATUSII环境下,采用FPGA可编程逻辑器件开发的电子密码锁,并利用状态机(FSM)实现键盘消抖及系统主控模块的行为控制,从实际工程设计角度阐述了系统所有模块及其工作原理、软件设计方法,提出了系统设计注意要点。研制中对主要模块的程序进行了仿真,并对整机系统进行了实测,表明其功能满足设计要求。
关键词: 密码锁; 状态机; FPGA; VHDL; QUATUSII

    随着社会物质财富的日益增长,安全防盗已成为人们所关注的焦点。然而传统机械弹子锁安全性低,密码量少且需时刻携带钥匙使其无法满足一些特定场合的应用要求,特别是在人员经常变动的公共场所,如办公室、宾馆、汽车、银行柜员机等地方。由于电子密码锁具有语音提示、防盗报警、易于系统升级与功能扩展的优势,越来越受到人们的青睐。目前使用的电子密码锁主要有两个方案:一是基于单片机用分立元件实现的,二是通过现代人体生物特征识别技术实现的,前者电路较复杂且灵活性差,无法满足应用要求;后者有其先进性但需考虑成本和安全性等诸多因素。基于此,本文设计了一种新型电子密码锁,采用FPGA芯片,利用先进的EDA技术、ALTERA公司的QUATUSII软件开发平台进行设计。系统采用VHDL硬件编程语言对系统建模,并利用状态机(FSM)实现对消抖电路及主控模块的设计[1]。
1 系统功能描述
    本设计主要实现以下六个功能:
    (1)初始密码设置:系统上电后输入4位数字并按“*”后密码设置成功系统进入上锁状态。为了实际需要,系统另设置了一个4位数的优先级密码,当用户忘记密码或被他人更改密码后,可以用优先级密码清除所设密码。
    (2)密码更改:为了密码安全及避免误操作,只能在开锁状态下先输入旧密码后才能更改系统密码,然后输入4位新密码后按“*”。
    (3)解锁:输入密码或优先级密码后按“#”,系统即解锁。
    (4)密码保护:密码输入错误时,系统自动记录一次错误输入,当错误输入次数等于3次时,系统报警并使键盘失效5分钟,以免密码被盗。
    (5)清除输入错误:当输入数位小于4位时可以按“*”清除前面所有的输入值,清除为“0000”。
    (6)系统复位:按“*”和“#”后系统即复位到初始状态。考虑到实际情况,系统只在密码更改状态和系统初始状态下才能复位。
2 系统设计思路
    本文采用自顶向下的模块化设计方法,先对系统级进行功能描述,再进行功能模块的划分,最后分别对各个子模块进行VHDL建模。所设计的电子密码锁系统结构如图1所示。  

2.1 时钟产生模块
    此模块主要功能是产生时钟信号和键盘扫描信号。主要产生三个时钟信号(16 Hz、64 Hz、100 kHz),分别为系统各个功能模块提供时钟驱动信号。其中键盘扫描模块包括在时钟产生模块中,用来产生扫描信号。由于要产生多个时钟信号,因此该模块的VHDL程序分别用三个进程来处理。
 密码输入一般采用机械式和触摸式两种键盘。由于机械式键盘具有成本低、结构简单、可靠性高、应用广泛等优点,本设计采用机械式3×4键盘矩阵。其按键分布及键值编码如图2所示。其中‘*’、‘#’为多功能组合键。键盘扫描电路用来产生扫描信号KH[3..0],其按照1110-1101-1011-0111...的规律循环变化,并通过KC[2..0]来检测是否有键按下。例如,当扫描信号为1011时,键6、7、8所对应的行为低电平,此时若8键被按下,则KC2为低电平,KC[2..0]输出为011。如果没有键被按下,则KC[2..0]输出为111。其他键也是类似原理。特别值得注意的是键盘扫描电路扫描时钟的确立,如果扫描时钟不合适,将产生键按下时反应太慢,或KC[2..0]产生错误的输出。一般为20 Hz,本设计通过实验证明扫描时钟取16 Hz较为合适。

2.2 按键消抖模块
    本设计采用机械键盘,其缺点是易产生抖动,因此键盘输出KC[2..0]必须经过消抖电路后才能加入到键盘编码模块,以避免多次识别。此模块采用状态机设计,其状态转换图如图3所示。只有当连续检测到3次低电平输入,模块才输出一次低电平。消抖电路的时钟选择很关键,选择不当则不能正常工作。因为键盘扫描电路的时钟是16 Hz且扫描信号为4组循环输出,所以消抖电路要能够在4个键盘扫描时钟内检测出是否有键按下就必须设置其时钟信号至少为键盘扫描时钟的4倍。本设计采用64 Hz作为消抖模块的时钟驱动信号,实验证明能达到设计要求。

2.3 键盘编码模块
    上述的键盘中可分为数字键和功能键,其中数字键用来输入数字,但键盘所产生的信号KC[2..0]并不能直接用于键盘输入处理模块,因此必须由键盘编码电路对数字按键的输出形式进行规划。同时多功能键‘*’、‘#’也分别被规划为“1010”和“1011”。另外,在系统规划时,也将系统复位电路规划在此模块内,复位信号是由键盘编码模块和系统主控模块输出的系统复位辅助信号mm共同作用产生,从而实现只能在密码更改状态和系统初始状态下才能进行系统复位,确保系统安全可靠。
2.4 按键输入处理模块
    按键输入处理模块用来储存每次按键产生的值,以免覆盖前面输入的数据,此模块使用串行移位寄存器对依次输入的4位十进制数字进行存储。按键输入超过4位时,后面的输入将被忽略。
2.5 显示模块
    为了节省I/O管脚和芯片内部资源,本设计采用动态扫描的方法进行显示。模块用100 kHz时钟信号和人眼的视觉暂留效应使4位数码管看起来像是同时点亮。图4是根据VHDL代码所绘制的显示模块框图。其中多路数据选择器是由按键次数(NC)控制选择哪一个数码管和哪一组输入数据。

2.6 系统主控模块
    此模块是系统的核心控制模块,系统的所有控制行为都是由它完成的,采用状态机(FSM)来描述系统的控制行为。由于多进程编程状态机的输出是由组合电路发出的,因此在一些特定情况下容易产生毛刺现象。如果这些输出信号被用作时钟信号,则极易产生错误的驱动。因此本设计采用单进程来实现状态机,其优势是由时序器件同步输出,输出信号不会出现毛刺现象,从而很好地避免了竞争冒险的发生。缺点是与多进程状态机相比,输出信号要晚一个时钟周期[2]。通过反复试验在VHDL编程时将输出信号与状态转换同步进行,从而很好地解决了输出信号滞后的问题。图5为主控模块的状态转换图。其中S0为系统上电初始化状态,也是系统复位后所转入的状态。此状态下系统未设置密码。本设计设置S0状态的另一主要原因是考虑到一个完备的状态机(健壮性强)应该具备初始化状态和默认状态。当芯片加电或者复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态。但需要强调的是,大多数FPGA有GSR(Global Set/Reset)信号,当FPGA加电后,GSR信号拉高,对所有的寄存器,RAM等单元复位/置位,这时配置于FPGA的逻辑并未生效;不能保证正确地进入初始化状态。所以使用GSR企图进入FPGA的初始化状态,常常会产生种种不必要的麻烦[3]。S1为上锁状态,S2为解锁状态,S3为解锁错误次数记录状态,S4为系统报警状态,S5为开锁状态,S6为密码更改状态。以S5状态为例给出S5状态的VHDL代码:
    When s5=>
        clr_nc<=‘0’;
        MMA<=‘0’;
        ED<=‘1’;
        EA<=‘1’;
        EB<=‘1’;
        alarma<=‘0’;
        unen_keya<=‘0’;
        if NC=4 and keyout_fun="1011" then
            if REGS=ACC or PW=ACC then
                states<=s1;
                clr_nc<=‘1’;
            else
                clr_nc<=‘1’;
            end if;
        elsif NC=4 and keyout_fun="1010" then
        --transfer to the state of changing PW-
            if REGS=ACC or REGS<=PW then
        --after entering the right previous PW.
            states<=s6;
            clr_nc<=‘1’;
        else
            clr_nc<=‘1’;
        end if;
    end if;

3 主要功能模块的仿真
    图6是键盘编码模块的时序仿真图。其中信号mm是主控模块,用来限制复位条件,即只在S0和S6状态下产生复位信号RR;信号rst_key和unen_key共同控制键盘,也是来自主控模块;sn是模块输出信号,为高电平时表示有数字键被按下;sf为高电平时表示有功能键被按下。从仿真图上可知,模块设计满足要求。

 图7是主控模块的时序仿真图。其中信号NC等于4表示连续输入了4个数字,信号nn记录密码输入错误次数。由图可知,系统初始状态为S0,设置密码后为S1,经过3次输入错误的密码时系统进入S4,再输入密码后返回S1。在S1时输入密码后经过S2进入开锁状态S5,再输入密码后则进入密码更改状态S6,然后设置新密码,设置成功后返回S1,满足系统设计要求。在S6时,系统新密码要在S5转入S6后的下一时钟上升沿时才被系统接受,这主要是因为在S5转S6状态时需要输入旧密码或优先级密码进行确认的原故。在工程实践中,考虑到实际按键要比系统时钟慢,所以在此期间,不可能输入4位数字,因而系统不会出现密码遗漏的问题。而其他状态下,输出信号与状态转换是一致的,这样就克服了输出信号比多进程晚一个时钟周期的缺点。

    本文介绍了在FPGA可编程逻辑器件上利用状态机(FSM)实现的电子密码锁,从实际工程设计角度阐述了其工作原理、系统结构、软件设计方法、系统调试及设计注意点。实现了对密码设置、密码更改、上锁、解锁、密码防盗报警等功能。文中对主要模块的程序进行了时序仿真,并在FPGA(EP1C6Q240C8)上下载实现,仿真与实测结果都表明该密码锁满足功能设计要求,且系统工作稳定。此电子密码锁是以实际需求为出发点来完成研制的,具有很好的实用价值和市场前景。
参考文献
[1]  吴海涛,梁迎春.基于状态机的语音电子密码锁设计[J]. 电子工程师,2007,33(4):78-80.
[2]  潘松,黄继业. EDA技术与VHDL[M]. 北京:清华大学出版社,2005.7
[3]  EDA先锋工作室,吴继华,王诚.Altera FPGA/CPLD设计(高级篇)[M].北京:人民邮电出版社,2005.7

此内容为AET网站原创,未经授权禁止转载。