FPGA根据verilogHDL的密码锁
4位数字密码锁毕业设计

4位数字密码锁毕业设计华中科技大学文华学院毕业设计(论文)题目:4位数字密码锁设计(密码设置及验证电路)学生姓名:学号:学部(系):信息科学与技术学部专业年级: 08通信工程指导教师:陈超原职称或学位:摘要:本设计利用FPGA作为核心控制板,用Verilog 硬件描述语言进行编程,利用计算机软硬件控制技术,设计一个基于FPGA的数字密码锁,能实现密码设定(如果密码没设定则默认密码为0000),密码输入及验证,当密码输入错误时报警或则指示灯亮;反之,密码输入正确时,另外一个指示灯亮。
将程序下载到Altera公司的Cyclone系列目标芯片EP2C5T144C8上调试通过,并观察实际现象,满足设计要求。
关键词:FPGA Verilog 数字密码锁AbstractThe design using the FPGA as the core of the control panel, Verilog hardware description language for programming, Computer hardware and software control technology, design an FPGA-based digital code lock, Set the password(if the password is not set then the default password is 000000), Password input and verification, Alarm or the light when the password input error; On the contrary, enter the correct password , a light. Program downloaded to the target chip EP2C5T144C8 Altera’s Cyclone series through debugging , and to observe the actual phenomenon , to meet the design requirements.Keywords: FPGA Verilog Digital code lock引言随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐,电子密码锁的使用体现了人们消费水平、保安意识和科技水平的提高,而且避免了携带甚至丢失钥匙的麻烦。
基于FPGA的电子密码锁设计

基于FPGA的电子密码锁设计汪浩;陈学英【摘要】设计并实现了一种基于FPGA的电子密码锁,具有解锁、报警、修改密码、死锁等功能。
利用FPGA器件本身具有的并行性和其逻辑电路的本质,实现了高效、可靠的密码锁设计;采用基础电路加模式控制的设计方法,得到了简单稳定且低冗余的电路结构,节省了逻辑资源;提出了一种冗余编码结合掩码加密的硬件加密方法,使得开锁密码在对外部密码存储器读写的过程中难以被泄露,提高了密码锁的安全性。
结果表明,设计的电子密码锁具有稳定高效、简单可靠、安全性高等优点。
%The electronic password lock based on FPGA was designed and implemented. It possesses the functions of un-locking,alarming,password changing and deadlocking. An efficient and reliable password lock was realized by taking the ad-vantages of parallelism and the logic circuit essence of FPGA. A simple,stable and low redundancy circuit structure was achieved with the design method of basis circuit and mode control,which reduced the consumption of logical resource. A hard-ware encryption method of combining redundant coding with mask encryption is proposed,which makes it much more difficult to leak the password during the process of reading or writing the extern password memory,and makes the security of password lock enhanced. The result shows that the electronic password lock possesses the advantages of high-stability,briefness,high-efficiency, high-reliability and high-security.【期刊名称】《现代电子技术》【年(卷),期】2014(000)019【总页数】3页(P157-159)【关键词】FPGA;电子密码锁;模式控制;冗余编码;掩码加密【作者】汪浩;陈学英【作者单位】电子科技大学,四川成都 610054;电子科技大学,四川成都610054【正文语种】中文【中图分类】TN97-34随着人们生活水平的提高,对密码锁的可靠性和安全性也提出了更高的要求。
彭胜-基于VHDL的电子密码锁设计与实现正文

1 引言电子密码锁的使用体现了人们消费水平、保安意识和科技水平的提高,而且避免了携带甚至丢失钥匙的麻烦。
目前设计密码锁的方法很多,例如用传统的PCB 板设计、用PLC 设计或者用单片机设计。
而用V HDL 可以更加快速、灵活地设计出符合各种要求的密码锁,优于其他设计方法,使设计过程达到高度自动化。
本设计在Max + plus Ⅱ的环境中进行,用Al2tera 公司ACEX 1 K系列的EP1 K30 TC14423 来实现。
ACEX 1 K是Altera 公司着眼于通信、音频处理及类似场合的应用而推出的FPGA 器件芯片系列,其典型门数为10 万门,是当今Altera 多种产品中应用前景最好的器件系列之一。
EDA 技术设计电子系统具有用软件的方式设计硬件;设计过程中可用有关软件进行各种仿真,系统可现场编程、在线升级,整个系统可集成在一个芯片上等特点;不但设计周期短、设计成本低,而且将提高产品或设备的性能,缩小产品体积、提高产品的技术含量,提高产品的附加值。
用VHDL设计电子密码锁方案:作为通用电子密码锁,主要由 3 个部分组成:数字密码输入电路、密码锁控制电路和密码锁显示电路,作为电子密码锁的输入电路。
可供选择的方案有数字机械式键盘和触摸式数字键盘等多种。
(1)密码锁输入电路包括时序产生电路、键盘扫描电路、键盘弹跳消除电路、键盘译码电路等几个小的功能电路。
(2)密码锁控制电路包括按键数据的缓冲存储电路,密码的清除、变更、存储、激活电锁电路(寄存器清除信号发生电路),密码核对(数值比较电路),解锁电路(开/关门锁电路)等几个小的功能电路。
(3)七段数码管显示电路主要将待显示数据的BCD码转换成数码器的七段显示驱动编码。
1.1 课题背景随着社会的发展和人们生活水平的提高,人们的安全意识也逐步加强。
传统的机械锁由于其构造的简单,失效的事件屡见不鲜,如何实现保密防盗这一问题变的尤其的突出,密码锁以其安全性高、成本低、功耗低、易操作等优点受到越来越多人的欢迎。
FPGA和Verilog设计中的latch锁存器的问题

