找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3760|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

VHDL語(yǔ)言實(shí)現(xiàn)電子密碼鎖(門鈴)程序設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:670450 發(fā)表于 2019-12-22 15:05 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

1.開鎖代碼為8位二進(jìn)制數(shù),當(dāng)輸入代碼的位數(shù)和位值與鎖內(nèi)給定的密碼一致,且按規(guī)定程序開鎖時(shí),方可開鎖,并點(diǎn)亮開鎖指示燈LT。否則,系統(tǒng)進(jìn)入“錯(cuò)誤”狀態(tài),并發(fā)出報(bào)警信號(hào)。

2.開鎖程序由設(shè)計(jì)者確定,并要求鎖內(nèi)給定的密碼是可調(diào)的,且預(yù)置方便,保密性好。

3.串行數(shù)字鎖的報(bào)警方式是點(diǎn)亮77指示燈LF,并使喇叭鳴叫來(lái)報(bào)警,報(bào)警動(dòng)作響1分鐘,停10秒鐘后再重復(fù)出現(xiàn),直到按下復(fù)位開關(guān),報(bào)警才停止。此時(shí),數(shù)字鎖自動(dòng)進(jìn)入等待下一次開鎖的狀態(tài)。

4.報(bào)警器可以兼作門鈴用,門鈴響的時(shí)間通常為7~10秒。

2 設(shè)計(jì)分析及系統(tǒng)方案設(shè)計(jì)

系統(tǒng)的結(jié)構(gòu)圖如下圖所示:

本實(shí)驗(yàn)要求串行輸入八位密碼,密碼可以隨意設(shè)置,可以任意更改, 并且能夠存儲(chǔ).而且能夠顯示出當(dāng)前已經(jīng)輸入或者設(shè)置的位數(shù),待輸入八位后通過(guò)比較電路與預(yù)先設(shè)置的密碼進(jìn)行比較.如果輸入的密碼與存儲(chǔ)的密碼相同鎖體打開 如果輸入的密碼與存儲(chǔ)的密碼不同則報(bào)警系統(tǒng)打開發(fā)出警報(bào).由于還要求有門鈴功能所以增加一個(gè)門鈴輸入當(dāng)門鈴按下后 門鈴響十秒鐘。


對(duì)于密碼存儲(chǔ)以及密碼輸入比較部分主要由load 控制。


Load

0

1

li

0

1

La

1

0

系統(tǒng)功能

設(shè)置密碼

輸入密碼


load為0時(shí)系統(tǒng)功能為設(shè)置密碼,此時(shí)只需要順序串行輸入八位0/1密碼即可,系統(tǒng)將輸入的密碼自動(dòng)保存在存儲(chǔ)器內(nèi)以便于輸入的密碼進(jìn)行比較,當(dāng)load為1時(shí)系統(tǒng)功能為輸入密碼,此時(shí)只需要順序串行輸入八位0/1即可,待輸入八位后系統(tǒng)自動(dòng)將剛輸入的密碼與存儲(chǔ)器內(nèi)的密碼進(jìn)行比較如果密碼正確則開鎖信號(hào)lt為1,否則警報(bào)信號(hào)lf 和響鈴信號(hào)alm為1 lt為0

對(duì)于門鈴部分 當(dāng)檢測(cè)到press信號(hào)的下降沿時(shí)門鈴開始響,計(jì)數(shù)器開始計(jì)數(shù),此時(shí)始終脈沖頻率為50MHz/16MHz=3.125Hz ,此時(shí)當(dāng)計(jì)數(shù)器為30時(shí)既時(shí)間為30/3.125=9.6秒時(shí)門鈴自動(dòng)關(guān)閉。

3系統(tǒng)以及模塊硬件電路設(shè)計(jì)

   

系統(tǒng)電路圖


