可编程逻辑器件原理与应用综合设计格式.doc
信息技术学院可编程逻辑器件原理及应用课程综合设计报告书姓 名: 李伟梅 班 级: B1210 学 号: 时 间:2014年12月21日 指导教师: 李海成 设计题目电子密码锁设计要求和任务设计要求:数据输入:每按一个数字键,就输入一个数值,并在显示器上的最右方显示出该数值,并将先前已经输入的数据依序左移一个数字位置。数码清除:按下此键可清除前面所有的输入值,清除成为“0000”。密码更改:按下此键时将目前的数字设定成新的密码。激活电锁:按下此键可将密码锁上锁。解除电锁:按下此键会检查输入的密码是否正确,密码正确即开锁。设计任务:设计一密码锁,用VHDL语言描述,用QuartusII工具编译和综合,并仿真,撰写实验报告。 电子密码锁内有预置密码,如果输入的十进制数与锁内密码一致,锁被打开;否则,应封闭开锁电路。十进制数采用矩阵键盘输入,并实现左移功能。同时要实现密码更改和数码清除。设计过程(包括:设计方案、原理、 程序与仿真结果、实验结果、收获和体会等)一、设计原理及方案电子密码锁,主要由三部分组成:密码输入电路、密码锁控制电路和密码锁显示电路。 作为电子密码锁的输入电路,可选用的方案有拨码与按键来控制输入和触摸式键盘输入等多种。触摸式4*4键盘相比简单方便而且成本低,构成的电路简单,本设计采用触摸式4*4键盘来作为该设计的输入设备。 数字电子密码锁的显示信息电路可采用LED数码显示管和液晶屏显示两种。液晶显示具有高速显示、可靠性高、易于扩展和升级的特点,但是普通的液晶存在亮度低、对复杂环境适应能力差的特点,但是在本设计中任然使用LED数码管。 根据以上选定的输入设备与显示器件,并考虑到现实各项密码锁功能的体要求,与系统的设计要求,系统设计采用自顶向下的设计方案。整个密码锁系统的总总体框图如图所示。 设计过程二、设计程序1、电子密码锁输入模块1.1 矩阵键盘显示1.2密码锁输入程序process(clk) -键盘列扫描 begin if rising_edge(clk) then -if(Kr="1111") then kflag1<='0' kcount<=kcount+1; - if(kcount=0) then keyc<="1110" - elsif(kcount=1) then keyc<="1101" - elsif(kcount=2) then keyc<="1011" - else keyc<="0111" - end if; -else if(Kr="1111") then kflag1<='0' else kflag1<='1' end if; keyr<=Kr; keyc<=Kc; -end if; kflag2<=kflag1; end if; end process; process(Clk) - 键值获取 显示左移 begin if rising_edge(clk) then if(kflag1='1' and kflag2='0') then if(keyr="0111") then case keyc is when "0111"=>buff1<=1; when "1011"=>buff1<=4; when "1101"=>buff1<=7; when "1110"=>buff1<=0; when others=>buff1<=buff1; end case; elsif(keyr="1011") then case keyc is when "0111"=>buff1<=2; when "1011"=>buff1<=5; when "1101"=>buff1<=8; when "1110"=>buff1<=0; when others=>buff1<=buff1; end case; elsif(keyr="1101") then case keyc is when "0111"=>buff1<=3; when "1011"=>buff1<=6; when "1101"=>buff1<=9; when "1110"=>flag3<='1' when others=>buff1<=buff1; end case; elsif(keyr="1110") then case keyc is when "0111"=>flag4<='1' when "1011"=>flag2<='1' when others=>buff1<=buff1; end case; end if; end if; end if; -if sxhnb='1'and flag3='1' -then flag3<='0' sxhnb<='0' -elsif flag3='1' then sxhnb<='1' -end if; if sxhnb='1' then flag3<='0' end if; if lwmhnb='1'and flag2='1' then flag2<='0' lwmhnb<='0' elsif flag2='1' then lwmhnb<='1' end if; -if wmhnb='1'and flag4='1' -then flag4<='0' wmhnb<='0' -elsif flag4='1' then wmhnb<='1' -end if; if wmhnb='1' then flag4<='0' end if; if dhnb='1'and flag5='1' then flag5<='0' dhnb<='0' elsif flag5='1' then dhnb<='1' end if; end process; process(clk) begin if(kflag1='1' and kflag2='0' ) then if flag5='1' then buff3<=0; buff2<=0; end if; buff4<=buff3; buff3<=buff2; buff2<=buff1; end if; end process;2、电子密码锁控制模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;entity mimasuo isport(Clk : in std_logic; Kr : in std_logic_vector(3 downto 0); Kc : in std_logic_vector(3 downto 0); a,b,c,d,e,f,g : out std_logic; Sa,sb,sc : buffer std_logic;un : out std_logic );end mimasuo;architecture aa of mimasuo is signal keyr,keyc : std_logic_vector(3 downto 0); signal kcount : std_logic_vector(2 downto 0); signal dcount : std_logic_vector(1 downto 0); signal kflag1,kflag2 : std_logic; signal buff1,buff2,buff3,buff4: integer range 0 to 15; signal Disp_Temp : integer range 0 to 15; signal Disp_Decode : std_logic_vector(6 downto 0); signal mm1,mm2,mm3,mm4 : integer range 0 to 15; signal flag,flag2,flag3,flag4,flag5 : std_logic; signal sxhnb,lwmhnb,wmhnb,dhnb : std_logic; begin process(clk) -密码初始化及更改 begin if rising_edge(clk) then if flag='0' then mm1<=0; mm2<=0; mm3<=0; mm4<=0;flag<='1' elsif flag2='1' then mm1<=buff4; mm2<=buff3; mm3<=buff2; mm4<=buff1; end if; end if; end process;process(flag3,flag4) -开锁 begin if buff1=mm4 and buff2=mm3 and buff3=mm2 and buff4=mm1 and flag3='1' then un<='1' sxhnb<='1'wmhnb<='0'-0 end if; if flag4='1' then un<='0' sxhnb<='0'wmhnb<='1'-1 end if;end process;end aa;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; when others=>Disp_Temp<=Disp_Temp; end case; end process;process(Clk) begin if rising_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); end if; end process; process(Disp_Temp) -显示转换 begin case Disp_Temp is when 0=>Disp_Decode<="" -'0' when 1=>Disp_Decode<="" -'1' when 2=>Disp_Decode<="" -'2' when 3=>Disp_Decode<="" -'3' when 4=>Disp_Decode<="" -'4' when 5=>Disp_Decode<="" -'5' when 6=>Disp_Decode<="" -'6' when 7=>Disp_Decode<="" -'7' when 8=>Disp_Decode<="" -'8' when 9=>Disp_Decode<="" -'9' when others=>Disp_Decode<=""-全灭 end case; end process;三、实验结果四、程序仿真设计过程五、收获和体会通过这次EDA课程设计,让我对VHDL语言和QUARTUS有了更深一步的了解,我学习了VHDL的自顶而下的设计思想和软件更灵活的使用。让我明白了学以致用的重要性。在设计过程中也有碰到了许多困难,在刚开始设计矩阵键盘的时候有casewhen语句时,没有设计others的情况,导致运行结果有问题。后来,当摁下开锁键的时候,没有任何变化。分析发现是由于运行周期过短,还没来得及开锁就锁上了。于是,在进程后面加了一个计数器,解决了问题。还有其他小问题,例如:少括号,少逗号等,但都迎刃而解了。事实证明做任何事情都要有仔细、认真的态度。总之,通过这次课程设计,我终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和主任表示忠心的感谢!成绩评定(包括:指导教师评语和课程设计等级)