FPGA和Verilog设计中的latch锁存器的问题一直都知道fpga中有latch这么一回事,但是一直都不太清楚到底什么是锁存器,它是怎么产生的,它到底和寄存器有多少区别,它怎么消除。
为什么说他不好?一,是什么锁存器是一种在异步时序电路系统中,对输入信号电平敏感的单元,用来存储信息。
一个锁存器可以存储1bit的信息,通常,锁存器会多个一起出现,如4位锁存器,8位锁存器。
锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用。
因此,锁存器也被称为透明锁存器,指的是不锁存时输出对于输入是透明的。
二锁存器与寄存器的区别:两者都是基本存储单元,单锁存器是电平触发的存储器,触发器是边沿触发的存储器。
本质是,两者的基本功能是一样的,都可以存储数据。
意思是说一个是组合逻辑的,一个是在时序电路中用的,时钟出发的。
三,锁存器的危害:对毛刺敏感,不能异步复位,所以上电以后处于不确定的状态;Latch会使静态时序分析变得非常复杂;在PLD芯片中,基本的单元是由查找表和触发器组成的,若生成锁存器反而需要更多的资源。
第三条也是最基本的原因。
四,产生的原因********ps重重之重上面说了那没多只是觉得网上的没把锁存器说明白。
下面的才是重点。
1,case2,if-------else if3,always@(敏感信号表)五解决1.case——————加default:关于defalut的情况:一是可以default:data=1‘bx;这个x表示未知,在综合时可以避免产生锁存器。
在仿真时是红线表示。
二是default:data=0;这样产生一个默认的情况。
2.if-----------------------一定要有else语句。
3.always---------如是说道:在赋值表达式右边参与赋值的信号都必须在always@(敏感电平列表)中列出。
如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,那么在综合时,将会为该没有列出的信号隐含地产生一个透明锁存器。
fpga加密方法

fpga加密方法
FPGA(现场可编程门阵列)的加密方法主要有以下几种:
1. 自带加密功能的FPGA:一些FPGA供应商在其产品中集成了加密功能,如Xilinx的Virtex-2~5系列和ALtera的Stratix II~III系列。
这些FPGA 使用特定的加密算法,如DES或AES,对程序进行加密。
当程序被加载到FPGA内部的SRAM时,会被解密并执行。
这种方法的安全性较高,但需要使用特定系列的FPGA。
2. 在系统中增加可加密的MCU:对于没有自带加密功能的FPGA,可以在系统中增加一个可加密的MCU。
用户可以根据自己的需求编写加密算法,对FPGA程序进行加密。
加密后的程序被下载到Flash中,然后由MCU将其解密并加载到FPGA的SRAM中运行。
这种方法提供了更大的灵活性,但需要编写额外的加密和解密代码。
3. 使用DNA功能:某些FPGA芯片具有DNA功能,即每个芯片都有独特的序列号。
这种功能可以在设计中用于增加安全性,例如通过将序列号用于加密算法中,使得每个芯片的加密密钥都是唯一的。
这种方法可以在一定程度上防止程序被复制或克隆。
需要注意的是,无论采用哪种加密方法,都需要确保加密算法的安全性,并采取适当的措施来保护密钥和敏感数据。
同时,加密和解密操作可能会增加系统复杂性和功耗,因此在设计时应权衡利弊。
FPGA基于verilog HDL的密码锁

EDA课程设计课设名称:密码锁课设日期: 2014。
6。
23——7。
5 姓名:陈飞学号:110250101哈尔滨工业大学(威海)信电学院电子信息工程2014。
6一。
所用软件与硬件介绍1。
1所用软件介绍QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用TCL脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点.QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对MaxplusII 的更新支持,QuartusII 与之相比不仅仅是支持器件类型的丰富和图形界面的改变.Altera在QuartusII 中包含了许多诸如SignalTapII、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC 和HardCopy设计流程,并且继承了MaxplusII 友好的图形界面及简便的使用方法.1.2所用硬件介绍硬件的总体设计:故由上图,将整个硬件电路部分主要分成五个部分,即:FPGA电路设计,数码管显示驱动电路设计,温度传感器电路设计,报警电路设计,键盘矩阵控制电路设计。
基于fpga的数字密码锁(使用矩阵键盘)

