使用VHDL设计的FPGA数字密码锁系统

需积分: 9 0 下载量 89 浏览量 更新于2024-07-09 收藏 312KB PDF 举报
"FPGA实现数字密码锁.pdf" 本文档主要介绍了如何使用FPGA(Field-Programmable Gate Array)技术来实现一个基于VHDL语言的数字电子密码锁系统。该系统旨在解决传统锁具在安全性、便利性以及成本上的不足,特别是在公共场合的应用需求。传统的弹子锁已无法满足现代社会的防盗要求,而现有的电子密码锁大多基于单片机和分离元件,成本高且可靠性欠佳。 本课题的核心在于利用VHDL(Very High Speed Integrated Circuit Hardware Description Language)进行设计描述,通过EDA(Electronic Design Automation)技术在MAX+PLUS II工作平台上进行实现。设计的密码锁具备预设密码和错误输入报警功能,全部功能集成在一块FPGA芯片上,这不仅简化了系统架构,降低了硬件成本,还提升了系统的保密性和可靠性。采用FPGA的好处在于系统升级和改进的灵活性。 课题的实施过程分为多个阶段,包括教师课题申报、师生双向选择、毕业设计动员大会、毕业设计任务书下达、开题报告撰写和审查等,覆盖了2007-2008学年的两个学期。设计成果期望实现以下五个功能: 1. 数码输入:用户可逐位输入4位数字密码,每次输入后,已输入的数字会向左移位。 2. 数码清除:通过清除键,可删除所有已输入的数字,恢复初始状态“0000”。 3. 密码激活:按下特定键,将当前输入的4位数字设置为新的密码,使密码锁上锁。 4. 密码更改:允许用户输入新密码以替换原有密码。 5. 电锁解除:验证密码后解锁,如果输入正确,电锁开启;否则,锁保持关闭状态。 指导教师的意见虽未给出具体内容,但可以推测教师会关注设计的创新性、实用性以及技术的可行性,并对学生的工程实践能力和理论知识应用给予评价。 通过这个项目,学生不仅可以掌握FPGA设计的基本流程,还能深入了解VHDL语言在数字系统设计中的应用,同时在系统集成、优化和测试等方面得到锻炼。这样的设计成果对于提升学生的专业技能和实际工程经验具有很高的价值。
2011-04-04 上传
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY keys_lock IS PORT ( clk ,clr,status : IN STD_LOGIC ; selout : OUT STD_LOGIC_VECTOR (2 downto 0) ; key : IN STD_LOGIC_VECTOR (3 downto 0) ; segout : OUT STD_LOGIC_VECTOR (0 TO 6); locks,unlocks: OUT STD_LOGIC ); END keys_lock ; ARCHITECTURE doit of keys_lock IS signal counter1 : std_logic_vector(1 downto 0); signal counter : std_logic_vector(2 downto 0); signal counter2 : std_logic_vector(4 downto 0); signal dc0,dc1,dc2,dc3,lock0,lock1,lock2,lock3 : std_logic_vector(3 downto 0); signal dcc1 : std_logic_vector(4 downto 0); signal dcc : std_logic_vector(6 downto 0); signal d0,d1,d2,d3 : std_logic_vector(0 to 6); signal clk1,test,koff: std_logic; component decode PORT( ssin : in std_logic_vector(3 downto 0); ssout: out std_logic_vector(0 to 6) ); end component; begin test<=key(3) and key(2) and key(1) and key(0); P1: process(clr,clk) begin if(clr='0') then counter1<="00"; elsif(clk'event and clk='1') then counter1<=counter1+1; end if; end process P1; clk1<='0' when counter1<="01" else '1'; P2: process(clr,clk1,test) begin if(clr='0') then counter<="000"; elsif(clk1'event and clk1='1') then if(test='0') or (koff='0') then counter<=counter; else counter<=counter+1; end if; end if; end process P2; selout<=counter; dcc<=counter & key; P3: process(clk,test) begin if(clk'event and clk='0') then if(dcc="0001110") then dcc1<="00000"; elsif(dcc="0011110") then dcc1<="00001"; elsif(dcc="0101110") then dcc1<="00010"; elsif(dcc="0111110") then dcc1<="00011"; elsif(dcc="1101110") then dcc1<="00100"; elsif(dcc="1111110") then dcc1<="00101"; elsif(dcc="0001101") then dcc1<="00110"; elsif(dcc="0011101") then dcc1<="00111"; elsif(dcc="1001101") then