数电课程设计电子密码锁_第1页
数电课程设计电子密码锁_第2页
数电课程设计电子密码锁_第3页
数电课程设计电子密码锁_第4页
数电课程设计电子密码锁_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1956

43纾垃之学

数字逻辑设计

课程设计报告书

题目名称:电子密码锁

学院:光电信息学院

小组成员

指导教师

日期:2023年6月28日

一、小组成员分工情况

侯晨涛:所有编程工作、资料查找工作量:60%

钟永捷:辅助编程、图表制作、资料查找工作量:20%

徐昊:论文写作、图表制作、资料查找工作量:20%

二、题目分析

1.输入信号

通过扫描键盘的行与检测键盘的列得到输入信号。

2.输出信号

通过译码器得到的显示器显示信息,开关锁动作。

三、设计总框图

四、各模块说明

(-)键盘扫描模块

1.原理

通过时序信号产生脉冲,不间断地向矩阵键盘的行输入ino-iioi-loii-oiii的循环序列。同时将各

列的电三置高,检测矩阵键盘各列的电平变化。若在一定期间内,扫描到第〃列电平为零时恰好第〃,行的

输入电立也为零,则判断键盘上[见〃]位置上键被按下。

歹U2一O

3123

2456

1789

O*O#

2.模块框图

3.状态表

此模块只需要通过编码器实现即可,假定前I四位表达各行扫描结果,后三位表达各列扫描的结果。

动作行输入列输入状态命名编码输出

为0001,即输出值为1。其它状态依此类推。

(-)输入模块

1.原理

设立两个寄存器,一个作为用户所想设立密码的密码寄存器。另一个寄存器则是将键盘Input的键值

存储起夹。最后通过一个比较器将两个寄存器的值进行比较。若相同则输出“open”,反之,输出“error”。

比较器内部通过多位异或门实现。

2.模块框图

4.仿真结果

1)删除字符

SimulationWaveforms

Smul^txon»od«:Tittiag

MaswTrngBar18.55m448.17usInterval:Uai5us

A124O.*g81.窣稣122,十3163.qni2O4.psus49152us

英tfme1855ns

803elk

至IRst

HOOil

国key.out01010001

□ncorrect

ngmwr

Bnaift.state

日Kxnb«r_5ig0CO3COCOXO0OTCO3COCO300OCOJCOOOJCOOaDCODOOCOlO]D0CO3COCO3CO0OTCO9110101OCOOWCOOOJCOQOIOOI10101

国Input#OOC颂OOPMOPOCOJOOCSO

SimulationWaveforms

Simulationmodo:Timing

第一次输入值为0101,Number_sig第0到3位将其保存。第二次输入值为OOH,Number_sig第

4到7位将其保存。第三次输入值为0001,Numbejsig第8到11位将其保存。第四次输入值为1010,

即删除键。第五次输入值为0111,Numbejsig第8到11位的值由0001变为0111,即实现了删除功

能。

2)密码输入对的

SimulationWaveforms

SmulationnodeTinine

Q

A

T

Correct=l说明密码输入对的,Numbejsig的值为,Nunibejsig的值通过七段显示译码器之后将

使数码管显示OPEnOO。

3)密码输入错误

SimulationWaveforms

Sinulationnodo:Timing

MasterTime8卷:1855nsJJPcrter7268gInteivat72,68u$Start:

4096us81.平us122.芦uz163甲s204,8“245.76s286J2uz

1855ns

Rst

□key.nen

国key.out

correct

error

Smain_state

SNsber一sigB

SInputpdB•

Correct=l说明密码输入店的,Numbejsig的值为,Nunibejsig的值通过七段显示译码器之后将

使数码管显示ERROROo

(三)密码判断及更改

1.原理

密码判断模块:通过比较器将输入寄存相与存储寄存器中的数据进行比较,假如数据相同,则判断密

码走的。假如数据不同,则返回输入等待状态,并对输入寄存器中的数据清零。