系統(tǒng)電路圖如上如所示 其中clk1腳接入50MHz的方波,load有兩種狀態(tài)----高電平和低電平狀態(tài)。k0 k1 press clr 分別接到四個(gè)去抖開關(guān)上開關(guān)按下去為低電平 lt alm2 lf alm分別接到四個(gè)發(fā)光二級(jí)管上,當(dāng)輸出為1時(shí)二極管發(fā)光。y0[0~6]分別接到HEX7對(duì)應(yīng)的引腳上實(shí)現(xiàn)數(shù)碼管顯示功能。Y1[0~6]分別接到HEX5對(duì)應(yīng)的引腳上實(shí)現(xiàn)數(shù)碼管顯示功能。其余各種邏輯功能由芯片內(nèi)部計(jì)算執(zhí)行來(lái)實(shí)現(xiàn)。芯片內(nèi)部程序通過(guò)對(duì)clk、load、k0、k1、press、clr輸入信號(hào)的處理通過(guò)lt、alm2、lf、alm、y0[0~6]、y1[0~6]進(jìn)行輸出來(lái)達(dá)到系統(tǒng)所需要的功能。


DE2開發(fā)板上使用的元件要給出使用管腳編號(hào)。

接口

名稱

類型

(輸入/輸出)

符號(hào)

引腳號(hào)

說(shuō)明

CLK

輸入

CLOCK_50

PIN_N2

輸入50MHz的時(shí)鐘頻率

LOAD

輸入

SW[17]

PIN_V2

修改(0)/設(shè)置(1)密碼

K0

輸入

KEY[0]

PIN_G26

輸入密碼0(低電平有效)

K1

輸入

KEY[1]

PIN_N23

輸入密碼1(低電平有效)

Press

輸入

KEY[2]

PIN_P23

門鈴按鈕(低電平有效)

CLR

輸入

KEY[3]

PIN_W26

復(fù)位開關(guān)(低電平有效)

lt

輸出

LEDR[0]

PIN_AE23

開鎖成功指示燈

alm2

輸出

LEDR[12]

PIN_AD15

門鈴(小燈)

lf

輸出

LEDR[16]

PIN_AE12

開鎖失敗指示燈

alm

輸出

LEDR[17]

PIN_AD12

開鎖失敗報(bào)警器(小燈)

y0[0]

輸出

HEX7[0]

PIN_L3

輸入密碼七段碼顯示

y0[1]

輸出

HEX7[1]

PIN_L2

輸入密碼七段碼顯示

y0[2]

輸出

HEX7[2]

PIN_L9

輸入密碼七段碼顯示

y0[3]

輸出

HEX7[3]

PIN_L6

輸入密碼七段碼顯示

y0[4]

輸出

HEX7[4]

PIN_L7

輸入密碼七段碼顯示

y0[5]

輸出

HEX7[5]

PIN_P9

輸入密碼七段碼顯示

y0[6]

輸出

HEX7[6]

PIN_N9

輸入密碼七段碼顯示

y1[0]

輸出

HEX5[0]

PIN_T2

修改密碼七段碼顯示

y1[1]

輸出

HEX5[1]

PIN_P6

修改密碼七段碼顯示

y1[2]

輸出

HEX5[2]

PIN_P7

修改密碼七段碼顯示

y1[3]

輸出

HEX5[3]

PIN_T9

修改密碼七段碼顯示

y14]

輸出

HEX5[4]

PIN_R5

修改密碼七段碼顯示

y1[5]

輸出

HEX5[5]

PIN_R4

修改密碼七段碼顯示

y1[6]

輸出

HEX5[6]

PIN_R3

修改密碼七段碼顯示


4 系統(tǒng)的VHDL設(shè)計(jì)

