视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
密码锁设计VHDL源程序文档
2025-09-30 19:48:54 责编:小OO
文档


2.2系统的输入、输出端口以及寄存器清单及说明:

     CLK                      输入时钟方波信号端口

     KIN                      键盘按键输入端口

     KOUT                    键盘完整编码码值输出端口(七位二进制数)

     KOUT1                   扫描信号输出端口(三位二进制数)

     SIN                      键盘消抖输入端口(七位二进制数)

     SOUT                    键盘消抖输出端口(七位二进制数)

     LIN                      键盘按键编码模块输入端口(七位二进制数)

     DF                       数字按键标志寄存器

     FF                       功能按键标志寄存器

     ND                       数字按键识别编码寄存器

     NF                       功能按键识别编码寄存器

     LOCK                    电子密码锁上锁状态标志寄存器

     LOCK1                   电子密码锁报警状态标志寄存器

     UNLOCK                  电子密码锁开锁状态标志寄存器

     NULL1                    电子密码锁无密码状态标志寄存器

     DATA                     电子密码锁数码显示数据寄存器

     CAT                      电子密码锁数码显示位选寄存器

     DISPLAY            电子密码锁数码显示段选寄存器(十七位二进制数)

     NUM0、NUM1、NUM2、NUM3数码显示中分位显示数据寄存器

     DISNUM                      数码显示段选数据寄存器

     I1                            数码显示计数器

     SCANS                       键盘扫描中按键完整编码寄存器

     SCAN                        键盘扫描寄存器

     CNT                         键盘消抖计数器

     SIN1                         键盘按键键值寄存器

     I                             键盘扫描计数器

     DF1                          数字按键状态标志寄存器

     ACC                          键盘数字输入暂存器

     T                             报警计数器

     REG                          电子密码锁密码存储器

     NC                           计数器

1键盘输入扫描部分源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_11.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 kbscan1 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

             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.STD_LOGIC_11.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<=sin;

            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_11.ALL;

ENTITY 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<="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

when"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 CLK='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"=>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                       功能按键标志寄存器

     ND                       数字按键识别编码寄存器

     NF                       功能按键识别编码寄存器

     LOCK                    电子密码锁上锁状态标志寄存器

     LOCK1                   电子密码锁报警状态标志寄存器

     UNLOCK                  电子密码锁开锁状态标志寄存器

     NULL1                    电子密码锁无密码状态标志寄存器

     DATA                     电子密码锁数码显示数据寄存器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.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:buffer 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);

             signal       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<=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';

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<="1000100010001000";

         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<='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            电子密码锁数码显示段选寄存器(十七位二进制数)

  DISPLAY            电子密码锁数码显示段选寄存器(十七位二进制数)

     NUM0、NUM1、NUM2、NUM3数码显示中分位显示数据寄存器

     DISNUM                      数码显示段选数据寄存器

     I1                            数码显示计数器

                    

5电子密码锁的数码显示模块源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.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_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 DOWNTO 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<="00000000011111111";

WHEN "0001"=>DISNUM<="00000000000001100";

WHEN "0010"=>DISNUM<="00001000101110111";

WHEN "0011"=>DISNUM<="00001000100111111";

WHEN "0100"=>DISNUM<="01001010110000000";

WHEN "0101"=>DISNUM<="00001100110111011";

WHEN "0110"=>DISNUM<="00001000111111011";

WHEN "0111"=>DISNUM<="00000000000001111";

WHEN "1000"=>DISNUM<="00001000111111111";

WHEN "1001"=>DISNUM<="00001000110111111";

WHEN OTHERS=>DISNUM<=NULL;

               END CASE;

WHEN 1 => CAT<="1101";

               CASE NUM1 IS

WHEN "0000"=>DISNUM<="00000000011111111";

WHEN "0001"=>DISNUM<="00000000000001100";

WHEN "0010"=>DISNUM<="00001000101110111";

WHEN "0011"=>DISNUM<="00001000100111111";

WHEN "0100"=>DISNUM<="01001010110000000";

WHEN "0101"=>DISNUM<="00001100110111011";

WHEN "0110"=>DISNUM<="00001000111111011";

WHEN "0111"=>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"=>DISNUM<="00000000011111111";

WHEN "0001"=>DISNUM<="00000000000001100";