基于FPGA 数字密码锁板子使用的是DE2顶层topmodule lock(reset,clk,row,col,mm0,mm1,mm2,mm3,led1,led2,led3,set_flog); input clk,reset;input [3:0]row;output wire [3:0] col;output wire [6:0] mm0,mm1,mm2,mm3;output reg led1, led2,led3;wire [3:0]key_value;reg [3:0] temp_key;reg [3:0] m0,m1,m2,m3;reg [3:0] m_0,m_1,m_2,m_3;reg [5:0] state;reg [2:0] wei;wire key_valid;reg [1:0]count_wrong;output reg set_flog;parameter valid =6'b000000,set =6'b000001,collection_mm =6'b000010,cmd =6'b000100,collection =6'b001000,wrong =6'b010000,correct =6'b100000,die_lock =6'b000011,lock =6'b000111;always @(posedge clk or negedge reset)beginif(!reset)beginstate<=6'b000000;wei<=0;led3<=0;set_flog<=0;led1<=0;led2<=0;m0<=15;m1<=15;m2<=15;m3<=15;endelse begincase(state)valid :if(key_valid)begintemp_key<=key_value;state<=collection;endelsestate<=valid;collection : beginif(key_value>=0&&key_value<=9)beginif(led1&&(!set_flog))//开启状态不能按数字键state<=valid;else if((!key_valid)&&(wei<5))beginled2<=0;state<=collection_mm;wei<=wei+1'b1;endelsestate<=collection;endelseif(!key_valid)state<=cmd;endcollection_mm: begincase(wei)1:m0<=temp_key;2:m1<=temp_key;3:m2<=temp_key;4:m3<=temp_key;endcasestate<=valid;endcmd : begincase(temp_key)15:if(!led1)beginm0<=15;m1<=15;m2<=15;m3<=15;//*clearstate<= valid;wei<=0;led2<=0;led1<=0;endelsestate<= valid;14:if(led1)state<= valid;else if(wei) //back deletebegincase(wei)1:m0<=15;2:m1<=15;3:m2<=15;4:m3<=15;endcasewei<=wei-1'b1;state<=valid;led2<=0;endelsestate<=valid;13: if(set_flog)//保存密码beginset_flog<=0;led1<=0;m_0<=m0;m_1<=m1;m_2<=m2;m_3<=m3;state<=lock;endelseif((m0==m_0)&&(m1==m_1)&&(m2==m_2)&&(m3==m_3))//comparebeginstate<=correct;m0<=15;m1<=15;m2<=15;m3<=15;endelse beginstate<=wrong;count_wrong<=count_wrong+1;end12: state<=lock;10: if(led1) //setbeginset_flog<=1;wei<=0;m0<=15;m1<=15;m2<=15;m3<=15;state<=valid;enddefault:state<=valid;endcaseendcorrect :begin //openled1<=1;state<=valid;count_wrong<=0;endwrong :beginled2<=1;state<=valid;led1<=0;if(count_wrong==3) //lock diebegincount_wrong<=0;state<=die_lock;endendlock :beginled1<=0;wei<=0;led2<=0;m0<=15;m1<=15;m2<=15;m3<=15;set_flog<=0;state<=valid;enddie_lock:led3<=1;endcaseendendwire [15:0] mm={m3,m2,m1,m0};key key_scan(reset,clk,row,col,key_value,key_valid);display dis_u1(clk,mm,mm3,mm2,mm1,mm0);endmodule键盘扫描模块module key(reset,clk,row,col,key_value,key_flag);input clk,reset;input [3:0] row;//hangoutput reg [3:0] col;//lieoutput reg [3:0] key_value;output reg key_flag;reg [3:0] row_reg;reg [3:0] col_reg;reg [19:0] count;reg [2:0] state;reg clk_500khz;always @(posedge clk or negedge reset)if(!reset) beginclk_500khz<=0;count<=0;endelseif(count>=5000) begin clk_500khz<=~clk_500khz;count<=0;end else count<=count + 1'b1;always @(posedge clk_500khz or negedge reset)beginif(!reset)begin col<=0;state<=0;row_reg<=0;col_reg<=0;end elsebegincase(state)0:begincol<=0;key_flag<=0;if(row[3:0]!=4'b1111)beginstate<=1;col[3:0]<=4'b1110;endelse state<=0;end1: if(row[3:0]!=4'b1111) state<=5;else begin state<=2;col<=4'b1101;end2: if(row[3:0]!=4'b1111) state<=5;else begin state<=3;col<=4'b1011;end3: if(row[3:0]!=4'b1111) state<=5;else begin state<=4;col<=4'b0111;end 4: if(row[3:0]!=4'b1111) state<=5;else state<=0;5: if(row[3:0]!=4'b1111)begincol_reg<=col;row_reg<=row;state<=5;key_flag<=1;endelsestate <=0;endcaseendendalways@(clk or col_reg or row_reg or key_value)beginif(!reset)key_value<=0;else if(key_flag==1'b1)begincase({col_reg,row_reg})8'b1110_1110:key_value<=1;8'b1110_1101:key_value<=2;8'b1110_1011:key_value<=3;8'b1110_0111:key_value<=10;//a8'b1101_1110:key_value<=4;8'b1101_1101:key_value<=5;8'b1101_1011:key_value<=6;8'b1101_0111:key_value<=11;//b8'b1011_1110:key_value<=7;8'b1011_1101:key_value<=8;8'b1011_1011:key_value<=9;8'b1011_0111:key_value<=12;//c8'b0111_1110:key_value<=15;//*8'b0111_1101:key_value<=0;8'b0111_1011:key_value<=14;//#8'b0111_0111:key_value<=13;//d endcaseendendendmodule显示模块module display(clk,mm,wei0,wei1,wei2,wei3); input [15:0]mm;input clk;output reg [6:0] wei0,wei1,wei2,wei3;always @(clk)begincase(mm[3:0])4'b0000:wei0<=7'b 1000000;4'b0001:wei0<=7'b 1111001;4'b0010:wei0<=7'b 0100100;4'b0011:wei0<=7'b 0110000;4'b0100:wei0<=7'b 0011001;4'b0101:wei0<=7'b 0010010;4'b0110:wei0<=7'b 0000010;4'b0111:wei0<=7'b 1111000;4'b1000:wei0<=7'b 0000000;4'b1001:wei0<=7'b 0011000;4'b1010:wei0<=7'b 0001000;4'b1011:wei0<=7'b 0000011;4'b1100:wei0<=7'b 1000110;4'b1101:wei0<=7'b 0100001;4'b1110:wei0<=7'b 0000110;4'b1111:wei0<=~7'b 1000000;//4'b1111:wei0<=7'b 0001110;endcasecase(mm[7:4])4'b0000:wei1<=7'b 1000000;4'b0001:wei1<=7'b 1111001;4'b0010:wei1<=7'b 0100100;4'b0011:wei1<=7'b 0110000;4'b0100:wei1<=7'b 0011001;4'b0101:wei1<=7'b 0010010;4'b0110:wei1<=7'b 0000010;4'b0111:wei1<=7'b 1111000;4'b1000:wei1<=7'b 0000000;4'b1001:wei1<=7'b 0011000;4'b1010:wei1<=7'b 0001000;4'b1011:wei1<=7'b 0000011;4'b1100:wei1<=7'b 1000110; 4'b1101:wei1<=7'b 0100001; 4'b1110:wei1<=7'b 0000110; 4'b1111:wei1<=~7'b 1000000; //4'b1111:wei1<=7'b 0001110; endcasecase(mm[11:8])4'b0000:wei2<=7'b 1000000; 4'b0001:wei2<=7'b 1111001; 4'b0010:wei2<=7'b 0100100; 4'b0011:wei2<=7'b 0110000; 4'b0100:wei2<=7'b 0011001; 4'b0101:wei2<=7'b 0010010; 4'b0110:wei2<=7'b 0000010; 4'b0111:wei2<=7'b 1111000; 4'b1000:wei2<=7'b 0000000; 4'b1001:wei2<=7'b 0011000; 4'b1010:wei2<=7'b 0001000; 4'b1011:wei2<=7'b 0000011; 4'b1100:wei2<=7'b 1000110; 4'b1101:wei2<=7'b 0100001; 4'b1110:wei2<=7'b 0000110; 4'b1111:wei2<=~7'b 1000000; //4'b1111:wei2<=7'b 0001110; endcasecase(mm[15:12])4'b0000:wei3<=7'b 1000000; 4'b0001:wei3<=7'b 1111001; 4'b0010:wei3<=7'b 0100100; 4'b0011:wei3<=7'b 0110000; 4'b0100:wei3<=7'b 0011001; 4'b0101:wei3<=7'b 0010010; 4'b0110:wei3<=7'b 0000010; 4'b0111:wei3<=7'b 1111000; 4'b1000:wei3<=7'b 0000000; 4'b1001:wei3<=7'b 0011000; 4'b1010:wei3<=7'b 0001000; 4'b1011:wei3<=7'b 0000011; 4'b1100:wei3<=7'b 1000110; 4'b1101:wei3<=7'b 0100001; 4'b1110:wei3<=7'b 0000110; 4'b1111:wei3<=~7'b 1000000; //4'b1111:wei3<=7'b 0001110; endcaseend endmodule。
EDA技术及应用—基于FPGA的电子系统设计:基于Verilog hdl的数字电路设计