密码更改模块:将第一次与第二次输入寄存器中的数据输入比较器比较,假如数据相同则将该数据输入进

密码存储寄存器中。假如数据不同,则返回数据输入前的数据等待状态。

2.模块框图

3.仿真结果

SimulationWaveforms

Sinulftlionnode:Timing

5MasterTmeBar16425ns<|»|Porter44516u;Intefvdt44514usStartErd:

A8192u£122.88us1B3d4u22048us245.76us286.72^ui327Mus388&4us409.6us

Rzt

i»am-st»te

Inputpd

key-out

correct

main_state为10000即update状态,按键六次输入值为0110,0110,0110,0110,0110,0010,第二次输

入相同。即将密码由666666改为266666。第二次输入完毕same为1,说明两次输入相同。按“#"键确

认后。当状态变为01000时,即in_put输入密码Inputpd为即266666,correct为1说明密码修改成功

并开锁。

(四)主状态机

1.原理

状态分五个状态:Waits,Input,Pass,Update,Forbido

在Waits状态下,下下进入密码“Input”状态,在“Input”状态下掘可删除当前Input

的字符。若密码输入对的则进去“Pass”状态,否则进入“Forbid”状态,这时若撼下“#”键,则重新

返回“gits”状态。掘下“*”键进入“Update”状态,输入两次密码然后握键进行拟定,若两次

密码不相同则Update失败,重新返回到“Pass”状态。若两次密码相同,则返回到“Waits”状态。

2模块框图

3.状态表

当前状态Key_scan

#*Right

S

0001101110

WaitsWaitsWaitsin_putWaitsDD

in_putin_putin_putin_putin_putPassForbid

PassPassUpdatePassPassDD

ForbidForbidForbidWaitsForbidDD

UpdateUpdateUpdateUpdateUpdateRight1D

Right1UpdateUpdateUpdateUpdateRight2Error

Right2UpdateUpdateWaitsUpdateDD

ErrorDDPassDDD

S*

4.仿真结果

1)密码输入错误

按卜一键,进行密码输入(main_state由00001变为01000),此时error为1说明密码输入错误。

main_state变为forbid状态(由01000变为00100)。再按下键,重新返回waits状态(由00100

变为00001)。

2)密码输入对的,且修改密码成功

SimdationWaveforms■

SifrixxLicod,:T&ni

A

按下键,进行密码输入(main_state由00001变为01000),此时correct为1说明密码输入对

的。由in_put变为pass(由01000变为00010)。按下进行密码修改,由00010变为10000修改对

的,主状态重新返为wait。

3)密码输入对的,但密码修改失败

SimuktionWaveforms

Sinulttionnod«:Timing

按下键,进行密码输入(main_state由00001变为01000),此时correct为1说明密码输入对

的。由in_put变为pass(由01000变为00010)。按下进行密码修改,由00010变为00010主状态

由修改错误重新返为passo

(五)显示

1.原理

这县的选择24位数码管控制模块,将24位拆分为六组四位编码输入七段译码器。将译码输出与扫描

模块产生的扫描时序共同作用于六位数码管。得到所需显示结果。

2.模块框图

八年如人xirn^^im

数码管控制r--<-

七段译码器

模块六位数码管

1工抗汨班大二I十常

扫描模块

(24位)

3.仿真结果

Q

A

&

T

输入信号Number_sig的值为即123456,Scansig的值为011111时,即第一个数码管亮时Duandate

的值为0110000即数码管显示数字为1。综合以上,此时第一个数码管显示为1,之后第二个数码管显示

为2,第三个数码管显示为3……

五、验证方案

采月自上而下的设计方案,一方面将题目规定拆提成各大模块,然后通过编写Verilog语言的程序实

现各模块的功能。在quatus2中仿真出时序逻辑图,并验证程序的对的性。

MMimpfecn

■EH哩6!U:F1

>ww.wgp3q

rMXCJ,

明.F:a

叫M^q

M<T»CT

*5a,5q

MJW.MC3,