系統(tǒng)的主要功能是通過(guò)VHDL語(yǔ)言來(lái)實(shí)現(xiàn)的。語(yǔ)言代碼如下。

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;
  4. use ieee.std_logic_arith.all;
  5. entity mima is
  6.    port (clk:in std_logic;                                                                                   --定義時(shí)鐘
  7.                             k0:in std_logic;                                                             --輸入一位0
  8.                             k1:in std_logic;                                                             --輸入一位1
  9.                             clr:in std_logic;                                                                        --復(fù)位
  10.                             load:in std_logic;                                                                        --改變狀態(tài)
  11.                             press:in std_logic;                                                                      --門鈴按鈕
  12.                             alm2:out std_logic;                                                                        --門鈴
  13.                             lt:out std_logic;                                                                --開鎖信號(hào)
  14.                             y0:out std_logic_vector(6 downto 0);                                                         --輸入位數(shù)顯示
  15.                             y1:out std_logic_vector(6 downto 0);                                              --輸出位數(shù)顯示
  16.                             lf:out std_logic;                                                    --亮燈
  17.                             alm:out std_logic);                                                                        --報(bào)警鈴
  18. end mima;
  19. architecture aaa of mima is
  20. signal shift,lock:std_logic_vector(7 downto 0):="00000000"; --定義shift,lock
  21.               signal lam1,lam:std_logic_vector(7 downto 0);         --定義lam1,lam
  22.               signal la,li:std_logic;                              --定義la,li
  23.               signal clk1:std_logic;                              --定義clk1
  24.               signal p:std_logic_vector (4 downto 0);                --定義p
  25.               signal aa:std_logic;                                --定義aa
  26. begin
  27. m16:process(clk)                                    --將clk 16M分頻
  28. variable q: std_logic_vector(22 downto 0);
  29. begin
  30.               if clk'event and clk='1' then q:=q+1;                --檢測(cè)clk上升沿 q=q+1
  31.               end if;                                      
  32. if q="11111111111111111111111" then clk1<='1';  -- clk1產(chǎn)生一個(gè)上升沿脈沖
  33.               else clk1<='0';               
  34.               end if;
  35. end process m16;               
  36. process(clk1,clr)                                      --判斷是否復(fù)位                                             
  37.               begin
  38.                             if clr='0' then                                         
  39.                                           la<='0';                                                   
  40.                                           li<='0';        
  41.                             elsif clk1'event and clk1='1' then                 --檢測(cè)clk1上升沿
  42.                                           if load='0' then                           --判斷狀態(tài)
  43.                                              la<='1';                              --設(shè)置密碼
  44.                                           else           
  45.                                              li<='1';                                                    --輸出密碼
  46.                             end if;
  47.                             end if;
  48. end process;
  49. process(clk1,clr)                            --復(fù)位及輸入設(shè)置密碼
  50. variable a:integer range 0 to 8;                           
  51. begin
  52.               if clr='0' then                                 --復(fù)位
  53.                                lam<="00000000";                                         --lam置零
  54.                             lam1<="00000000";                                        --lam1置零
  55.                             shift<="00000000";                                       --shift置零
  56.                             a:=0;                                      --a置零
  57.                             lt<='0';                                    --開鎖置零
  58.                             lf<='0';                                   --警報(bào)燈置零
  59.                             alm<='0';                                 --警報(bào)置零
  60.               elsif clk1'event and clk1='1' then                 --檢測(cè)上升沿
  61.                             if li='1' then                              --輸入密碼
  62.                                           if a/=8 then                        --判斷密碼是否輸入完畢
  63.                                                         if k1='0' then                       --輸入1
  64.                                                                       shift<='1'&shift(7 downto 1 );         --依次輸入一個(gè)1
  65.                                                                       lam<='1'&lam(7 downto 1);      --點(diǎn)亮對(duì)應(yīng)的一個(gè)小燈
  66.                                                                       a:=a+1;                                                     
  67.                                                         elsif k0='0'then                            --輸入一位0
  68.                                                                       shift<='0'&shift(7 downto 1);          --依次輸入一個(gè)1
  69.                                                                       lam<='1'&lam(7 downto 1);      --點(diǎn)亮對(duì)應(yīng)的一個(gè)小燈
  70.                                                                       a:=a+1;
  71.                                                         end if;
  72.                                           else
  73.                                                         a:=0;
  74.                                                         if shift=lock then              --判斷密碼是否正確
  75.                                                                       lt<='1';                  --正確 開鎖
  76.                                                         else                                            
  77.                                                                       lf<='1';                   --錯(cuò)誤 警報(bào)亮
  78.                                                                       alm<='1';                    --錯(cuò)誤 警報(bào)響
  79.                                                         end if;
  80.                                           end if;
  81.                             elsif la='1' then                     --輸入密碼
  82.                                   a:=0;               
  83.                                           if k1='0' then                     --輸入一位1
  84.                                                         lock<='1'&lock(7 downto 1);   --lock密碼增加一位1
  85.                                                         lam1<='1'&lam1(7 downto 1);  --點(diǎn)亮對(duì)應(yīng)的燈
  86.                                                         a:=a+1;
  87.                                           elsif k0='0' then                  --輸入一位0
  88.                                                         lock<='0'&lock(7 downto 1);   --lock密碼增加一位0
  89.                                                         lam1<='1'&lam1(7 downto 1 );  --點(diǎn)亮對(duì)應(yīng)的燈
  90.                                                         a:=a+1;
  91.                                           end if;
  92.               end if;
  93. end if;
  94. end process;
  95. code1:process(lam)                      --將小燈泡顯示轉(zhuǎn)換到LED顯示
  96.               begin
  97.                             case lam is
  98.                             when "00000000"=>y0<="1111111";    --顯示0
  99.                             when "10000000"=>y0<="1111001";    --顯示1
  100.                             when "11000000"=>y0<="0100100";                --顯示2
  101.                             when "11100000"=>y0<="0110000";     --顯示3
  102.                             when "11110000"=>y0<="0011001";     --顯示4
  103.                             when "11111000"=>y0<="0010010";                            --顯示5
  104.                             when "11111100"=>y0<="0000010";                            --顯示6
  105.                             when "11111110"=>y0<="1111000";                            --顯示7
  106.                             when "11111111"=>y0<="0000000";                            --顯示8
  107.                             when others=>y0<="1111111";           --關(guān)閉數(shù)碼管
  108.               end case;
  109.               end process;
  110.               code2:process(lam1)                     --顯示位數(shù)                                 
  111.               begin
  112.                             case lam1 is
  113.                             when "00000000"=>y1<="1111111";      --顯示0
  114.                             when "10000000"=>y1<="1111001";      --顯示1
  115.                             when "11000000"=>y1<="0100100";      --顯示2
  116.                             when "11100000"=>y1<="0110000";      --顯示3
  117.                             when "11110000"=>y1<="0011001";      --顯示4
  118.                             when "11111000"=>y1<="0010010";      --顯示5
  119.                             when "11111100"=>y1<="0000010";      --顯示6
  120.                             when "11111110"=>y1<="1111000";      --顯示7
  121.                             when "11111111"=>y1<="0000000";      --顯示8
  122.                             when others=>y1<="1111111";         --關(guān)閉數(shù)碼管
  123.               end case;
  124.               end process;
  125.               pp:process(press)                        --門鈴功能
  126. begin
  127.               if press='0' then                         --按下門鈴
  128.                             alm2<='1';                          --門鈴響
  129.               end if;
  130.               if clk1'event and clk1='1' then   p<=p+1;    --延時(shí)10秒
  131.               end if;
  132.               if p=30 then
  133.                             p<="00000";            
  134.                             alm2<='0';                         --關(guān)閉門鈴
  135.               end if;
  136. end process pp;
  137. end aaa;
