密码锁设计VHDL源程序文档_第1页
密码锁设计VHDL源程序文档_第2页
密码锁设计VHDL源程序文档_第3页
密码锁设计VHDL源程序文档_第4页
密码锁设计VHDL源程序文档_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、2.2系统的输入、输出端口以及寄存器清单及说明: CLK 输入时钟方波信号端口 KIN 键盘按键输入端口 KOUT 键盘完整编码码值输出端口(七位二进制数) KOUT1 扫描信号输出端口(三位二进制数) SIN 键盘消抖输入端口(七位二进制数) SOUT 键盘消抖输出端口(七位二进制数) LIN 键盘按键编码模块输入端口(七位二进制数) DF 数字按键标志寄存器 FF 功能按键标志寄存器 ND 数字按键识别编码寄存器 NF 功能按键识别编码寄存器 LOCK 电子密码锁上锁状态标志寄存器 LOCK1 电子密码锁报警状态标志寄存器 UNLOCK 电子密码锁开锁状态标志寄存器 NULL1 电子密码锁

2、无密码状态标志寄存器 DATA 电子密码锁数码显示数据寄存器 CAT 电子密码锁数码显示位选寄存器 DISPLAY 电子密码锁数码显示段选寄存器(十七位二进制数) NUM0、NUM1、NUM2、NUM3数码显示中分位显示数据寄存器 DISNUM 数码显示段选数据寄存器 I1 数码显示计数器 SCANS 键盘扫描中按键完整编码寄存器 SCAN 键盘扫描寄存器 CNT 键盘消抖计数器 SIN1 键盘按键键值寄存器 I 键盘扫描计数器 DF1 数字按键状态标志寄存器 ACC 键盘数字输入暂存器 T 报警计数器 REG 电子密码锁密码存储器 NC 计数器1键盘输入扫描部分源程序LIBRARY IEEE