nr.H,q三m

电.M3,

耽”;

xcrva

iny

OOOQ1U02y&5守"'y\urv

Unqy¥”

。了工

C^TUF2r811)tOKS\--\

二二:,OKS谏

7T7TTIESZ33S1

WJ卜,,K:05;

b]蚪5sMj

F

fJ5fil&ar/!简

键,

图1.设计总框图的实现

六、课程设计心得体会

通过这次数字密码锁的课程设计,我们掌握了如何通过数字逻辑知识来设计一个可应用于生产生活中

的拥有实际应用功能的数字逻辑器件。一方面我们要了解其具体功能规定,然后采用自上而下的设计方法,

建立整体逻辑框图并将其划分为各个具体功能模块。之后,我们通过编写Verilog程序实现每一模块的功

能。在编译无错误后,通过quartus2软件自带的波形仿真功能检测模块功能是否实现。当波形达成规定,

将各模块拼接,得到最终的密码锁整体逻辑结构(如图1)。

在讨论课程设计时,我们最初想通过简朴的逻辑门和逻辑器件来实现密码锁功能,以简化程序部分。

但是由于状态之间转换的复杂性,无法实现。之后我们决定每一功能模块均通过程序来实现,并自动生成

状态图及逻辑图。这样工作的任务所有转移到编程上。

编程的感想:对于编程,我想说从对vcrilog一窍不通(C也不太会)到能独立地使用其进行编程,

这将近一月的时间里,我学会了很多,一开始面对这个题目,完全不知道从何下手,从图书馆借了一本书

就开始慢慢看,然后就尝试着去写,有时候一个简朴的错误困扰了我整整一天甚至两天都想不出来。这个

题目的程序是我这将近一个月的心血,每一行都是通过思考后写下的。通过这次课程设计,我体会到了编

程的乐趣,当你长时间困扰在一个问题上,忽然间的一个奇思妙想就可以解决问题或者实现一个以前实现

不了的功能,就是这种偶尔的惊喜使得我坚持了下来。这次课程设计美中局限性的是,虽然各个模块都可

以实现其功能,但是将其和在一起就会有问题,虽然编译无错误,但是功能无法实现。由于时间因素,无

法对其进行修正,这是我的一个遗憾。

程序编写的同时我们进行状态表的绘制,不同于软件仿真出的状态表,我们将状态简化绘制表格,只

体现编程时的大体思绪。在这个过程中,我们纯熟掌握了如何将抽象的状态变化绘制成状态转移表。以及

简朴状态图的绘制方法。

七、源文献(详见附件)

源代码:

top.V〃顶层文献

