可编程逻辑器件原理与应用综合设计格式.docx
《可编程逻辑器件原理与应用综合设计格式.docx》由会员分享,可在线阅读,更多相关《可编程逻辑器件原理与应用综合设计格式.docx(13页珍藏版)》请在冰豆网上搜索。
可编程逻辑器件原理与应用综合设计格式
信息技术学院
《可编程逻辑器件原理及应用》课程
综合设计报告书
姓名:
李伟梅
班级:
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的情况,导致运行结果有问题。
后来,当摁下开锁键的时候,没有任何变化。
分析发现是由于运行周期过短,还没来得及开锁就锁上了。
于是,在进程后面加了一个计数器,解决了问题。
还有其他小问题,例如:
少括号,少逗号等,但都迎刃而解了。
事实证明做任何事情都要有仔细、认真的态度。
总之,通过这次课程设计,我终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
最后,对给过我帮助的所有同学和主任表示忠心的感谢!
成绩
评定
(包括:
指导教师评语和课程设计等级)