可编程逻辑器件原理与应用综合设计格式.docx

上传人:b****5 文档编号:7327468 上传时间:2023-01-23 格式:DOCX 页数:13 大小:250.82KB
下载 相关 举报
可编程逻辑器件原理与应用综合设计格式.docx_第1页
第1页 / 共13页
可编程逻辑器件原理与应用综合设计格式.docx_第2页
第2页 / 共13页
可编程逻辑器件原理与应用综合设计格式.docx_第3页
第3页 / 共13页
可编程逻辑器件原理与应用综合设计格式.docx_第4页
第4页 / 共13页
可编程逻辑器件原理与应用综合设计格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

可编程逻辑器件原理与应用综合设计格式.docx

《可编程逻辑器件原理与应用综合设计格式.docx》由会员分享,可在线阅读,更多相关《可编程逻辑器件原理与应用综合设计格式.docx(13页珍藏版)》请在冰豆网上搜索。

可编程逻辑器件原理与应用综合设计格式.docx

可编程逻辑器件原理与应用综合设计格式

信息技术学院

《可编程逻辑器件原理及应用》课程

综合设计报告书

 

姓名:

李伟梅

班级:

B1210

学号:

0915121023

时间:

2014年12月21日

指导教师:

李海成

设计

题目

电子密码锁

设计要求:

数据输入:

每按一个数字键,就输入一个数值,并在显示器上的最右方显示出该数值,并将先前已经输入的数据依序左移一个数字位置。

数码清除:

按下此键可清除前面所有的输入值,清除成为“0000”。

密码更改:

按下此键时将目前的数字设定成新的密码。

激活电锁:

按下此键可将密码锁上锁。

解除电锁:

按下此键会检查输入的密码是否正确,密码正确即开锁。

设计任务:

设计一密码锁,用VHDL语言描述,用QuartusII工具编译和综合,并仿真,撰写实验报告。

 电子密码锁内有预置密码,如果输入的十进制数与锁内密码一致,锁被打开;否则,应封闭开锁电路。

十进制数采用矩阵键盘输入,并实现左移功能。

同时要实现密码更改和数码清除。

 

(包括:

设计方案、原理、程序与仿真结果、实验结果、收获和体会等)

一、设计原理及方案

电子密码锁,主要由三部分组成:

密码输入电路、密码锁控制电路和密码锁显示电路。

 作为电子密码锁的输入电路,可选用的方案有拨码与按键来控制输入和触摸式键盘输入等多种。

触摸式4*4键盘相比简单方便而且成本低,构成的电路简单,本设计采用触摸式4*4键盘来作为该设计的输入设备。

 数字电子密码锁的显示信息电路可采用LED数码显示管和液晶屏显示两种。

液晶显示具有高速显示、可靠性高、易于扩展和升级的特点,但是普通的液晶存在亮度低、对复杂环境适应能力差的特点,但是在本设计中任然使用LED数码管。

 根据以上选定的输入设备与显示器件,并考虑到现实各项密码锁功能的体要求,与系统的设计要求,系统设计采用自顶向下的设计方案。

整个密码锁系统的总总体框图如图所示。

 

 

 

 

二、设计程序

1、电子密码锁输入模块

1.1矩阵键盘显示

1.2密码锁输入程序

process(clk)----键盘列扫描

begin

ifrising_edge(clk)then

--if(Kr="1111")thenkflag1<='0';kcount<=kcount+1;

--if(kcount=0)thenkeyc<="1110";

--elsif(kcount=1)thenkeyc<="1101";

--elsif(kcount=2)thenkeyc<="1011";

--elsekeyc<="0111";

--endif;

--else

if(Kr="1111")thenkflag1<='0';

elsekflag1<='1';

endif;

keyr<=Kr;keyc<=Kc;

--endif;

kflag2<=kflag1;

endif;

endprocess;

process(Clk)--键值获取显示左移

begin

ifrising_edge(clk)then

if(kflag1='1'andkflag2='0')then

if(keyr="0111")then

casekeycis

when"0111"=>buff1<=1;

when"1011"=>buff1<=4;

when"1101"=>buff1<=7;

when"1110"=>buff1<=0;

whenothers=>buff1<=buff1;

endcase;

elsif(keyr="1011")then

casekeycis

when"0111"=>buff1<=2;

when"1011"=>buff1<=5;

when"1101"=>buff1<=8;

when"1110"=>buff1<=0;

whenothers=>buff1<=buff1;

endcase;

elsif(keyr="1101")then

casekeycis

when"0111"=>buff1<=3;

when"1011"=>buff1<=6;

when"1101"=>buff1<=9;

when"1110"=>flag3<='1';

whenothers=>buff1<=buff1;

endcase;

elsif(keyr="1110")then

casekeycis

when"0111"=>flag4<='1';

when"1011"=>flag2<='1';

whenothers=>buff1<=buff1;

endcase;

endif;

endif;

endif;

--ifsxhnb='1'andflag3='1'

--thenflag3<='0';sxhnb<='0';

--elsifflag3='1'thensxhnb<='1';

--endif;