51c51c51c5|c51c51c51c51c51c51c51c51c51c51c51c51cJ{C?|c51c51c51c51c51c?|c5!c51c51c*|c5Jcrjc51c51c51c51c?|c5101c5Jc5|c51c5|c51c5Jc51c51c

moduletop(elk,Rst,kcy_out,Duandate,Scansig);

inputelk;

inputRst;

input[3:0]key_out;

output[6:0]Duandate;

output[5:0]Scansig;

wire[3:0]scan;

wire[2:0]key_in;

wire[2:0]key_mem;

wirecorrect;

wireerror;

wiresame;

wire[4:0]mainstate;

wire[23:0]Numbersig;

wire[23:0]Inputpd;

main_state_machineMl

(

.clk(clk),

.Rst(Rst),

.keyout(key_out),

.correct(correct),

.error(error),

.sane(same),

.mam_statc(main_statc),

.keymem(keymem)

);

keyscanM2

(

.clk(clk),

.Rsl(Rst),

.keyin(key_in),

.scan(scan),

.keyout(key_out),

.keymem(key_mem)

);

In_putM3

(

.clk(clk),

.Rst(Rst),

.keyout(key_out),

.keymem(keymem),

.correct(correct),

.error(error),

.mam_statc(main_statc),

.Nunbersig(Number_sig),

.Inputpd(Inputpd)

);

passwdcomM4

(

.elk(elk),

.Rst(Rst),

.key_out(key_out),

.Inputpd(Inputpd),

.manstate(mainstate),

.keymem(key_mem),

.correct(correct),

.error(error),

.sane(same)

);

topledM5

(

.elk(elk),

.Rst(Rst),

.Nunber_sig(Number_sig),

.Duan_date(Duan_date),

.Scan_sig(Scan_sig)

);

cndmodulc

wx

d、4、,,、,「4、*1、,.、4、*1、,「,卜V、*1、,i、,,、,A、*<**J、,广,卜4、4、,j、,4、,,、(、*1、,A、/「*/»”、,j、,「,4、V、*,*,A、,「,,、«、*1、,1、,卜*T、,j、,,、,卜*\>*J、,「'卜V、"、,|、,,、,4、(、*1、,卜,卜,4、*,**J、,广,卜«、*1、,|、,,、,4、«、*1、,「/卜V、乙、,j、,,、,,、«、*1、,A、,卜«、,j、,「

Key_scan.v〃键盘扫描

、1,*1*、1"♦I*'*1,、1,、],*2;*、1,、1,KW\[,、1,、]■、1,4,*1*、1,、1,«A»、[■、1,■>1*、1,、,■、<1*、[,«A«、]■、1,«x»\[■

modulekeyscan(elk,scan,keyin,keyout,keymem,Rst);

inputelk;

inputRst;

input[2:0]key_in;

output[3:0]scan;

output[3:0]key_out;

output[2:0]kcymcm;

reg[3:0]scan;

reg[3:0]key_out;

reg[31:0]counter;

reg_20clk;

reg[1:0]Q;

reg[2:0]keyjnem;

always@(posedgeelkornegedgeRst)

ifCRst)

begin

counter<=0;

end

else

begin

counter<=counter+l'bl;

if(counter==12500)

begin

counter<=0;

20cIk<-20clk;

end

end

always@(posedgc_20clk)

begn

Q<=Q+1'bl;

end

always@(posedgeelkornegedgeRst)

begin

if(!Rst)

key_mem<=3'bill;

else

casc(Q)

2'bOO:

begin

scan=4'bl110;

case(kcy_in)

34)110:

begin

key_out<=4'dl;

key_mem<=3>bl10;

end

3'bl01:

begin

key_out<=4'd2;

key_mem<=3'bl01;

end

3'bOll:

begin

key_out<=4'd3;

keyjnem<=3'bOll;

end

default:key_out<=4'dz;

endcase

end

2'b01:

begin

scan=4'bl101;

case(key_in)

3'bllO:

begin

key_out<=4'd4;

keymem<=3'bl10;

end

3'bl01:

begin

key_out<=4'd5;

key_mem<=3'bl01;

end

3'b011:

begin

key_out<=4'd6;

kcy_mcm<=3'b011;

end

default:key_out<=4'dz;

endcase

end

2'blO:

begin

scan=4'blOl1;

case(key_in)

31bll0:

begin

key_out<=4'd7;

key_mem<=3'bl10;

end

3'bl01:

begin

key_out<=4'd8;

keyjnem<=3'bl01;

end

3'b011:

begin

key_out<=4'd9;

key_mcm<=3>bOll;

end

default:key_out<=4'dz;

endcase

end

2,bll:

begin

scan二4'bOl11;

case(key_in)

3,bllO:key_out<=4'diO;

3'bl01:

begin

key_out<=4'dO;

key_mem<=3>blOl;

end

3'b011:keyout<=4'dll;

default:key_out<=4'dz;

endcase

end

endcase

encl

cndmodulc

wx«JxWXwx

*C^*1**7**T**T*^r**?**^**T**r**T**1^*T**j*****T**1**T**T**T**T*^f**»^*T**T**7**t**T**f**J**i**T**T^*T**7**T**r*^T**T**j**T**T**7**T**7**T**T**7**J**i**1^*f**T**T**i**f*^J**T**7*

