基于FPGA数字系统数码锁设计报告.docx
- 文档编号:27743039
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:16
- 大小:82.49KB
基于FPGA数字系统数码锁设计报告.docx
《基于FPGA数字系统数码锁设计报告.docx》由会员分享,可在线阅读,更多相关《基于FPGA数字系统数码锁设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
基于FPGA数字系统数码锁设计报告
`
五邑大学
基于FPGA的数字系统设计报告
题目:
数码锁
院系信息工程学院
专业电子信息工程(职教)
学号13071817
学生姓名李杰锋
指导教师
目录
1、数码锁的要求和意义2
1.1设计要求:
2
1.2设计意义:
3
1.3设计方法:
3
1.4设计功能:
3
2、系统设计及描述4
2.1系统设计模块框图4
3、软件设计流程及描述4
4、源程序代码5
4.1control模块5
4.2sentence模块5
4.3sinput模块6
4.4cinput模块8
4.5顶层文件9
4.6波形仿真图(密码正确)9
4.7波形仿真图(密码错误)10
5、调试过程遇到的问题与解决的方法10
6、系统设计体会12
7参考文献13
数码锁
1、数码锁的要求和意义
1.1设计要求:
为密码锁输入输出信号示意图。
K0~K9为数字键,按下其中一个键(Ki=1),代表输入一个对应i的BCD码;C1~C3为密码设置键,用拨位开关实现,密码为3位BCD码;按下SETUP键(SETUP=1)后系统正常工作;按下START键(START=1)后,系统等待从K0~K9输入的密码,依次输入三位密码后,按OPEN键(OPEN=1),若密码正确,输出一开锁信号(LOCK=1),同时绿色的LED1点亮;若密码不正确,喇叭鸣叫(SPK=1),同时红色灯LED2点亮,系统处于报警状态。
正确开锁后,并闭门,按下SETUP键,系统再次进入正常工作状态,LOCK=0,LED1熄灭;若系统处于报警状态,SETUP、START两键均失效,只有按下内部的I-SETUP键(I-SETUP=1)才可解除报警状态,即LED2熄灭,SPK=0,SETUP、START两键恢复作用。
使用者若按错号码,可以在按下OPEN键之前按START键重新启动开锁程序。
1.2设计意义:
本文主要介绍运用verilogDHL技术设计数字密码锁的方法。
本设计采用自上而下的数字系统设计方法,将数字密码锁系统分解为若干子系统,并且进一步细划为若干模块,然后用硬件描述语言VDHL来设计这些模块,并且分别进行软件的仿真。
仿真结果表明:
该数字密码锁能够效验8位十进制数密码,且有预置密码(即万能密码),显示输入密码,设置密码,修改密码,输入错误回删,关锁等功能。
该密码锁体积小,功耗低,操作简单,不怕掉电,维护和升级都十分方便,具有非常好的应用前景.
1.3设计方法:
根据数码锁的要求利用VerilolHDL语言采用自上而下的数字系统设计方法,将其分成了四个模块,分别是控制模块(control),判决模块(sentence),密码设置模块(sinput),密码输入模块(cinput),这样的设计方法大大减少然后利用数码锁顶层连接文本描述将模块连接一起构成满足项目要求的功能。
1.4设计功能:
通过拨动拨码开关cint1,cint2,cint3,拨动的次数就是对应密码的数值,通过此设置密码。
拨动setup开关,系统启动,拨动start开关,等待输入密码,输入密码完毕后按下open确认密码,若密码正确,输出一开锁信号(lock=1),同时绿色的led1点亮;若密码不正确,喇叭鸣叫(spk=1),同时红色灯led2点亮,系统处于报警状态。
若密码输入过程中输入错误,在拨动open开关前,拨动start就可以重新输入密码。
正确开锁后,并闭门,拨动setup开关,系统再次进入正常工作状态,lock=0,led1熄灭。
2、系统设计及描述
2.1系统设计模块框图
3、软件设计流程及描述
采用Top-down的方法,把数码锁分为四个模块,分别是控制模块(control),判决模块(sentence),密码设置模块(sinput),密码输入模块(cinput)。
(1)控制模块(control):
此模块根据要求,使用系统启动健(setup)和密码输入键(start)相与,产生一个密码清零信号(clr_signal),密码输入键(start)和密码确认信号(open)相与产生一个密码确认信号(open_signal),通过输出两个控制信号控制了整个系统的运行时序,提高系统的可靠性,避免不必要的混乱错误。
以及通过接受一个密码错误的反馈信号禁止系统启动键(setup)变化。
DE2-70上使用三个拨码开关分别作为控制模块的输入分别是setup,start,open的信号输入。
(2)判决模块(sentence):
此模块主要就是输入密码与密码设置的比较判断以及系统输出初始化,密码比较正确产生开锁信号(lock),以及信号灯(LED1)亮,否则蜂鸣器产生警告信号(spk),以及信号灯(LED2)。
此模块产生一个密码错误反馈信号,使其通知控制模块输入密码错误。
在DE2-70上增加一个拨码开关作为密码错误恢复健(I_setup),通过此健解除禁止启动键(setup)的变化。
(3)密码设置模块(sinput):
由于硬件资源的限制以及设计的方便,此模块使用三个计数器分别控制三个密码。
在DE2-70上,通过三个拨码开关实现密码的设置。
(4)密码输入模块(cinput):
使用状态机锁存且输入三个密码。
在DE2-70上,通过10个按键控制输入0~9三个密码。
4、源程序代码
4.1control模块
modulecontrol(unlock,setup,start,open,clr_signal,open_signal);
//模块名与端口列表
inputsetup,start,open,unlock;//模块的输入端口
outputclr_signal,open_signal;//模块的输出端口
regclear_flag,setup_en,start_en,open_en;//定义信号为reg数据类型
always@(posedgesetuporposedgeunlock)//setup和unlock上升沿有效的敏感信号
begin
if(unlock)//假如unlock为高电平。
setup_en<=0;
//则setup_en为低电平,此时clr_signal为低电平,禁止重新输入密码,需要I_setup解除
elsesetup_en<=1;
end
always@(posedgestart)//start上升沿有效
begin
if(setup_en)//当setup_en为高电平
start_en<=1;//start_en高电平,这条语句产生了一个操作顺序
end
assignclr_signal=start&&setup_en;//start和setup_en相与产生高低电平
assignopen_signal=open&&start_en;//start_en和open相与产生密码确认信号(反馈给判决器进行密码比较)
endmodule
4.2sentence模块
moduletence(lock,led1,spk,led2,lock_system,setup,I_setup,open,c1,c2,c3,
code1,code2,code3);//模块名与端口列表
inputopen,I_setup,setup;//模块的输入端口
input[3:
0]c1,c2,c3,code1,code2,code3;//模块的输入端口
outputlock,led1,spk,led2,lock_system;//模块的输出端口
reglock,led1,spk,led2,lock_system;//定义信号为reg数据类型
always@(posedgesetuporposedgeI_setuporposedgeopen)
begin
if(setup)//系统启动按键,高电平是将系统输出端初始化
beginlock<=0;led1<=0;clear<=0;end
elseif(I_setup)//高电平时,解除对系统setup的控制且解除警报
begin
lock_system<=0;
spk<=0;
led2<=0;
end
else//open=1时判断输入的密码是否有效
begin
if((code1==c1)&&(code2==c2)&&(code3==c3))
begin
lock<=1;
led1<=1;
spk<=0;
led2<=0;//密码正确
end
else
begin
spk<=1;led2<=1;
lock<=0;led1<=0;
lock_system<=1;//密码错误
end
end
end
endmodule
4.3sinput模块
modulesinput(cint1,cint2,cint3,cnt1,cnt2,cnt3,clr);//模块名与端口列表
inputcint1,cint2,cint3,clr;//模块的输入端口
output[3:
0]cnt1,cnt2,cnt3;//模块的输出端口
reg[3:
0]cnt1,cnt2,cnt3;//定义信号为reg数据类型
always@(posedgecint1orposedgeclr)
begin
if(clr)//高电平异步清零
cnt1=0;
else
beginif(cnt1==9)//计数值为9,清零
cnt1=0;
else
cnt1=cnt1+4'b0001;//通过计数器来进行密码设置
end
end
always@(posedgecint2orposedgeclr)
begin
if(clr)//高电平异步清零
cnt2=0;
else
begin
if(cnt2==9)//计数值为9,清零
cnt2=0;
else
cnt2=cnt2+4'b0001;//通过计数器来进行密码设置
end
end
always@(posedgecint3orposedgeclr)
begin
if(clr)//高电平异步清零
cnt3=0;
else
begin
if(cnt3==9)//计数值为9,清零
cnt3=0;
else
cnt3=cnt3+4'b0001;//通过计数器来进行密码设置
end
end
endmodule
4.4cinput模块
modulecinput(k,start,out1,out2,out3);/模块名与端口列表
input[9:
0]k;//模块的输入端口
inputstart;//模块的输入端口
output[3:
0]out1,out2,out3;//模块的输出端口
reg[3:
0]code,out1,out2,out3;//定义信号为reg数据类型
reg[2:
0]state;//定义信号为reg数据类型
always@(k)//十个拨码开关为密码输入,同时也是敏感信号
begin
case(k)
10'b00_0000_0001:
begincode<=4'h0;in<=1;end
//当k[0]=1时,code为0,且in产生一个高电平,作为控制变量
10'b00_0000_0010:
begincode<=4'h1;in<=1;end
10'b00_0000_0100:
begincode<=4'h2;in<=1;end
10'b00_0000_1000:
begincode<=4'h3;in<=1;end
10'b00_0001_0000:
begincode<=4'h4;in<=1;end
10'b00_0010_0000:
begincode<=4'h5;in<=1;end
10'b00_0100_0000:
begincode<=4'h6;in<=1;end
10'b00_1000_0000:
begincode<=4'h7;in<=1;end
10'b01_0000_0000:
begincode<=4'h8;in<=1;end
//当k[8]=1时,code为8,且in产生一个高电平,作为控制变量
10'b10_0000_0000:
begincode<=4'h9;in<=1;end
default:
begincode<=4'ha;in<=0;end//这里是in产生高电平的关键,当每一次拨码后,in总会为零,因为拨码,K总会为0,相当于按键。
endcase
end
always@(posedgestartorposedgein)//start和in作为敏感信号
begin
if(start)//当start为1时,密码复位,等待输入
begin
state<=0;//用于控制状态的转换
out1<=4'hb;
out2<=4'hb;
out3<=4'hb;
end
else//假如检测到in的上升沿开始锁存每一次输入的密码
begin
case(state)//巧妙运用了case语言和状态机的一些原理来实现锁存的功能
0:
beginout1<=code;state<=1;end//第一个密码的输入锁存
1:
beginout2<=code;state<=2;end//第二个密码的输入锁存
2:
beginout3<=code;state<=3;end//第三个密码的输入锁存
endcase
end
end
endmodule
4.5顶层文件
modulemzong(lock,led1,spk,led2,setup,start,open,I_setup,k,cint1,cint2,
cint3,clr);
inputsetup,start,open,I_setup,cint1,cint2,cint3,clr;
input[9:
0]k;
outputlock,led1,spk,led2;
wireunlock,open_singal,clr_singal,cnt1,cnt2,cnt3,out1,out2,out3;
controlu1(unlock,setup,start,open,clr_singal,open_singal);
sentenceu2(lock,led1,spk,led2,unlock,setup,I_setup,open_singal,cnt1,cnt2,
cnt3,out1,out2,out3);
//lock_system==unlock;open==open_singal,//cnt1==c1,int2==c2,cnt3==c3,code1=out1,code2=out2,code3=out3
cinputu3(k,clr_singal,out1,out2,out3);//start==clr_singal;
sinputu4(cint1,cint2,cint3,cnt1,cnt2,cnt3,clr);//cint1=c1,cint2=c2,cint3=c3
endmodule
4.6波形仿真图(密码正确)
说明:
密码设置121,按下setup键后,再按下start键,输入密码121,此时led1和lock产生高电平,说明密码正确,可以再按下setup键,系统初始化,重新输入密码进行开锁。
4.7波形仿真图(密码错误)
说明:
说明:
密码设置121,按下setup键后,再按下start键,输入密码128,此时led2和spk产生高电平,说明密码错误,此时再按下I_setup接触警报。
5、调试过程遇到的问题与解决的方法
(1)此数码锁通过DE2-70的拨码开关实现的,当通过拨码开关进行密码的设置和密码的输入不够稳定识别其边沿信号。
假如需要增加可靠性,必须加入去抖动电路。
也就是多加入一个always过程块且将时钟信号作为敏感信号,使其计数延时约20ms,再检测是否有按键输入。
always@(posedgeclk)
begin
if(key!
=0)
begincnt<=0;kclk<=key;end
else
if(cnt==10)
begincnt<=0;kclk<=key;end
else
cnt<=cnt+1;
end
(2)在编写数码锁的密码设置模块的(sinput)verilogHDL程序的时候,经常遇到在always过程块需要使用边沿信号和电平信号的作为敏感信号的问题,以及一个always过程快存在三个以上多边沿信号的时候,同样出现编译错误。
暂时解决的方法是通过重新理清逻辑结构和关系,再使用多个always将多边沿敏感信号,同样的方法将边沿信号和电平信号分开。
问题得以解决。
如数码锁的密码设置模块就是使用这样的方法解决问题。
部分程序如下:
always@(posedgecint1orposedgeclr)
beginif(clr)
cnt1=0;
else
beginif(cnt1==9)cnt1=0;
elsecnt1=cnt1+4'b0001;
end
end
always@(posedgecint2orposedgeclr)
beginif(clr)
cnt2=0;
else
beginif(cnt2==9)
cnt2=0;
else
cnt2=cnt2+4'b0001;
end
end
always@(posedgecint3orposedgeclr)
beginif(clr)
cnt3=0;
else
begin
if(cnt3==9)
cnt3=0;
else
cnt3=cnt3+4'b0001;
end
end
(3)在编写verilogHDL程序的时候,当定义位宽为4位的变量cnt1时候,如果进行加一个没有标明位宽的数据时,就会出现很多关于位宽的警告。
因此,在进行这样的运算的时候,必须标明其位宽进行加减等。
如密码设置模块的程序,如:
cnt3=cnt3+4'b0001。
(4)非阻塞赋值和阻塞赋值的问题,也是困扰着程序的编写。
在编写verilogHDL程序没有搞清楚其区别就容易造成其逻辑混乱和逻辑错误。
因此,在always过程快中编写程序时,必须注意非阻塞赋值和阻塞赋值的使用。
如下:
(一)当用always过程快描述组合逻辑时,都可以任意使用其一赋值,就尽量使用阻塞赋值。
(二)时序逻辑电路,尽量使用非阻塞赋值方式,组合逻辑电路尽量使用非阻塞赋值方式。
6、系统设计体会
EDA实验设计过程中,老师要求我们从原理图输入设计过渡到VerilogHDL输入设计,上课时还经常提到一句话就是“这本书这门课的重点就是学会verilogHDL语言的编写入门”。
经过几个实验的过渡,此次数码锁的系统设计体会感受较深就是对于原理图输入设计和VerilogHDL输入设计的对比体会。
原理图输入设计的特点就是可控性好,效率高,比较直观,但是对于大规模的逻辑设计比较繁琐。
而VerilogHDL语言输入设计特点就是移植性好,使用方便,对于规模较大系统设计方便。
在此次的数码锁的子模块设计中,体会到使用verilogHDL比原理图输入简单方便。
逻辑实现比原理图有很大的优势,修改容易。
但是当设计顶层文件的时候,使用原理图输入较为方便,重要的是直观。
我这次数码锁的设计中开始我使用了verilogHDL语言描述顶层,有时候进行调试的时候带来了很多的不便,后来使用了原理图输入设计描述顶层,直观性好,调试方便。
总的来说,原理图输入设计适合一些逻辑较为简单,规模较小的电路,可以体现其优势所在。
VerilogHDL语言输入设计,比较适合大规模的CPLD/FPGA的设计,较为简明。
所以原理图输入设计和verilog语言输入设计取长补短,相互结合。
适合用原理图的地方就使用原理图,适合用verilogHDL语言就使用语言。
我个人认为在最短时间内,用自己最熟悉的工具设计出高效,稳定,符合设计要求的电路才是我们的最终的目标。
7参考文献
[1]王金明,数字系统设计与verilogHDL。
北京:
电子工业出版社,2011
[2]杨旭,刘盾,EDA技术基础与试验教程。
北京:
清华大学出版社,2010
[3]潘松,黄继业,EDA技术使用教程。
北京:
科学出版社,2010
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 数字 系统 数码 设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)