ifsxhnb='1'thenflag3<='0';endif;

iflwmhnb='1'andflag2='1'

thenflag2<='0';lwmhnb<='0';

elsifflag2='1'thenlwmhnb<='1';

endif;

--ifwmhnb='1'andflag4='1'

--thenflag4<='0';wmhnb<='0';

--elsifflag4='1'thenwmhnb<='1';

--endif;

ifwmhnb='1'thenflag4<='0';endif;

ifdhnb='1'andflag5='1'

thenflag5<='0';dhnb<='0';

elsifflag5='1'thendhnb<='1';

endif;

endprocess;

process(clk)

begin

if(kflag1='1'andkflag2='0')then

ifflag5='1'thenbuff3<=0;buff2<=0;endif;

buff4<=buff3;

buff3<=buff2;

buff2<=buff1;

endif;

endprocess;

2、电子密码锁控制模块

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entitymimasuois

port(

Clk:

instd_logic;

Kr:

instd_logic_vector(3downto0);

Kc:

instd_logic_vector(3downto0);

a,b,c,d,e,f,g:

outstd_logic;

Sa,sb,sc:

bufferstd_logic;

un:

outstd_logic

);

endmimasuo;

architectureaaofmimasuois

signalkeyr,keyc:

std_logic_vector(3downto0);

signalkcount:

std_logic_vector(2downto0);

signaldcount:

std_logic_vector(1downto0);

signalkflag1,kflag2:

std_logic;

signalbuff1,buff2,buff3,buff4:

integerrange0to15;

signalDisp_Temp:

integerrange0to15;

signalDisp_Decode:

std_logic_vector(6downto0);

signalmm1,mm2,mm3,mm4:

integerrange0to15;

signalflag,flag2,flag3,flag4,flag5:

std_logic;

signalsxhnb,lwmhnb,wmhnb,dhnb:

std_logic;

begin

process(clk)--密码初始化及更改

begin

ifrising_edge(clk)then

ifflag='0'thenmm1<=0;mm2<=0;mm3<=0;mm4<=0;flag<='1';

elsifflag2='1'thenmm1<=buff4;mm2<=buff3;mm3<=buff2;mm4<=buff1;

endif;

endif;

endprocess;

process(flag3,flag4)--开锁

begin

ifbuff1=mm4andbuff2=mm3andbuff3=mm2andbuff4=mm1andflag3='1'then

un<='1';sxhnb<='1';wmhnb<='0';--0

endif;

ifflag4='1'then

un<='0';sxhnb<='0';wmhnb<='1';--1

endif;

endprocess;

endaa;

3、电子密码锁控制模块

process(dcount)--数码管驱动扫描

begin

case(dcount)is

when"00"=>Disp_Temp<=buff1;

when"01"=>Disp_Temp<=buff2;

when"10"=>Disp_Temp<=buff3;

when"11"=>Disp_Temp<=buff4;

whenothers=>Disp_Temp<=Disp_Temp;

endcase;

endprocess;

process(Clk)

begin

ifrising_edge(clk)then--扫描累加

dcount<=dcount+1;

a<=Disp_Decode(0);

b<=Disp_Decode

(1);

c<=Disp_Decode

(2);

d<=Disp_Decode(3);

e<=Disp_Decode(4);

f<=Disp_Decode(5);

g<=Disp_Decode(6);

sa<='0';

sb<=dcount(0);

sc<=dcount

(1);

endif;

endprocess;

process(Disp_Temp)--显示转换

begin

caseDisp_Tempis

when0=>Disp_Decode<="0111111";--'0'

when1=>Disp_Decode<="0000110";--'1'

when2=>Disp_Decode<="1011011";--'2'

when3=>Disp_Decode<="1001111";--'3'

when4=>Disp_Decode<="1100110";--'4'

when5=>Disp_Decode<="1101101";--'5'

when6=>Disp_Decode<="1111101";--'6'

when7=>Disp_Decode<="0000111";--'7'

when8=>Disp_Decode<="1111111";--'8'

when9=>Disp_Decode<="1101111";--'9'

whenothers=>Disp_Decode<="0000000";--全灭

endcase;

endprocess;

 

三、实验结果

 

四、程序仿真

 

 

 

 

五、收获和体会

通过这次EDA课程设计,让我对VHDL语言和QUARTUS有了更深一步的了解,我学习了VHDL的自顶而下的设计思想和软件更灵活的使用。

让我明白了学以致用的重要性。

在设计过程中也有碰到了许多困难,在刚开始设计矩阵键盘的时候有case…when语句时,没有设计others的情况,导致运行结果有问题。

后来,当摁下开锁键的时候,没有任何变化。

分析发现是由于运行周期过短,还没来得及开锁就锁上了。

于是,在进程后面加了一个计数器,解决了问题。

还有其他小问题,例如:

少括号,少逗号等,但都迎刃而解了。

事实证明做任何事情都要有仔细、认真的态度。

总之,通过这次课程设计,我终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

最后,对给过我帮助的所有同学和主任表示忠心的感谢!

成绩

评定

(包括:

指导教师评语和课程设计等级)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1