In_put.v〃输入

«2x«2x^lx^tz«£z«Zx*1x^1*xlz*Xxvl*^txs£z*£x*lx>1*xlz«lx*X*、1*%tz«Zx«£zxlx♦>«Az>1x^1*v^*«2x«2x、J*%*z«/xxlxK1*xlz«Xx*£*%t*«*z*£x*£x*1*.1*%tz«2x«lxxlx■>«Az«/z^lxvl*K^Z«JX、1*%*zs2x«ixvl*xlz«Xx>1^^1*vjxs£x«lx*1*♦!*y-vt^vl*«2x*X*xlx

4、q、,.、,「4、*!**.*,,、匕、q、,.、,,、4、4、,,、,,、4、*T*,5,,、4、*•*,「,「4、*!**•*,,、4、*•*,,、,「4、*•*,卜,.、^t*4、,,、4、4、,广,>4、4、,i、,广,「4、4、,卜,,、4、,,、,「4、,A、,卜,.、4、'A、’〉4、*•*,广,,、*?*,「*?*,,、4、,i、,「

moduleIn_put(elk,Rst,key_mem,Number_sig,key_out,Inputpd,correct,error,main_state);

inputelk;

inputRst;

input[3:0]key_out;

input[2:0]key_mem;

inputcorrect;

inputerror;

input[4:0]main_state;

output[23:0]Number_sig;〃数码管显示数据

output[23:0]Inputpd;

reg[23:0]Number_sig;

reg[23:0]Tnputpd;

reg[5:0]cur_state;

reg[5:0]next_state;

parameterfirst=6'bOOO001,

second=6*b000_010,

third=6'b000_100,

fourth=6'b001000,

fifth=6*b010_000,

sixth=6'bl00_000,

finish=6Jblll_lll;

parameter[4:0]waits=5*bOOOOl,

pass=5*bOOOlO,

forbid=5,bOOlOO,

in_put=5*bOlOOO,

update=5*blOOOO;

always@(poscdgeelkornegedgeRst)

begin

ifCRst)

cur_state<=first;

else

curslate<-nextsLaie;

end

regKH2L_f1;〃检测按键电平

regKH2L_gl;

regKH2L_f2;

regKII2L_g2;

regKH2L_f3;

regKH2L_g3;

wireH2L_sigl;

wireI12L_sig2;

wireH2L_sig3;

always@(poscdgcelkornegedgeRst)

ifCRst)

begin

KH2L_fl<=1'bl;

KH2L_gl<=fbl;

KH2L_f2<=1'bl;

KH2L_g2<=1'bl;

KI12L_f3<=1'bl;

KH2L_g3<=fbl;

end

else

begin

KH2L_f1<=keymem[O];

KH2L_gl<=KH2L_f1;

K112L_f2<=key_mem[l];

KH2L_g2<=KH2L_f2;

KH2L_f3<=key^mem[2];

KH2L_g3<=KH2L_f3;

end

assignH2L_sigl=(KH2L_gl&(!KH2L_fl))?Tbl:l'bO;

assignH2L_sig2=(KH2L_g2&(!KlI2L_f2))?l'bl:l'bO;

assignH2L_sig3=(KH2L_g3&(!KH2L_f3))?l'bl:l'bO;

always@(poscdgcelkornegedgeRst)

begin

ifCRst)

Number_sig<=24*b0000_0000_0000_0000_0000_0000;

elseif(main_state==in_put)

begn

if(correct==1)

Number_sig<=24*b0000_l100_l101_l110_0000_0000;

elseif(error==1)

Number_sig<-244)110111111111000011110000;

elseif(error==0&&correct==0)

case(curstate)

first:

