基于VHDL的電子密碼鎖的設計(1)_第1頁
基于VHDL的電子密碼鎖的設計(1)_第2頁
基于VHDL的電子密碼鎖的設計(1)_第3頁
基于VHDL的電子密碼鎖的設計(1)_第4頁
基于VHDL的電子密碼鎖的設計(1)_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、EDA仿真與實踐實習 學 院: 信息科學與工程學院 課題名稱: 硬件描述語言設計 基于VHDL的電子密碼鎖的設計 班 級: 學 生: 學 號: 指導教師: 1 引言在日常的生活和工作中, 住宅與部門的安全防范、單位的文件檔案、財務報表以及一些個人資料的保存多以加鎖的辦法來解決。若使用傳統的機械式鑰匙開鎖,人們常需攜帶多把鑰匙, 使用極不方便, 且鑰匙丟失后安全性即大打折扣。隨著科學技術的不斷發展,人們對日常生活中的安全保險器件的要求越來越高。為滿足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應運而生。基于EDA技術設計的電子密碼鎖。以其價格便宜、使用方便、安全性高、成本低、功耗低、

2、易操作等優點,受到了人們的普遍關注。而以可編程邏輯器件(FBDA)為設計載體,以硬件描述語言(VHDL)為主要表達方式,以Quartus5.1開發軟件等為設計工具設計的電子密碼鎖,由于其能夠實現密碼輸入、密碼校驗、密碼設置和更改等功能,因此,能夠滿足社會對安全防盜的需求。本設計的各個模塊由相應的VHDL程序具體實現,并在Quartus5.1環境下進行了整體電路的模擬仿真,最終實現“密碼鎖控制器設計”的要求。2 設計內容和要求2.1 設計內容:題目:電子密碼鎖內容:設計一個4位串行數字鎖。(1)開鎖代碼為4位二進制,當輸入代碼的位數與鎖內給定的密碼一致,且按規定程序開鎖時,方可開鎖,并點亮一個指

3、示燈。否則進入“錯誤”狀態,并發出報警信號。(2)鎖內的密碼可調,且預置方便,保密性好。(3)串行數字鎖的報警由點亮一個燈,直到按下復位開關,報警才停下。此時,數字鎖又自動等待下一個開鎖狀態。要求:(1)通過查閱相關技術資料,詳細描述電子密碼鎖的基本原理。(2)編寫電子密碼鎖的Verilog HDL或VHDL程序,并仿真編譯下載驗證。(3)給出完整的系統頂層模塊圖與波形仿真圖。3 設計分案 密碼鎖控制器是硬件與軟件的結合。根據設計要求,決定以FBDA芯片和VHDL語言設計此電子密碼鎖。用一片FBDA芯片實現,從而大大簡化了系統結構,降低了成本,提高了系統的保密性和可靠性。這種設計不僅簡化了系統

4、結構,降低了成本,更提高了系統的可靠性和保密性。另外,采用可編程邏輯器件開發的數字系統,方便地升級和改進。3.1 系統總框圖本系統的硬件部分主要由密碼鎖控制電路、密碼鎖顯示電路、LED顯示電路、報警電路、密碼更改與設置電路組成。整體系統框圖如下圖2.1所示。密碼鎖顯示電路密碼鎖顯示電路報警電路密碼鎖控制電路LED顯示電路密碼鎖總框圖3.2 密碼鎖的內部結構及主要功能3.2.1密碼鎖的主要功能密碼鎖控制器的主要功能有:(1)密碼輸入:有二個按鍵來控制(分別代表0和1),每按下一個鍵,要求在數碼管上顯示,并依次左移。(2)密碼校驗:如果有按鍵按下,直到松開該按鍵;紅綠燈指示門的狀態,也就是密碼校驗

5、結果,如果密碼校驗正確,綠亮起,否則如果密碼校驗錯誤紅燈亮,并鳳鳴器響,表明密碼錯誤。(3)錯誤報警:密碼輸入錯誤開始報警。(4)密碼修改:輸入密碼正確后4秒內按按鍵輸入要設置和更改的密碼,按按鍵確認密碼設置與更改,則密碼設置成功4 系統硬件電路4.1 密碼鎖的顯示模塊段數碼管是電子開發過程中常用的輸出顯示設備。在本設計中使用的是8個四位一體、共陰極型七段數碼管。其單個靜態數碼管如下圖所示。由于七段數碼管公共端連接到GND(共陰極型),當數碼管的中的一個段被輸入高電平,則相應的這一段被點亮。反之則不亮。共陽極性的數碼管與之相反。四位一體的七段數碼管在單個靜態數碼管的基礎上加入了用于選擇哪一位數