10100
1111
15
10101
8421BC 余三码 D码
0000
0011
0001
0100
0010
0101
0011
0110
0100
0111
0101
1000
0110
1001
0111
1010
1000
1011
1001
1100
-
-
-
-
-
-
-
-
-
-
-
-
4位格雷码
0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000
4'b0011:a_to_g=7'b1111001; //显示3
4'b0100:a_to_g=7'b0110011; //显示4
4'b0101:a_to_g=7'b1011011; //显示5
4'b0110:a_to_g=7'b1011111; //显示6
4'b0111:a_to_g=7'b1110000; //显示7
4: y= {d[2:0],d[3]}; // rol
5: y= {d[3],d[3:1]}; // asr
6: y= {d[1:0],d[3:2]}; // ror2
7: y= d;
// noshift
default: y = d;
图6-2 基本门电路仿真结果
综合结果如图6-3所示。
图6-3 基本门电路综合结果
2、 三态逻辑电路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA课程设计课设名称:密码锁课设日期: 2014.6.23——7.5 姓名:陈飞学号:110250101哈尔滨工业大学(威海)信电学院电子信息工程2014.6一. 所用软件与硬件介绍1.1所用软件介绍QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用TCL脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对MaxplusII 的更新支持,QuartusII 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。
Altera在QuartusII 中包含了许多诸如SignalTapII、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII 友好的图形界面及简便的使用方法。
1.2所用硬件介绍硬件的总体设计:故由上图,将整个硬件电路部分主要分成五个部分,即:FPGA电路设计,数码管显示驱动电路设计,温度传感器电路设计,报警电路设计,键盘矩阵控制电路设计。
I.FPGA芯片的介绍在本次课程设计中选用Altera公司Cyclone II系列FPGA器件。
Altera公司2004年推出了新款Cyclone II系列FPGA器件。
Cyclone II FPGA 的成本比第一代Cyclone器件低30%,逻辑容量大了三倍多,可满足低成本大批量应用需求。
随着低复杂度FPGA器件成本的不断下降,具有灵活性和及时面市优势的FPGA与ASIC相比更有竞争性,在数字消费市场上的应用也急剧增加。
第一代Cyclone系列迄今发售了3百多万片,在全球拥有3,000多位客户,对大批量低成本数字消费市场有着巨大的影响,该市场消纳了三分之一的器件。
同时,Cyclone II器件系列也在电信、计算机外设、工业和汽车市场上获得了巨大的进步。
Cyclone II器件包含了许多新的特性,如嵌入存储器、嵌入乘法器、PLL和低成本的封装,这些都为诸如视频显示、数字电视(DTV)、机顶盒(STB)、DVD播放器、DSL调制解调器、家用网关和中低端路由器等批量应用进行了优化。
Cyclone II器件采用TSMC90nm低K绝缘材料工艺技术,这种技术结合Altera 低成本的设计方式,使之能够在更低的成本下制造出更大容量的器件。
这种新的器件比第一代Cyclone产品具有两倍多的I/O引脚,且对可编程逻辑,存储块和其它特性进行了最优的组合,具有许多新的增强特性低成本的配置器件编辑Altera为配置Cyclone II FPGA提供了低成本的串行配置器件。
这些串行配置器件定价为批量应用,成本是相应Cyclone II FPGA的10%。
四个串行配置器件(1Mbit,4Mbit,16Mbit和64Mbit)提供了节省空间的8脚和16脚SOIC封装。
器件中任何不用于配置的存储器可用于一般存储,进一步增强其价值。
IP编辑Altera也为Cylcone II器件客户提供了40多个可定制IP核,Altera和Altera Megafunction伙伴计划(AMPPSM)合作者提供的不同的IP核是专为Cyclone II架构优化的,包括:Nios II嵌入式处理器;DDR SDRAM控制器;FFT/IFFT;PCI编译器;FIR编译器;NCO编译器;POS-PHY编译器;Reed Solomon 编译器;Viterbi编译器等等。
II.数码管显示器液晶显示器按其功能可分为三类,笔段式液晶显示器,字符点阵式液晶显示器和图形点阵式液晶显示器。
前两种可以显示数字,字符,符号等。
而图形点阵式液晶显示器还可以显示汉子和任意图形,达到图文并茂的鲜果。
在本课程设计中,受到试验箱的限制,在这里使用的是基本的数码管显示。
当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。
如:显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。
LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。
小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。
发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。
常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
二.系统设计2.1设计思想2.1.1课题背景众所周知,随着科学技术的发展,以及数字电路的各种产品广泛应用,传统意义上的机械锁应用领域有限,且方便性不高。
由于其构造简单,多数采用物理性结构且多数有常识的人对其构造了如指掌,安全性不高。
相对机械锁,电子密码锁其保密性高,使用灵活性好,安全系数高,可实时改变其密码,使用极其方便,在当今社会得到了极其广泛的应用,也将是未来发展的趋势。
本设计使用EDA设计,使设计过程得到高度自动化,其具有强大的设计、测试、仿真分析、管理等功能。
使用EDA环境完成电路的系统综合设计和仿真。
在数字信息技术高速发展的今天,越来越多的地方需要电子密码锁来进行信息的加密与保密,而这种功能是传统机械锁无法实现的,因此,电子密码锁的设计越来越重要。
其设计直接关系到其使用的安全性,灵活性,实用性,以及用户体验。
所以,在这个背景下,学会和掌握密码锁的设计是尤其重要的,而且要在这个基础上,不断提高其灵活,实用,及用户体验性。
2.1.2设计目的1.以往机械锁使用繁琐,安全性低,灵活性差,应用领域有限。
而密码锁可以应用于各个领域,如电子产品的保密,系统程序的保密等各种数字信息产品的加密保密。
还可通过外接物理系统,取代传统机械锁,应用于日常生活的方方面面,例如最基本的门锁。
可以说电子密码锁功能强大,安全性高,灵活性强,必将是未来发展的趋势。
本设计基于Verilog HDL语言来设计密码锁,可以快速、灵活地设计出符合各种要求的密码锁。
2.掌握FPGA的设计方法与应用。
2.2工作原理及系统框图1、四个键,确认键,开始复位键,解密键,更改密码键。
2、密码长度为5位,设置一个初始密码88888。
3、在系统上电时,输入88888(数码管同步显示),按下确认键即可开锁(密码正确,LED 灯亮)。
4、开锁状态下,按下更改密码键即可通过4*4矩阵键盘输入新密码。
5、新密码数据格式为0~F6、按确认键,新密码生效。
7、按下解密键,输入新密码,按下确认键可解锁。
8、重复上述步骤,输入新密码,即可开锁,且密码正确情况下LED 灯亮若密码不正确,则LED 灯不亮,锁闭,可继续输入密码,当三次输入密码错误时蜂鸣器响予以警告。
9、以上为整个系统的工作原理及状态。
1011 总体框图调用部分顶层模块报警部分蜂鸣器密码设置4*4矩阵键盘 显示部分七段数码管LED 灯指示LED 灯提示电路 蜂鸣器报警电路输入按扭开关输入锁存电路密码存储电路开锁控制电路数码管显示电路 控制模块总原理图:2.3.子模块输入输出和功能密码锁分为六个个模块:①顶层模块、②数码显示模块、③蜂鸣器模块、④控制模块、⑤LED灯指示模块、⑥密码输入模块。
其中由顶层模块调其他分模块来实现密码锁功能。
1.顶层及控制模块实现几个模块的配合工作,它能实现对密码的设置和显示,同时在密码正确时LED 灯亮,错误三次时通过蜂鸣器发出警报。
2. 数码管显示模块数码管常用于电子产品的显示部分,原理简单易于实现,这里为5个密码,需要5个数码管来显示。
6个输入,其中CLK 为时钟信号,segData1--5为每个密码。
两个输出,segCtl[7..0]对数码管片选,segData[7..0]为译码后的段控制信号。
3、蜂鸣器模块蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用各类电子产品中作发声器件。
如图为其原理图:图 1.1 蜂鸣器原理图结构蜂鸣器功能实现:程序共有两个输入信号分别为ENA,clk,输出为COUT,密码输入错误三次,ENA置1,COUT置1,蜂鸣器响,需要注意的是,蜂鸣器模块时钟频率不能过快。
5.LED灯指示模块为了显示明显,用了所有LED,给同一pass_LED信号,低电平有效。
6.键盘输入模块实时动态扫描,输出按键有效值key_value[4..0],及按键标志位key_flag。
三.软件设计3.1程序流程图和状态机程序流程图:状态机:3.2程序清单(1)Dingceng模块moduledingceng(clk,key_GM,key_QR,key_JM,key_RST,key_ready,key_value,M1,M2,M3,M4,M5,filed_alar m,pass_led);input clk;input key_GM,key_QR,key_JM,key_RST,key_ready;input [4:0] key_value;output [3:0] M1;output [3:0] M2;output [3:0] M3;output [3:0] M4;output [3:0] M5;output filed_alarm;output pass_led;reg [3:0] M1;reg [3:0] M2;reg [3:0] M3;reg [3:0] M4;reg [3:0] M5;reg filed_alarm,pass_led;reg JM_flag;reg GM_flag;reg sign;reg [2:0] main_state;reg [3:0] Old1;reg [3:0] Old2;reg [3:0] Old3;reg [3:0] Old4;reg [3:0] Old5; //cun fang yuan shi mi mareg [2:0] Q,QQ;//ji lu mi ms shu ru ci shureg [1:0] try_times;parameter DD=3'b000,RS=3'b001,JM=3'b010,GM=3'b011,QR=3'b100;always@(posedge clk )if(!key_RST) main_state<=RS;elsebegincase(main_state)DD:beginif(!key_JM) main_state<=JM;else if((key_GM==0)&&(JM_flag==1))beginpass_led<=1;GM_flag<=1;filed_alarm<=0;main_state<=GM;endelsemain_state<=DD;endRS:beginM1<=0;M2<=0;M3<=0;M4<=0;M5<=0;Old1<=8;Old2<=8;Old3<=8;Old4<=8;Old5<=8;filed_alarm<=0;JM_flag<=0;try_times<=0;main_state<=DD;pass_led<=1;Q<=0; QQ<=0;sign<=0;endJM:beginif(key_ready==1) sign<=1;elseif(key_ready==0 && sign==1)beginsign<=0;case(Q)0:begin M1<=key_value;Q<=3'b001; main_state<=DD;end1:begin M2<=key_value;Q<=3'b010; main_state<=DD;end2:begin M3<=key_value;Q<=3'b011; main_state<=DD;end3:begin M4<=key_value;Q<=3'b100; main_state<=DD;end4:begin M5<=key_value;Q<=3'b000; main_state<=QR;endendcaseendelsemain_state<=JM;endGM:beginif(key_ready==1) sign<=1;elseif(key_ready==0 && sign==1)beginsign<=0;case(QQ)0:begin M1<=key_value;QQ<=3'b001; main_state<=DD;end1:begin M2<=key_value;QQ<=3'b010;main_state<=DD;end2:begin M3<=key_value;QQ<=3'b011; main_state<=DD;end3:begin M4<=key_value;QQ<=3'b100; main_state<=DD;end4:begin M5<=key_value;QQ<=3'b000; main_state<=QR;endendcaseendelsemain_state<=GM;endQR:if(key_QR==0)beginif(GM_flag==1)beginOld1<=M1;Old2<=M2;Old3<=M3;Old4<=M4;Old5<=M5;GM_flag<=0;main_state<=DD;endelseif((Old1==M1)&&(Old2==M2)&&(Old3==M3)&&(Old4==M4)&&(Old5==M5))beginpass_led<=0;filed_alarm<=0;try_times<=2'b00;JM_flag<=1;M1<=0;M2<=0;M3<=0;M4<=0;M5<=0;main_state<=DD;endelse if(try_times>2'b01)beginfiled_alarm<=1;pass_led<=1;try_times<=2'b00;main_state<=DD;M1<=0;M2<=0;M3<=0;M4<=0;M5<=0;endelsebegintry_times<=try_times+2'b01;pass_led<=1;filed_alarm<=0;main_state<=DD;M1<=0;M2<=0;M3<=0;M4<=0;M5<=0;endendelse main_state<=QR;default:;endcaseendendmodule(2)键盘模块keyboardmodule keyboard(clk,rst,inrow,outcol,//行输入,列读出key_value,//键值key_flag,);input clk,rst; //时钟25mhzinput [3:0] inrow;output [3:0] outcol;output [4:0] key_value;output key_flag;reg clock; //定义25时钟reg key_flag; //按键标志位reg jud_flag; //按键标志位reg [3:0] col; //行输入扫描值reg [3:0] inrow_reg; //寄存扫描列值reg [3:0] outcol_reg; //寄存扫描行值reg [2:0] state; //状态标志-判断是否有按键按下reg [4:0] key_value; //读取按键值reg [19:0] count;reg [7:0] keynum_1; //寄存扫描列值//产生25hz时钟always@(posedge clk)begincount<=count+1;if(count>=20'd50000)beginclock<=~clock;count<=0;endend//////////////////////////////////////////////通过6状态状态机完成对键盘的扫描:总确定是否有按键—>逐行扫描—>统一处理always@(posedge clock)if(rst==1)beginstate<=0; key_flag<=1'b0;endelsebegincase(state)0: //初值0begincol<=4'b0000; //行扫描输入值key_flag<=1'b0;if(inrow!=4'b1111) //有键按下beginstate<=1;col<=4'b1110; //开始扫描endelse state<=0; //总体判断是否有按键按下,确定按键标志位end1:beginif(inrow!=4'b1111)beginstate<=5; //有按键时直接进入状态5endelsebeginstate<=2;col<=4'b1101;endend2:beginif(inrow!=4'b1111)beginstate<=5;endelsebeginstate<=3;col<=4'b1011;endend3:beginif(inrow!=4'b1111)beginstate<=5;endelsebeginstate<=4;col<=4'b0111;endend4:beginif(inrow!=4'b1111)beginstate<=5;endelse state<=0;end5:beginif(inrow!=4'b1111)begininrow_reg<=inrow; //保存扫描行值//读得outcol_reg<=col; //保存扫描列值key_flag<=1'b1; //有键按下为1state<=0; //连续扫描状态5直至无按键按下,从0开始endelse state<=0;endendcaseend/////////////////////////////////////////////////////////always@(clock)beginif (keynum_1 == {outcol_reg,inrow_reg})begin //连续2次检测到的按键值相同,稳定jud_flag<=1;endelsebeginjud_flag<=0;keynum_1<={outcol_reg,inrow_reg};endend//对键盘扫描结果译码得到按键数值always@(posedge key_flag)begin// if(key_flag==1'b1)begincase({outcol_reg,inrow_reg})8'b1110_1110:begin key_value<=0;end8'b1110_1101:begin key_value<=1;end8'b1110_1011:begin key_value<=2;end8'b1110_0111:begin key_value<=3;end8'b1101_1110:begin key_value<=4;end8'b1101_1101:begin key_value<=5;end8'b1101_1011:begin key_value<=6;end8'b1101_0111:begin key_value<=7;end8'b1011_1110:begin key_value<=8;end8'b1011_1101:begin key_value<=9;end8'b1011_1011:begin key_value<=10;end8'b1011_0111:begin key_value<=11;end8'b0111_1110:begin key_value<=12;end8'b0111_1101:begin key_value<=13;end8'b0111_1011:begin key_value<=14;end8'b0111_0111:begin key_value<=15;enddefault: key_value <= 16; //无按键按下或无效按键组合endcaseendendassign outcol=col;endmodule(3)显示模块showmodule show(CLK,segData,segCtl,segData_1,segData_2,segData_3,segData_4,segData_5 );input CLK;output reg [7:0]segData;output reg [4:0]segCtl;input [3:0]segData_1;input [3:0]segData_2;input [3:0]segData_3;input [3:0]segData_4;input [3:0]segData_5;reg [7:0]segDataReg; //段选扫描reg [4:0]segCtlReg; //位选扫描reg [2:0]segState; //状态扫描//////////////////////////////////////////////////////////////////////////// reg [15:0]cnt1ms;reg clk1000Hz;always@(posedge CLK) //1ms beginif(cnt1ms==16'd12500)begincnt1ms<=16'b0;clk1000Hz<=~clk1000Hz;endelsecnt1ms=cnt1ms+16'b1;end/////////////////////////////////////////////////////////////////////////////// always@(posedge clk1000Hz) //状态扫描begincase(segState) //初值为03'b000:beginsegCtlReg<=5'b00001;segState<=segState+3'b001; //扫描下一状态segDataReg<=segData_1; //段选、位选同时传值end3'b001:beginsegCtlReg<=5'b00010;segState<=segState+3'b001;segDataReg<=segData_2;end3'b010:beginsegCtlReg<=5'b00100;segState<=segState+3'b001;segDataReg<=segData_3;end3'b011:beginsegCtlReg<=5'b01000;segState<=segState+3'b001;segDataReg<=segData_4;end3'b100:beginsegCtlReg<=5'b10000;segDataReg<=segData_5;segState<=3'b000;enddefault:;endcaseend////////////////////////////////////////////////////////////////////////////////// always@(posedge CLK)beginsegCtl<=segCtlReg; //位选段选同时赋值、数码管译码case(segDataReg)4'd15:segData<=8'b1000_1110;4'd14:segData<=8'b1000_0110;4'd13:segData<=8'b1010_0001;4'd12:segData<=8'b1100_0110;4'd11:segData<=8'b1000_0011;4'd10:segData<=8'b1010_0000;4'd9:segData<=8'b1001_0000;4'd8:segData<=8'b1000_0000;4'd7:segData<=8'b1111_1000;4'd6:segData<=8'b1000_0010;4'd5:segData<=8'b1001_0010;4'd4:segData<=8'b1001_1001;4'd3:segData<=8'b1011_0000;4'd2:segData<=8'b1010_0100;4'd1:segData<=8'b1111_1001;4'd0:segData<=8'b1100_0000;default:;endcaseendendmodule(4)蜂鸣模块speakermodule speaker(ENA,CLK2,COUT); //ENA为使能信号,CLK为时钟信号规定工作频率input ENA,CLK2;output COUT;reg COUT;reg [20:0] Clk_f;reg f;always@(posedge CLK2)beginif(Clk_f==2500)beginClk_f<=0;f<=~f;endelseClk_f<=Clk_f+1;endalways@(posedge CLK2 ) //CLK2为敏感信号beginif(ENA) //当ENA为1并且Q1小于6时执行下面的语句//ENA为0时,执行下面的语句COUT<=f;elseCOUT<=0;endendmodule四.调试及结果4.1模块仿真输入正确密码由pass_led为0,可知密码输入正确。