復(fù)制代碼

本系統(tǒng)運(yùn)行在聯(lián)想計(jì)算機(jī)平臺(tái)和Altera DE2平臺(tái),用的是quartus60軟件調(diào)試環(huán)境,系統(tǒng)的參數(shù)選取均按照要求適當(dāng)選取。

對(duì)密碼模塊:開始時(shí),先給系統(tǒng)清零,即使clr為0(按下KEY[3]),若設(shè)置密碼則SW[17]開關(guān)撥下使load為低電平,此時(shí)通過(guò)按去抖開關(guān)KEY[0],KEY[1]進(jìn)行密碼設(shè)置0和1,每輸入一位密碼則數(shù)目管顯示的數(shù)字加1直到輸入第8位

設(shè)置密碼:仿真圖如下如所示。設(shè)置密碼時(shí)將SW[17]撥下使load為低電平并且clr為高電平此時(shí)可以設(shè)置密碼,由圖可以看出設(shè)置的密碼為00000111每設(shè)置一位密碼數(shù)碼管HEX5的七個(gè)引腳都隨著y1[0~6]的變化而變化,進(jìn)而顯示出當(dāng)前的位數(shù)。

設(shè)置密碼仿真圖

當(dāng)輸入密碼時(shí),SW[17]開關(guān)撥上使load為高電平輸入密碼開始,此時(shí)通過(guò)按去抖開關(guān)KEY[0],KEY[1]進(jìn)行密碼設(shè)置0和1,每輸入一位密碼則數(shù)目管顯示的數(shù)字加1直到輸入第8位。系統(tǒng)自動(dòng)將輸入的密碼與預(yù)設(shè)的密碼進(jìn)行比較如果相同則開鎖。開鎖成功仿真圖如下如所示,此時(shí)設(shè)置的密碼為00001111輸入的密碼為00001111,由圖可以看每設(shè)置一位密碼數(shù)碼管HEX5的七個(gè)引腳都隨著y1[0~6]的變化而變化,進(jìn)而顯示出當(dāng)前的位數(shù)。此時(shí)clr為高電平load為低電平當(dāng)密碼輸入完畢后將load變?yōu)楦唠娖竭M(jìn)行密碼輸入輸入方法與設(shè)置密碼相同沒(méi)設(shè)置一位密碼數(shù)碼管HEX7的七個(gè)引腳都隨著y0[0~6]的變化而變化,進(jìn)而顯示出當(dāng)前的位數(shù)。當(dāng)輸完八位密碼后系統(tǒng)將其與預(yù)先設(shè)置的密碼進(jìn)行對(duì)比,由于設(shè)置與輸入的密碼相同所以lt為高電平開鎖,lf、alm為低電平?jīng)]有反應(yīng)。

                     密碼正確開鎖成功仿真圖