3、;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_1164.ALL;ENTITY kbscan1 is PORT(clk:in STD_LOGIC; kin:in STD_LOGIC_VECTOR(3 DOWNTO 0);-PC7-PC4 kout:out STD_LOGIC_VECTOR(7 downto 0);-PC3-PC kout1: out STD_LOGIC_VECTOR(3 downto 0); end kbscan1; architecture a of kbscan

4、1 is signal scans: std_logic_vector(7 downto 0);-PC7-PC0 signal scan : std_logic_vector(3 downto 0);-PC3-PC0 signal cnt :integer range 0 to 140; signal sin1:std_logic_vector(3 downto 0); signal i:integer range 0 to 3; begin scans<=scan& kin; kout<=scans; kout1<=scan; process(clk) begin

5、if(falling_edge(clk)then if(i=3)then i<=0; else i<=i+1; end if; case i is when 0=>scan<="0001" when 1=>scan<="0010" when 2=>scan<="0100" when 3=>scan<="1000" end case; end if; end process; End a;2键盘输入消抖部分源程序LIBRARY IEEE;USE IEEE.S

6、TD_LOGIC_1164.ALL;ENTITY xiaodou is Port(clk :in STD_LOGIC; sin:in std_logic_vector(7 downto 0); sout:out std_logic_vector(7 downto 0); end xiaodou; architecture behavioral of xiaodou is signal cnt :integer range 0 to 120; signal sin1:std_logic_vector(7 downto 0); begin process(clk) begin sin1<=s

7、in; if (rising_edge(clk)then if(sin1=sin)then cnt<=cnt+1; else sin1<=sin; cnt<=0; end if; if(cnt=120)then sout<=sin; cnt<=0; end if; end if; end process; end behavioral; 3键盘输入编码部分源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_1164.ALL;E

8、NTITY bianma is PORT(clk:in STD_LOGIC; lin:in STD_LOGIC_VECTOR(7 DOWNTO 0);-PC7-PC4 DF,FF: out std_logic; nd,nf:BUFFER std_logic_vector(3 downto 0); end bianma; architecture b of bianma is begin process(clk) begin if clk'event and clk='1' then case lin is when"10000001"=>ND&

9、lt;="0000"-0 when"00010001"=>ND<="0001"-1 when"00010010"=>ND<="0010"-2 when"00010100"=>ND<="0011"-3 when"00100001"=>ND<="0100"-4 when"00100010"=>ND<="0101"-5 wh

10、en"00100100"=>ND<="0110"-6 when"01000001"=>ND<="0111"-7 when"01000010"=>ND<="1000"-8 when"01000100"=>ND<="1001"-9 when others =>ND<="1111" END CASE; END IF; IF CLK'EVENT AND CL

11、K='1' THEN CASE LIN IS when"00011000"=>NF<="0001"-qingchu when"00101000"=>NF<="0010"-queren when"01001000"=>NF<="0011"-shangsuo when"10001000"=>NF<="0100"-kaisuo when"10000100"=&

12、gt;NF<="0101"-wangjimima when"10000010"=>NF<="0111"-genggaimima When others =>NF<="1000" END CASE; END IF; END PROCESS; DF<=NOT(ND(3) AND ND(2) AND ND(1) AND ND(0); FF<=NF(2) OR NF(1) OR NF(0); end b;4 电子密码锁的控制部分程序DF 数字按键标志寄存器 FF 功能按键标志寄存器

13、 ND 数字按键识别编码寄存器 NF 功能按键识别编码寄存器 LOCK 电子密码锁上锁状态标志寄存器 LOCK1 电子密码锁报警状态标志寄存器 UNLOCK 电子密码锁开锁状态标志寄存器 NULL1 电子密码锁无密码状态标志寄存器 DATA 电子密码锁数码显示数据寄存器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY kongzhi IS PORT(CLK: IN STD_LOGIC; DF,FF: in STD_LOGIC; ND,NF:in STD_LOGIC_VECTOR(3 downTO 0); LOCK,LOCK1,UNLOCK:buff

14、er STD_LOGIC; NULL1: buffer STD_LOGIC; DATA: out STD_LOGIC_VECTOR(15 downTO 0) ); END kongzhi; ARCHITECTURE V1 OF kongzhi IS signal i1:integer range 0 to 3; signal df1:std_logic; signal ACC: STD_LOGIC_VECTOR(15 DOWNTO 0); signal t: INTEGER RANGE 0 TO 2; signal REG:STD_LOGIC_VECTOR(15 downTO 0); sign

15、al NC,A:INTEGER RANGE 0 TO 3; begin PROCESS(FF,DF)IS BEGIN if rising_edge(clk) then IF FF='1'THEN IF NF="0001"THEN ACC<="0000000000000000" NC<=0; END IF; ELSE df1<=df; IF df1='0'and DF='1' THEN IF NC<4 THEN ACC<=ACC(11 DOWNTO 0)&ND; NC&l

16、t;=NC+1; END IF; END IF; END IF; IF FF='1' THEN IF NF="0011" THEN REG<=ACC; LOCK<='0' UNLOCK<='1' LOCK1<='1' NULL1<='1' else IF NF="0100" THEN IF REG=ACC THEN LOCK<='1' UNLOCK<='0' LOCK1<='1'

17、NULL1<='1' ELSE LOCK<='0' UNLOCK<='1' IF t=2 THEN REG<="1000100010001000" LOCK1<='0' lock<='1' unlock<='1' null1<='1' t<=0; ELSE t<=t+1; END IF; END IF; else IF NF="0101" THEN REG<="1000

18、100010001000" LOCK<='0' UNLOCK<='1' LOCK1<='1' NULL1<='1' else IF NF="0111" THEN IF UNLOCK='1' THEN IF REG=ACC THEN REG<="0000000000000000" NULL1<='0' LOCK<='1' LOCK1<='1' UNLOCK<='

19、;1' END IF; END IF; else IF NF="0010" THEN REG<=ACC; NULL1<='1' LOCK<='0' LOCK1<='1' UNLOCK<='1' END IF; end if; end if; end if; end if; end if; end if; END PROCESS; DATA<=ACC; END ARCHITECTURE V1; CAT 电子密码锁数码显示位选寄存器 DISPLAY 电子密码锁数码显示段选

20、寄存器(十七位二进制数) DISPLAY 电子密码锁数码显示段选寄存器(十七位二进制数) NUM0、NUM1、NUM2、NUM3数码显示中分位显示数据寄存器 DISNUM 数码显示段选数据寄存器 I1 数码显示计数器 5电子密码锁的数码显示模块源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LEDXIANSHI IS PORT(CLK :IN STD_LOGIC; DATA: in STD_LOGIC_VECTOR (15 DOWNTO 0); CAT:OUT STD_LOGIC_VECTOR(0 TO 3); DISPLAY:OUT ST

21、D_LOGIC_VECTOR(16 DOWNTO 0); END LEDXIANSHI; ARCHITECTURE BEHAVIORAL OF LEDXIANSHI IS Signal NUM0,NUM1,NUM2,NUM3: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DISNUM:STD_LOGIC_VECTOR(16 DOWNTO 0); SIGNAL I1:INTEGER RANGE 0 TO 3; BEGIN NUM0<=DATA(3 DOWNTO 0);NUM1<=DATA(7 DOWNTO 4);NUM2<=DATA(11 DOWN

22、TO 8);NUM3<=DATA(15 DOWNTO 12); DISPLAY<=DISNUM; PROCESS(CLK) BEGIN IF(RISING_EDGE(CLK)THEN IF(I1=3)THEN I1<=0; ELSE I1<=I1+1; END IF; END IF; END PROCESS; PROCESS(I1) BEGIN CASE I1 IS WHEN 0=>CAT<="1110" CASE NUM0 IS WHEN "0000"=>DISNUM<="00000000011

23、111111" WHEN "0001"=>DISNUM<="00000000000001100" WHEN "0010"=>DISNUM<="00001000101110111" WHEN "0011"=>DISNUM<="00001000100111111" WHEN "0100"=>DISNUM<="01001010110000000" WHEN "0101&quo

24、t;=>DISNUM<="00001100110111011" WHEN "0110"=>DISNUM<="00001000111111011" WHEN "0111"=>DISNUM<="00000000000001111" WHEN "1000"=>DISNUM<="00001000111111111" WHEN "1001"=>DISNUM<="00001000

25、110111111" WHEN OTHERS=>DISNUM<=NULL; END CASE; WHEN 1 => CAT<="1101" CASE NUM1 IS WHEN "0000"=>DISNUM<="00000000011111111" WHEN "0001"=>DISNUM<="00000000000001100" WHEN "0010"=>DISNUM<="0000100010111

26、0111" WHEN "0011"=>DISNUM<="00001000100111111" WHEN "0100"=>DISNUM<="01001010110000000" WHEN "0101"=>DISNUM<="00001100110111011" WHEN "0110"=>DISNUM<="00001000111111011" WHEN "0111"

27、=>DISNUM<="00000000000001111" WHEN "1000"=>DISNUM<="00001000111111111" WHEN "1001"=>DISNUM<="00001000110111111" WHEN OTHERS=>DISNUM<=NULL; END CASE; WHEN 2=> CAT<="1011" CASE NUM2 IS WHEN "0000"=>D

28、ISNUM<="00000000011111111" WHEN "0001"=>DISNUM<="00000000000001100" WHEN "0010"=>DISNUM<="00001000101110111" WHEN "0011"=>DISNUM<="00001000100111111" WHEN "0100"=>DISNUM<="0100101011000000

29、0" WHEN "0101"=>DISNUM<="00001100110111011" WHEN "0110"=>DISNUM<="00001000111111011" WHEN "0111"=>DISNUM<="00000000000001111" WHEN "1000"=>DISNUM<="00001000111111111" WHEN "1001"=&g

30、t;DISNUM<="00001000110111111" WHEN OTHERS=>DISNUM<=NULL; END CASE; WHEN 3=> CAT<="0111" CASE NUM3 IS WHEN "0000"=>DISNUM<="00000000011111111" WHEN "0001"=>DISNUM<="00000000000001100" WHEN "0010"=>DISN

31、UM<="00001000101110111" WHEN "0011"=>DISNUM<="00001000100111111" WHEN "0100"=>DISNUM<="01001010110000000" WHEN "0101"=>DISNUM<="00001100110111011" WHEN "0110"=>DISNUM<="00001000111111011&q

32、uot; WHEN "0111"=>DISNUM<="00000000000001111" WHEN "1000"=>DISNUM<="00001000111111111" WHEN "1001"=>DISNUM<="00001000110111111" WHEN OTHERS=>DISNUM<=NULL; END CASE; END CASE; END PROCESS; END BEHAVIORAL;6电子密码锁的数码显示部分

33、(附加)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LEDXIANSHI IS PORT(CLK :IN STD_LOGIC; DATA: in STD_LOGIC_VECTOR (15 DOWNTO 0); CAT:OUT STD_LOGIC_VECTOR(0 TO 3); DISPLAY:OUT STD_LOGIC_VECTOR(16 DOWNTO 0); END LEDXIANSHI; ARCHITECTURE BEHAVIORAL OF LEDXIANSHI IS signal NUM0,NUM1,NUM2,NUM3: STD_LOG

34、IC_VECTOR(3 DOWNTO 0); SIGNAL DISNUM:STD_LOGIC_VECTOR(16 DOWNTO 0); SIGNAL I1:INTEGER RANGE 0 TO 3; BEGIN NUM0<=DATA(3 DOWNTO 0);NUM1<=DATA(7 DOWNTO 4);NUM2<=DATA(11 DOWNTO 8);NUM3<=DATA(15 DOWNTO 12); DISPLAY<=DISNUM; PROCESS(CLK) BEGIN IF(RISING_EDGE(CLK)THEN IF(I1=3)THEN I1<=0;

35、ELSE I1<=I1+1; END IF; END IF; END PROCESS; PROCESS(I1) BEGIN CASE I1 IS WHEN 0=>CAT<="1110" CASE NUM0 IS WHEN "0000"=>DISNUM<="00000000011111111" WHEN OTHERS=>DISNUM<="01111111100000000" END CASE; WHEN 1=> CAT<="1101" CASE

36、 NUM1 IS WHEN "0000"=>DISNUM<="00000000011111111" WHEN OTHERS=>DISNUM<="01111111100000000" END CASE; WHEN 2=> CAT<="1011" CASE NUM2 IS WHEN "0000"=>DISNUM<="00000000011111111" WHEN OTHERS=>DISNUM<="0111111

37、1100000000" END CASE; WHEN 3=> CAT<="0111" CASE NUM3 IS WHEN "0000"=>DISNUM<="00000000011111111" WHEN OTHERS=>DISNUM<="01111111100000000" END CASE; END CASE; END PROCESS; END BEHAVIORAL;数码管显示library IEEE;use IEEE.STD_LOGIC_1164.ALL;use I

38、EEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity KeyScan isport(RESET:in std_logic;CLK:in std_logic; -基本时钟源6MHzKeyIn:in std_logic_vector(3 downto 0);-column列KeyOut:out std_logic_vector(3 downto 0); -row行LED_A: out std_logic; -4位数码管引脚LED_B: out std_logic;LED_C: out std_logic;LED_D: out

39、std_logic;LED_E: out std_logic;LED_F: out std_logic;LED_G: out std_logic;LED_VCC1: out std_logic; -时十位LED_VCC2: out std_logic; -时个位LED_VCC3: out std_logic; -分十位LED_VCC4: out std_logic; -分个位LED_TimePoint:out std_logic; -冒号LED_Point:out std_logic; -小数点 LED_EN1:out std_logic -小数点 );end KeyScan;architec

40、ture Behavioral of KeyScan issignal timecnt:integer range 0 to 100000; -分频计数器,用来得到10ms时钟signal time10ms:std_logic;-10ms时钟signal scanvalue : std_logic_vector(3 downto 0);-记录扫描数据signal combvalue : std_logic_vector(7 downto 0);-KeyIn、KeyOut组合值signal cpy_scanvalue : std_logic_vector(3 downto 0);-备份扫描数据s

41、ignal count:integer range 0 to 60000;-分频器,产生毫秒时钟基准signal scancnt:integer range 0 to 3;-LED扫描轮转signal Data0:integer range 0 to 9; beginLED_EN1<='0'-进程1:产生20ms时钟process( CLK,RESET)beginif RESET='0' then time10ms<='0'-初始化elsif CLK'event and CLK='1' thentimecnt&

42、lt;=timecnt+1;if timecnt=100000 then time10ms<=not time10ms; timecnt<=0;end if;end if;end process;-进程2:键盘扫描输出process( time10ms,RESET)beginif RESET='0' then scanvalue<="0001"combvalue<="00000000"Data0<=0;-初始化elsif time10ms'event and time10ms='1'

43、then-每10ms进行一次键盘扫描KeyOut<=scanvalue; -输出扫描值 cpy_scanvalue<=scanvalue; -备份扫描值,为了进程3对扫描结果进行比较 case scanvalue is -扫描值移位when "0001" => scanvalue<="0010"when "0010" => scanvalue<="0100"when "0100" => scanvalue<="1000"when

44、 "1000" => scanvalue<="0001"when others => scanvalue<="0001" end case;combvalue<= (KeyIn & cpy_scanvalue); -组合键盘扫描的输入和输出 case combvalue is -翻译扫描结果when "00010001" => Data0<=1; -对应键盘“1”when "00100001" => Data0<=2; -对应键盘“2

45、”when "01000001" => Data0<=3; -对应键盘“3”when "00010010" => Data0<=4; -对应键盘“4”when "00100010" => Data0<=5; -对应键盘“5”when "01000010" => Data0<=6; -对应键盘“6”when "00010100" => Data0<=7; -对应键盘“7”when "00100100" => Da

46、ta0<=8; -对应键盘“8”when "01000100" => Data0<=9; -对应键盘“9”when "00011000" => Data0<=0; -对应键盘“0”when others => null; -无键盘按下 end case;end if;end process;-数码管扫描 process(CLK,RESET)-时钟进程,产生各种时钟信号beginif RESET='0' then NULL;elsif CLK'event and CLK='1' t

47、hen count<=count+1;if count=60000 then count<=0;if scancnt>3 then scancnt<=0; else scancnt<=scancnt+1;end if;end if; end if;end process;-数码管扫描 process(CLK, RESET)begin-LED_VCC信号是1有效,其余信号均为0有效,中间的冒号两个点分别由VCC2和VCC3控制if RESET='0' then LED_A<='1'LED_B<='1'LED_C<='1'LED_D<='1'LED_E<='1'LED_F<='1'LED_G<='1'LED_VCC1<='0'LED_VCC2<='0' LED_VCC3<='0'LED_VCC4<='0'LED_TimePoint<='1'LED_Po

温馨提示

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

评论

0/150

提交评论