if((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out==4'dlO))

next_state<=first;

elseif((H2L_sigl|H2L_sig2||H2L_sig3)&&(key.out!=4'dlO))

begin

Number_sig[3:0]<=key_out;

ncxt_state<=second;

end

else

next_state<=first;

second:

if((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out==4'dlO))

next_state<=first;

elseif((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out!=4'dlO))

begin

Number_sig[7:4]<=key_out;

next_state<=third;

end

else

next_state<=second;

third

if((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out==4'dlO))

nextstate<=second;

elseif((H2L_sigl|H2L_sig2||H2L_sig3)&&(key_out!=4'dl0))

begin

Numbersig[11:8]<=keyout;

nextstate<=fourth;

end

else

next_state<=third;

fourth:

if((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out==4'dlO))

next_state<=third;

elseif((H2L_sigl|H2L_sig2||H2L_sig3)&&(key_out!=4'dlO))

begin

Number_sig[15:12]<=key_out;

next_state<=fifth;

end

else

next_state<=fourth;

fifth:

if((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out==4'dlO))

next_state<=fourth;

elseif((II2L_sigl|H2L_sig2||H2L_sig3)&&(key_out!=4'dlO))

begin

Number_sig[19:16]<=keyout;

next_state<=sixth;

end

else

nextstate<=fifth;

sixth:

if((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out==4'dlO))

next_state<=fifth;

elseif((H2L_sigl|H2L_sig2||H2L_sig3)&&(key.out!=4'dlO))

begin

Number_sig[23:20]<=key_out;

nextstate<=finish;

end

else

next_state<=sixth;

finish:

if((H2L_sigl||H2L_sig2||H2L_sig3)&&(key_out==4,dl0))

next_state<=sixth;

else

nextstate<=finish;

defaultnext_state<=first;

endcase

end

end

always@(poscdgcelkornegedgeRst)

ifCRst)

Inputpd=0;

elseif(cur_state==finish)

Inputpd=Numbcr_sig;

endmodule

51c51c5101c5Jc5|c51c51c51c51c51cj|c5J*5|c51c5^C5^o|c*|c51c51c51c*|c51c51c?|c51c51c^jC?!c51c51c?|c5|o|c5J*5|c51c51c*|c51c5jc5J*rjc*|cr|c51c5J*r{C?|c51c51cr|c5^o|c5Jc5^C?|c51cj|c*|c?|c51c51c5^j|c5|c

Led_encode.v〃数码管加码

»1/*1^*1**1**1**1«*1^*1*»1**1**1**1^*1**1**1*

■「,T、*T»,广".、■「,T、,7、,.、,,、■[、,T、■]、*T*,T、*T*■,、•.、■[、*T*,1、,.、,,、*T**T*■,、*T**T**T**T*W、,「,[、*T*■‘、".、,「*T*,]、,.、,,、•[、*T**T**r*,r*T**T*•,、,|、,[、■T、,,、W、■,、,T、*T*,,、*T*吓、•[、*T*•0、,「*T**T*■,、•.、*,**T**T*■.、*T**T*,T、,7、•.、■「,T、*1*j、•.、■[、*T**T**T**>*,T、*T*

moduleledencode(elk,Rst,Numberdate,Duandate);

inputelk;

inputRst;

input[3:0]Number_date;

output[6:0]Duandate;

parameter0=7*bllll_110,

17'b0110000,

_2=7'bll01」01,

3二7'bllU001,

_4=7'b0110011,

_5=7'bl011_011,

_6=

7二7'bl110000,

_8=7'bl111」11,

_9=

_p=7'bl100」11,

_e=T^lOOl111,

_n=7'bl110」10,

_r=7'blll0」ll;

reg[6:0]rDuan;

always@(poscdgeelkornegedgeRst)

ifCRst)

begin

rDuan<=Tb0000_000;

end

else

case(Number_date)

4,dO:rDuan<=_0;

4'dl:rDuan<=」;

4'd2:rDuan<=_2;

4'd3:rDuan<=,3;

4'd4:rDuan<=4;

4'd5:rDuan<=5;

4'd6:rDuan<=_6;

4'd7:rDuan<=7;

4'd8:rDuan<=8;

4'd9:rDuan<=9;

4'dl2:rDuan<=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论