6、碼管的位選信號端口。八個數碼管的a、b、c、d、e、f、g、h、dp都連在了一起,8個數碼管分別由各自的位選信號來控制,被選通的數碼管顯示數據,其余關閉。4.2 密碼鎖控制模塊 該模塊的作用是將輸入的密碼 (暫時寄存于 ACC中)跟已經存儲的密碼(REG中的密碼信息)進行對比,如果一樣,則密碼鎖開鎖。而在通過密碼驗證后可以按按鍵設定密碼。在這里值得注意的是有一個密碼“0000”為開始密碼,如果改名密碼了但是又忘記了密碼,重新下載之后的初始密碼只要輸入的密碼為“0000”則都可通過密碼鎖。模塊lock是整個設計的核心 ,它實現密碼鎖的邏輯功能。在任何時候按動密碼初始化按鍵內密碼設置為程序初始化密

7、碼值(在本模塊程序中此值為 “0000”代碼為 4 位二進制數 ,當輸入代碼的位數和位值與鎖內給定的密碼一致 ,且按規定程序開鎖時 ,方可開鎖 ,并點亮開鎖指示燈(緑燈)亮。否則 ,系統進入 “錯誤”狀態 ,并發出報警信號。串行數字鎖的報警方式是點亮指示燈(紅燈) ,并使喇叭鳴叫 ,直到按下復位開關 ,報警才停止。此時 ,數字鎖又自動進入等待下一次開鎖的狀態。該 4 位串行電子密碼鎖設置 4 位二進制密碼 ,要求鎖內給定的密碼是可調的 ,且設置方便 ,保密性好。其具體操作分為輸入密碼和修改密碼兩部分4.2.1輸入密碼密碼輸入值的比較主要有兩部分 ,密碼位數和內容 ,任何一個條件不滿足 ,都不能

8、打開鎖。若鎖內密碼為 “0000” , key2 和 key1 置低電平 ,分別表示輸入 “1” 和 “0” 。輸入密碼前先進行復位操作 ,再按著從密碼最低位到最高位的順序依次正確輸入0000,會在數碼管逐一顯示。經檢驗 ,輸入的密碼 等于鎖內預先設置的密碼密碼鎖開啟信號,鎖開啟。同時,密碼修改控制信號rw置低電平。若在輸入密碼的過程中 ,4 位二進制密碼出現輸入錯誤 ,那么鎖不能開啟 ,同時 ,指示燈紅燈 亮 ,發出報警信號 。直到按下復位開關 ,報警才停止。此時 ,數字鎖又自動進入等待下一次開鎖的狀態。4.2.2修改密碼為防止任意進行密碼修改 ,必須在正確輸入密碼后 ,才能重新設置密碼。輸

9、入正確密碼后 ,鎖打開 ,同時 ,密碼修改控制信號按鍵rw 置低電平 ,就可直接進行修改密碼的操作。修改密碼實質就是用輸入的新密碼去取代原來的舊密碼, 按確定按鍵ok, 存儲新密碼時.5 VHDL程序設計密碼鎖控制器的各個功能模塊都是通過VHDL語言來完成的。本設計由密碼鎖顯示顯示模塊、分頻模塊、密碼輸入及校驗模塊、報警模塊、密碼更改與設置模塊幾部分組成,各模塊分工合作,最后達到密碼鎖控制器設計的要求。表4-1 程序的管腳分配表端口名對應FBGA管腳說明clkP2時鐘為50HzKey1AC23按下按鍵代表為“0”Key2AB21按下按鍵代表為“1”startY14開始輸入密碼okAA13確定輸

10、入密碼resetAC15復位rwV23該密碼clrU23清零redM19密碼錯誤紅燈亮greenT22密碼正確緑燈亮beepA14蜂鳴器Seg7.0D16,D17,G13,D15,C15,C16,G15,J13代表數碼管的片內顯示Dig7.0E15,K18,E22,C17,H15,K16,H12,D18代表數碼管的片外顯示VHDL程序總代碼library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity lock isport(key1,key

11、2:in std_logic; clk,start,ok,reset,rw,clr: in std_logic; red,green,beep:out std_logic:='1' dig:out std_logic_vector(7 downto 0); seg:out std_logic_vector(7 downto 0) );end lock;architecture rt1 of lock issignal keyin,password:std_logic_vector(3 downto 0):="0000"signal open1:std_log

12、ic:='0'signal beep1:std_logic:='1'signal a,shuru:std_logic;signal count: std_logic_vector(2 downto 0):="000"signal temp: std_logic_vector(1 downto 0):="00"beginprocess(clk)variable m:integer range 0 to 10; begin if clk'event and clk='1'then if m=9 then

13、 m:=0; a<='1' else m:=m+1; a<='0' end if; end if;end process;process(clk,start,ok,clr,rw,reset) begin if clk'event and clk='1'then if reset='0' then red<='1'green<='1'beep1<='1'open1<='0'keyin<="0000"s

14、huru<='0'count<="000" end if; if start='0' then shuru<='1' end if; if rw='0' and open1='1'then shuru<='1'count<="000" end if; if clr='0' then keyin<="0000"count<="000"shuru<='1

15、' elsif a='1' and shuru='1' then if key1='0' then keyin<=keyin(2 downto 0)&'0' elsif key2='0' then keyin<=keyin(2 downto 0)&'1' end if; if count="011" then shuru<='0' count<=count+1; else count<=count+1; end

16、 if; end if; if ok='0'and open1='0' then if (keyin=password)then red<='1'green<='0'open1<='1' else red<='0'green<='1'beep1<='0'open1<='0' end if; end if; if ok='0'and open1='1'then password&l

17、t;=keyin; end if; end if;end process;process(clk,start,ok,clr,rw,reset)variable g:integer range 0 to 49999999; begin if clk'event and clk='1'then if g=49999999 then g:=0; else g:=g+1; end if; if g<=24999999 and beep1='0' then beep<='0' else beep<='1' end

18、if; end if; end process;process(clk)variable n:integer range 0 to 50000; beginif clk'event and clk='1'then if n=49999 then n:=0; if temp="11"then temp<="00" else temp<=temp+1; end if; else n:=n+1; end if; if count="001" then case temp is when "00&

19、quot; => dig<="01111111" ; if keyin(0)='0'then seg<="11000000" else seg<="11111001"end if; when others =>seg<="11111111" ; end case ; elsif count="010" then case temp is when "00" => dig<="01111111"

20、 ; if keyin(1)='0'then seg<="11000000" else seg<="11111001"end if; when "01" => dig<="10111111" ; if keyin(0)='0'then seg<="11000000" else seg<="11111001"end if; when others =>seg<="11111111"

21、; ; end case ; elsif count="011" then case temp is when "00" => dig<="01111111" ; if keyin(2)='0'then seg<="11000000" else seg<="11111001"end if; when "01" => dig<="10111111" ; if keyin(1)='0'then

22、 seg<="11000000" else seg<="11111001"end if; when "10" => dig<="11011111" ; if keyin(0)='0'then seg<="11000000" else seg<="11111001"end if; when others =>seg<="11111111" ; end case ; elsif count=&qu

23、ot;100" then case temp is when "00" => dig<="01111111" ; if keyin(3)='0'then seg<="11000000" else seg<="11111001"end if; when "01" => dig<="10111111" ; if keyin(2)='0'then seg<="11000000"

24、else seg<="11111001"end if; when "10" => dig<="11011111" ; if keyin(1)='0'then seg<="11000000" else seg<="11111001"end if; when "11" => dig<="11101111" ; if keyin(0)='0'then seg<="11000

25、000" else seg<="11111001"end if; when others =>null; end case ; else dig<="11111111" ;seg<="11111111" end if;end if;end process ;end rt1; 6 系統仿真當各個模塊分別編譯成功后 ,則創建一個個元件符號。再用圖形編輯器將各元件模塊組裝起來 ,這就是本設計中最頂層的圖形設計文件。頂層圖形設計文件 lock. gdf 如圖所示 ,這個結構框圖說明了整個系統的外部輸入和輸出情況。為了獲得與目標器件對應的、 精確的時序仿真文件譯了。編譯成功后進行仿真。首先建立波形文件。波形文件 lock. scf 建好并存盤后 ,選擇菜單 “new” “Vector Waveform File”,啟動仿真操作 ,結束后觀察仿真波形。本設計中 ,仿真波形如圖所示。當給初始密碼輸入信號 LC 一個低電平時 ,就將程序預先設定的密碼( “0000” )裝入 lock 中 。按下 reset 后,系統復位 ,處于輸入密碼狀態。輸入的開鎖密碼串行順

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論