WHEN "0010"=>DISNUM<="00001000101110111";

WHEN "0011"=>DISNUM<="00001000100111111";

WHEN "0100"=>DISNUM<="01001010110000000";

WHEN "0101"=>DISNUM<="00001100110111011";

WHEN "0110"=>DISNUM<="00001000111111011";

WHEN "0111"=>DISNUM<="00000000000001111";

WHEN "1000"=>DISNUM<="00001000111111111";

WHEN "1001"=>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"=>DISNUM<="00001000101110111";

WHEN "0011"=>DISNUM<="00001000100111111";

WHEN "0100"=>DISNUM<="01001010110000000";

WHEN "0101"=>DISNUM<="00001100110111011";

WHEN "0110"=>DISNUM<="00001000111111011";

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电子密码锁的数码显示部分(附加)

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.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_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 DOWNTO 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<="00000000011111111";

WHEN OTHERS=>DISNUM<="01111111100000000";

       END CASE;

WHEN 1=>

CAT<="1101";

       CASE 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<="01111111100000000";

       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_11.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity KeyScan is

    port(

        RESET        :    in     std_logic;

        CLK        :    in     std_logic;     --基本时钟源6MHz

        KeyIn    :    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 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;

architecture Behavioral of KeyScan is

    signal 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);--备份扫描数据    

    signal count        :    integer range 0 to 60000    ;    --分频器,产生毫秒时钟基准

    signal scancnt        :    integer range 0 to 3        ;    --LED扫描轮转

    signal Data0:    integer range 0 to 9        ;     

begin

LED_EN1<='0';

    --进程1:产生20ms时钟

    process( CLK,RESET)

    begin

        if RESET='0' then time10ms<='0';    --初始化    

        elsif CLK'event and CLK='1' then

         timecnt<=timecnt+1;

            if timecnt=100000 

         then time10ms<=not time10ms; timecnt<=0;

            end if;

        end if;

    end process;

    --进程2:键盘扫描输出

    process( time10ms,RESET)

    begin

        if RESET='0' then      scanvalue<="0001";combvalue<="00000000";    

Data0<=0;    --初始化

        elsif time10ms'event and time10ms='1' then    --每10ms进行一次键盘扫描

         KeyOut<=scanvalue; --输出扫描值             

         cpy_scanvalue<=scanvalue;     --备份扫描值,为了进程3对扫描结果进行比较

             case scanvalue is      --扫描值移位

                 when "0001" => scanvalue<="0010";

                 when "0010" => scanvalue<="0100";

                 when "0100" => scanvalue<="1000";

                 when "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”

                 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" => Data0<=8; --对应键盘“8”

                 when "01000100" => Data0<=9; --对应键盘“9”

                    

                 when "00011000" => Data0<=0; --对应键盘“0”

                    

                 when others => null; --无键盘按下

             end case;            

        end if;

    end process;

--数码管扫描

    

    process(CLK,RESET)    --时钟进程,产生各种时钟信号

    begin

        if  RESET='0' then      NULL;        

        elsif CLK'event and CLK='1' then     

         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_Point<='1';    

        else  

             if scancnt=0 then

             case Data0 is      --分个位

                 when 0 => LED_A<='0';LED_B<='0'; LED_C<='0';LED_D<='0';LED_E<='0';LED_F<='0';LED_G<='1';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 1 => LED_A<='1';LED_B<='0'; LED_C<='0';LED_D<='1';LED_E<='1';LED_F<='1';LED_G<='1';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 2 => LED_A<='0';LED_B<='0'; LED_C<='1';LED_D<='0';LED_E<='0';LED_F<='1';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 3 => LED_A<='0';LED_B<='0'; LED_C<='0';LED_D<='0';LED_E<='1';LED_F<='1';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 4 => LED_A<='1';LED_B<='0'; LED_C<='0';LED_D<='1';LED_E<='1';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 5 => LED_A<='0';LED_B<='1'; LED_C<='0';LED_D<='0';LED_E<='1';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 6 => LED_A<='0';LED_B<='1'; LED_C<='0';LED_D<='0';LED_E<='0';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 7 => LED_A<='0';LED_B<='0'; LED_C<='0';LED_D<='1';LED_E<='1';LED_F<='1';LED_G<='1';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 8 => LED_A<='0';LED_B<='0'; LED_C<='0';LED_D<='0';LED_E<='0';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                 when 9 => LED_A<='0';LED_B<='0'; LED_C<='0';LED_D<='0';LED_E<='1';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';

                  when others => null;    

             end case; 

             

            

            

             end if;

        end if;

  end process;

