当前位置:文档之家› 五邑大学—EDA密码锁课程设计报告

五邑大学—EDA密码锁课程设计报告

五邑大学基于FPGA的数字系统设计报告题目:密码锁院系信息学院专业电子信息工学号13071814学生姓名江建钊指导教师赵顺喜一、设计的要求和意义1、实验目的:1)训练从概念到产品的设计全过程;2)综合运用各种设计方法。

2、实验原理和要求:图9-1 密码锁输入输出信号示意图图 9-1 k0~k9为数字键盘,用拨码开关实现(以为实验板上只有4个轻触开关),当按下ki=1时,代表一个对应i的BCD码。

setup为密码设置开关,用拨码开关实现,start_set为开始密码设置键,用轻触开关实现,当setup为高电平且start_set按下时为密码设置状态。

Start为开始密码输入键,用轻触开关实现,当setup为低电平且start按下时为密码输入状态。

Open为密码输入完成按键,当open按下,如果密码输入错误,输出信号lock=0,led1=0,led2=1(警示灯),spk=1(报警);如果密码输入正确,输出信号lock=1,led1=1,led2=0(警示灯),spk=0(报警)。

I_setup为复位按键,用轻触开关实现,当I_setup按下,强制将输出信号清零。

3、设计任务与要求:1)设计符合上述功能的密码锁控制电路;2)可以用各种设计方法;3)进行仿真;4)把设计下载到实验箱并验证。

二、系统设计1、软件设计流程及描述:图9-1 程序设计流程图图9-1设计流程可以分为3部分:密码设置、密码输入、密码输入结果判断和复位。

它们都是并发执行的。

2、程序源代码module jjz1(lock,led1,spk,led2,setup,start,start_set,open,k,I_setup);input[9:0] k;input start,setup,start_set,open,I_setup;output reg lock,led1,spk,led2;reg in,in_set;reg[3:0] code,c,c1,c2,c3,out1,out2,out3;reg[2:0] state,state_set;//*****************密码设置**************//always @(setup)beginbegincase(k)10'b00_0000_0001:begin c<=4'h0;in_set<=1;end //密码按键扫描按键;10'b00_0000_0010:begin c<=4'h1;in_set<=1;end10'b00_0000_0100:begin c<=4'h2;in_set<=1;end10'b00_0000_1000:begin c<=4'h3;in_set<=1;end10'b00_0001_0000:begin c<=4'h4;in_set<=1;end10'b00_0010_0000:begin c<=4'h5;in_set<=1;end10'b00_0100_0000:begin c<=4'h6;in_set<=1;end10'b00_1000_0000:begin c<=4'h7;in_set<=1;end10'b01_0000_0000:begin c<=4'h8;in_set<=1;end10'b10_0000_0000:begin c<=4'h9;in_set<=1;enddefault: begin c<=4'ha;in_set<=0;endendcaseendendalways @( posedge start_set or posedge in_set)beginif(start_set ) //beginstate_set<=0;c1<=4'hb;c2<=4'hb;c3<=4'hb;endelsecase(state_set)0:begin c1<=c;state_set<=1;end1:begin c2<=c;state_set<=2;end2:begin c3<=c;state_set<=3;endendcaseend//***************************************////**************密码输入*****************//always @(!setup)begincase(k)10'b00_0000_0001:begin code<=4'h0;in<=1;end //按键扫描; 10'b00_0000_0010:begin code<=4'h1;in<=1;end10'b00_0000_0100:begin code<=4'h2;in<=1;end10'b00_0000_1000:begin code<=4'h3;in<=1;end10'b00_0001_0000:begin code<=4'h4;in<=1;end10'b00_0010_0000:begin code<=4'h5;in<=1;end10'b00_0100_0000:begin code<=4'h6;in<=1;end10'b00_1000_0000:begin code<=4'h7;in<=1;end10'b01_0000_0000:begin code<=4'h8;in<=1;end10'b10_0000_0000:begin code<=4'h9;in<=1;enddefault:begin code<=4'ha;in<=0;endendcaseendalways @(posedge start or posedge in)beginif(start)beginstate<=0;out1<=4'hb;out2<=4'hb;out3<=4'hb;endelsebegincase(state)0:begin out1<=code;state<=1;end1:begin out2<=code;state<=2;end2:begin out3<=code;state<=3;endendcaseendend//****************************************////*************密码输入结果判断和复位*********//always @(posedge I_setup or posedge open)beginif(I_setup)begin lock<=0;led1<=0;spk<=0;led2<=0;end // I_setup为高电平是复位;else //open高电平触发下面语句; beginif ((out1==c1)&&(out2==c2)&&(out3==c3)) //判断out1,out2,out3是否//与c1,c2,c3全相等?begin lock<=1;led1<=1;spk<=0;led2<=0;end //是则密码输入结果正确; elsebegin lock<=0;led1<=0;spk<=1;led2<=1;end //否则密码输入结果错误; endend//****************************************//endmodule3、仿真结果及分析1) 密码输入正确输出的仿真波形图图9-3密码输入正确及输出由图9-3可以看出K0~K9按键分别认为0~9。

密码设置为7、7、5时,当密码输入为7、7、5,这是密码输入正确,输出解锁信号lock和led1为高电平,led2和spk为低电平。

解锁成功,仿真波形正确。

2) 密码输入错误及复位输出的仿真波形图图9-4密码输入错误及复位输出由图9-4可以看出K0~K9按键分别认为0~9。

密码设置为7、7、6时,当密码输入为7、7、5,这是密码输入错误,输出解锁信号lock和led2为到低电平,led2和spk为高电平。

解锁失败,发出蜂鸣声,当复位键按下触发,这是解锁信号输出全为低电平,蜂鸣声解除,仿真波形正确。

3、调试过程遇到的问题与解决的方法1)在编写密码判断和复位程序,我把密码判断放在一个always块里,复位放在另一个always块里,程序如下:always @( posedge open)beginif ((out1==c1)&&(out2==c2)&&(out3==c3))begin lock<=1;led1<=1;spk<=0;led2<=0;end //密码输入结果正确;elsebegin lock<=0;led1<=0;spk<=1;led2<=1;end //密码输入结果错误;endendalways @( posedge I_setup)begin lock<=0;led1<=0;spk<=0;led2<=0;end //为上升沿是复位;两个always语句分开来看语法是完全没有错误的,因为当时我是把密码判断和复位程序分开来编译实现的。

但是把两段程序放在一个工程里编译就出现错误了,想了很久原来是它们逻辑上出现错误。

如果按键open和I_setup同时按下时,程序是无法判断执行哪段语句,它们的关系是或关系。

也就是open和I_setup不能同时按下,所以我把两个always 和并成一个,也就是源程序里的“密码输入结果判断和复位”。

2)还有就是在always块里常常有很多begin-end串行块,很多时候就会把后面的end 忘写,导致begin和end配对不上。

编译大多出现错误都这问题居多,所以每写一个begin 后要同时加上end,然后在begin-end中间写语句。

相关主题