開鎖不成功仿真圖如下如所示,此時(shí)設(shè)置的密碼為00000111輸入的密碼為00000011,由圖可以看每設(shè)置一位密碼數(shù)碼管HEX5的七個(gè)引腳都隨著y1[0~6]的變化而變化,進(jìn)而顯示出當(dāng)前的位數(shù)。此時(shí)clr為高電平load為低電平當(dāng)密碼輸入完畢后將load變?yōu)楦唠娖竭M(jìn)行密碼輸入輸入方法與設(shè)置密碼相同沒(méi)設(shè)置一位密碼數(shù)碼管HEX7的七個(gè)引腳都隨著y0[0~6]的變化而變化,進(jìn)而顯示出當(dāng)前的位數(shù)。當(dāng)輸完八位密碼后系統(tǒng)將其與預(yù)先設(shè)置的密碼進(jìn)行對(duì)比,由于設(shè)置與輸入的密碼不同所以lt為低電平不開鎖,lf、alm為高電平,警報(bào)響起,警報(bào)燈亮起

密碼錯(cuò)誤開鎖不成功仿真圖

門鈴功能仿真圖如下圖所示。對(duì)于門鈴部分 當(dāng)檢測(cè)到press信號(hào)的下降沿時(shí)門鈴開始響,計(jì)數(shù)器開始計(jì)數(shù),當(dāng)計(jì)數(shù)器為30時(shí)門鈴自動(dòng)關(guān)閉

                     門鈴功能仿真圖


完整的Word格式文檔51黑下載地址:

文檔.doc (881 KB, 下載次數(shù): 35)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:704279 發(fā)表于 2020-3-9 03:17 | 只看該作者
請(qǐng)問(wèn)您下到板子上驗(yàn)證的代碼和您上傳的代碼是否有改動(dòng)呢?我下載您的代碼后發(fā)現(xiàn),無(wú)法下到fpga板子上。不知道您是否有空賜教
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表