end Behavioral;

控制电路的软件仿真图(1)

图2-11 控制电路的软件仿真图(2)

控制电路的软件仿真图(3)

控制电路的软件仿真图(4)

控制电路的软件仿真图(5)

5电子密码锁的数码显示模块源程序(改七段)

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

ENTITY LEDXIANSHI IS

PORT(CLK :IN STD_LOGIC;

LED_TimePoint:out std_logic;      --冒号

        LED_Point    :out std_logic;       --小数点 

        LED_EN1        :out std_logic;       --选择数码管显示

        DATA: in STD_LOGIC_VECTOR (15 DOWNTO 0);

        CAT:OUT STD_LOGIC_VECTOR(0 TO 3);

        DISPLAY:OUT STD_LOGIC_VECTOR(6 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(6 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;

               ELSE

I1<=I1+1;

              END IF;

            END IF;

        END PROCESS;

  PROCESS(I1)

         BEGIN

               CASE I1 IS

WHEN 0=>CAT<="0001";

               CASE NUM0 IS

WHEN "0000"=>DISNUM<="1000000";

WHEN "0001"=>DISNUM<="1111001";

WHEN "0010"=>DISNUM<="0100100";

WHEN "0011"=>DISNUM<="0110000";

WHEN "0100"=>DISNUM<="0011001";

WHEN "0101"=>DISNUM<="0010010";

WHEN "0110"=>DISNUM<="0000010";

WHEN "0111"=>DISNUM<="1111000";

WHEN "1000"=>DISNUM<="0000000";

WHEN "1001"=>DISNUM<="0010000";

WHEN OTHERS=>DISNUM<=NULL;

               END CASE;

WHEN 1 => CAT<="0010";

               CASE NUM1 IS

WHEN "0000"=>DISNUM<="1000000";

WHEN "0001"=>DISNUM<="1111001";

WHEN "0010"=>DISNUM<="0100100";

WHEN "0011"=>DISNUM<="0110000";

WHEN "0100"=>DISNUM<="0011001";

WHEN "0101"=>DISNUM<="0010010";

WHEN "0110"=>DISNUM<="0000010";

WHEN "0111"=>DISNUM<="1111000";

WHEN "1000"=>DISNUM<="0000000";

WHEN "1001"=>DISNUM<="0010000";

WHEN OTHERS=>DISNUM<=NULL;

               END CASE;

WHEN 2=>

CAT<="0100";

               CASE NUM2 IS

WHEN "0000"=>DISNUM<="1000000";

WHEN "0001"=>DISNUM<="1111001";

WHEN "0010"=>DISNUM<="0100100";

WHEN "0011"=>DISNUM<="0110000";

WHEN "0100"=>DISNUM<="0011001";

WHEN "0101"=>DISNUM<="0010010";

WHEN "0110"=>DISNUM<="0000010";

WHEN "0111"=>DISNUM<="1111000";

WHEN "1000"=>DISNUM<="0000000";

WHEN "1001"=>DISNUM<="0010000";

WHEN OTHERS=>DISNUM<=NULL;

               END CASE;

WHEN 3=>

CAT<="1000";

               CASE NUM3 IS

WHEN "0000"=>DISNUM<="1000000";

WHEN "0001"=>DISNUM<="1111001";

WHEN "0010"=>DISNUM<="0100100";

WHEN "0011"=>DISNUM<="0110000";

WHEN "0100"=>DISNUM<="0011001";

WHEN "0101"=>DISNUM<="0010010";

WHEN "0110"=>DISNUM<="0000010";

WHEN "0111"=>DISNUM<="1111000";

WHEN "1000"=>DISNUM<="0000000";

WHEN "1001"=>DISNUM<="0010000";

WHEN OTHERS=>DISNUM<=NULL;

               END CASE;

               END CASE;

               END PROCESS;

               END BEHAVIORAL;下载本文

显示全文
专题