eda課程設(shè)計(jì)--電子密碼鎖_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  課 程 設(shè) 計(jì) 報(bào) 告 書</p><p>  題目 電子密碼鎖設(shè)計(jì) </p><p>  姓 名 XXX </p><p>  學(xué) 號(hào) XXX </p><p>  專業(yè)班級(jí) 電信 </p&g

2、t;<p>  指導(dǎo)教師 </p><p>  時(shí) 間 2013年 1月14日 </p><p><b>  課程設(shè)計(jì)任務(wù)書</b></p><p><b>  電子密碼鎖設(shè)計(jì)</b></p><p><b>  摘 要<

3、/b></p><p>  本文介紹了一種采用單片F(xiàn)PGA芯片進(jìn)行電子密碼鎖的設(shè)計(jì)方法,主要闡述如何使用新興的EDA器件取代傳統(tǒng)的電子設(shè)計(jì)方法,利用FPGA的可編程性,簡潔而又多變的設(shè)計(jì)方法,縮短了研發(fā)周期。電子密碼鎖是一種通過密碼輸入來控制電路或是芯片工作,從而控制機(jī)械開關(guān)的閉合,完成開鎖、閉鎖任務(wù)的電子產(chǎn)品。它的種類很多,有簡易的電路產(chǎn)品,也有基于芯片的性價(jià)比較高的產(chǎn)品。密碼鎖是以芯片為核心,通過編程來

4、實(shí)現(xiàn)的,其性能和安全性已大大超過了機(jī)械鎖。[1]該電子密碼鎖以Quartus II軟件平臺(tái)完成電子密碼鎖的功能設(shè)計(jì)和仿真,并在FPGA芯片EP1C12Q240C8和EDA V+開發(fā)系統(tǒng)上進(jìn)行功能驗(yàn)證。結(jié)果表明,該密碼鎖具有高安全性、操作簡單等特點(diǎn)。</p><p>  關(guān)鍵詞: FPGA;EDA;VHDL;電子密碼鎖</p><p><b>  目 錄</b><

5、;/p><p><b>  課程設(shè)計(jì)任務(wù)書I</b></p><p><b>  摘 要II</b></p><p><b>  1.設(shè)計(jì)概述4</b></p><p><b>  1.1設(shè)計(jì)背景4</b></p><p> 

6、 1.2 電子密碼鎖的發(fā)展前景4</p><p><b>  2.設(shè)計(jì)方案4</b></p><p>  2.1 輸入電路5</p><p>  2.2 控制模塊電路5</p><p>  2.3 顯示模塊電路6</p><p>  3.電子密碼鎖的實(shí)現(xiàn)6</p>

7、<p>  3.1 系統(tǒng)的總體原理圖6</p><p>  3.2 系統(tǒng)各模塊的實(shí)現(xiàn)6</p><p><b>  4.設(shè)計(jì)驗(yàn)證10</b></p><p>  4.1 軟件仿真10</p><p>  4.2 硬件驗(yàn)證11</p><p><b>  5.總結(jié)

8、12</b></p><p><b>  參考文獻(xiàn)13</b></p><p><b>  附錄源碼14</b></p><p><b>  1.設(shè)計(jì)概述</b></p><p><b>  1.1設(shè)計(jì)背景</b></p>&

9、lt;p>  隨著電子技術(shù)的發(fā)展,具有防盜報(bào)警功能的電子密碼鎖越來越受到人們的青睞,用其代替密碼量少、安全性差的機(jī)械密碼鎖已是必然趨勢。電子密碼鎖與普通機(jī)械鎖相比,具有無可比擬的優(yōu)越性,如保密性好、防盜性強(qiáng)、可以不用鑰匙記住密碼即可開鎖等。目前使用的密碼鎖大部分是基于單片機(jī)技術(shù),以單片機(jī)為主要器件,以軟件的方式生成編碼器和解碼器。而在實(shí)際應(yīng)用中,由于程序容易跑飛,使得系統(tǒng)的可靠性較差。基于FPGA器件的電子密碼鎖,所有算法完全由硬

10、件電路實(shí)現(xiàn),使得系統(tǒng)的可靠性大為提高。[2]</p><p>  1.2 電子密碼鎖的發(fā)展前景</p><p>  在當(dāng)今社會(huì)中,人們對(duì)于隱私的保護(hù)和對(duì)物品安全的重視程度與日俱增。因此,使用了現(xiàn)代電子技術(shù)的電子密碼鎖便有了廣泛的應(yīng)用前景。電子密碼鎖與普通機(jī)械密碼鎖相比,具有無可比擬的優(yōu)越性,如保密性好,防盜性強(qiáng),可以不用鑰匙記住密碼即開鎖等,密碼鎖的主要功能是用來對(duì)某些操作進(jìn)行加密保護(hù),目

11、的是避免無權(quán)人員使用,它的實(shí)際應(yīng)用十分廣泛,例如門卡系統(tǒng),自動(dòng)售貨機(jī),銀行自動(dòng)柜員機(jī)或者保險(xiǎn)柜中都含有這種密碼鎖,本次所設(shè)計(jì)的電子密碼鎖,能夠?qū)崿F(xiàn)該四位十進(jìn)制并行密碼保護(hù),當(dāng)輸入的密碼與鎖內(nèi)密碼一致時(shí),綠燈亮,開鎖;當(dāng)輸入的密碼與鎖內(nèi)的密碼不一致時(shí),紅燈亮,不能開鎖。密碼鎖的密碼可由用戶自行設(shè)置,并可在LED數(shù)碼管顯示屏上顯示所輸入的密碼。為人們的財(cái)產(chǎn)、信息安全提供了可靠地保障。[3]</p><p><b

12、>  2.設(shè)計(jì)方案</b></p><p>  圖2-1 方案系統(tǒng)框圖</p><p><b>  2.1 輸入電路</b></p><p>  作為電子密碼鎖的輸入模塊,課題選用的方案有按鍵來控制輸入和觸摸式鍵盤輸入等多種。本實(shí)驗(yàn)主要采用8*4矩陣鍵盤作為輸入電路。其主要分為以下三大模塊:</p><

13、p>  (1) 時(shí)序產(chǎn)生模塊:對(duì)主時(shí)鐘進(jìn)行分頻,提供各模塊的時(shí)鐘信號(hào)。</p><p>  (2) 按鍵去抖模塊:防止機(jī)械按鍵抖動(dòng)引起誤判。</p><p>  (3) 鍵盤掃描模塊:判斷鍵盤輸入的按鍵鍵值。</p><p>  2.2 控制模塊電路</p><p>  (1) 預(yù)置密碼寄存器:將密碼設(shè)置模式下輸入的密碼值保存。<

14、;/p><p>  (2) 比較模塊:將密碼輸入模式下輸入的密碼與預(yù)置密碼比較,判斷正誤。如果錯(cuò)誤三次則進(jìn)入報(bào)警模式。</p><p>  (3) 萬能密碼:避免忘記密碼引起的諸多麻煩。</p><p>  2.3 顯示模塊電路</p><p>  電子密碼鎖的顯示模塊電路可采用LED數(shù)碼管顯示和液晶屏顯示兩種,因液晶顯示屏成本高,適應(yīng)能力差,

15、所以采用LED數(shù)碼管顯示。</p><p>  (1) 顯示密碼:在密碼設(shè)置模式下顯示密碼數(shù)值。</p><p>  (2) 屏蔽密碼顯示:在密碼輸入狀態(tài)下屏蔽密碼顯示,以防密碼泄露。</p><p>  根據(jù)以上選定的輸入設(shè)備與顯示器件,并考慮現(xiàn)實(shí)各項(xiàng)密碼鎖功能的具體需求,與系統(tǒng)設(shè)計(jì)的要求,系統(tǒng)設(shè)計(jì)采用自頂向下的設(shè)計(jì)方案。</p><p>

16、  3.電子密碼鎖的實(shí)現(xiàn)</p><p>  3.1 系統(tǒng)的總體原理圖</p><p>  圖3-1 系統(tǒng)總體原理圖</p><p>  系統(tǒng)的總體框圖由FPGA作為中心控制模塊,時(shí)鐘輸入與鍵盤掃描輸入作為信號(hào)輸入,LED顯示模塊和報(bào)警模塊作為輸出。FPGA芯片采用Cyclone公司的EP1C12Q240C8作為主控模塊。</p><p>

17、;  3.2 系統(tǒng)各模塊的實(shí)現(xiàn)</p><p>  電子密碼鎖主要有輸入電路模塊、控制電路模塊、顯示電路模塊和報(bào)警電路模塊四個(gè)模塊。由于顯示模塊比較簡單,重點(diǎn)介紹輸入電路、控制電路和報(bào)警電路。</p><p>  3.2.1 時(shí)鐘輸入模塊</p><p>  系統(tǒng)采用1kHz時(shí)鐘作為主頻。因鍵盤掃描模塊的掃描頻率不宜過高,且LED顯示模塊為動(dòng)態(tài)掃描,因此采用1k

18、Hz時(shí)鐘作為系統(tǒng)主時(shí)鐘。</p><p>  3.2.2 鍵盤掃描模塊</p><p>  該系統(tǒng)的鍵盤輸入模塊為8*4矩陣鍵盤,該模塊又劃分為時(shí)鐘產(chǎn)生模塊、鍵盤消抖模塊、鍵盤掃描模塊三部分。</p><p>  (1) 時(shí)鐘產(chǎn)生模塊。該時(shí)鐘即為系統(tǒng)主時(shí)鐘1kHz,通過該時(shí)鐘的上升沿產(chǎn)生鍵盤掃描所需的時(shí)鐘。</p><p>  (2) 鍵盤

19、消抖模塊。鍵盤消抖模塊是鍵盤掃描中比較關(guān)鍵的部分。通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動(dòng),而這種會(huì)影響鍵盤掃描模塊。[4]如果不作消抖處理,在鍵盤抖動(dòng)期間獲取鍵值,則會(huì)造成鍵值的錯(cuò)誤或丟失,影響系統(tǒng)的穩(wěn)定性。</p><p>  鍵盤消抖分為硬件消抖和軟件消抖,由

20、于硬件消抖在開發(fā)板中難以實(shí)現(xiàn)的局限性,該系統(tǒng)采用的鍵盤消抖方式為軟件消抖:根據(jù)系統(tǒng)時(shí)鐘1kHz且通常的鍵盤抖動(dòng)時(shí)間為10毫秒左右,所以在程序中連續(xù)采樣十次均為同一鍵值時(shí),判定按下的按鍵已通過抖動(dòng)時(shí)間,即鍵值已經(jīng)穩(wěn)定,這時(shí)采樣的鍵值便為正確鍵值。若采樣計(jì)數(shù)器未到達(dá)規(guī)定數(shù)值,則不予獲取鍵值。</p><p>  (3) 鍵盤掃描模塊。鍵盤輸入模塊采用的是8*4矩陣鍵盤。該矩陣鍵盤行數(shù)為8,列數(shù)為4,且行掃描信號(hào)通過譯

21、碼芯片74HC138接入信號(hào)Sel3~Sel0。通過給Sel3~Sel0賦值“000”~“111”,行信號(hào)將依次產(chǎn)生“11111110”~“01111111”,由于列引腳通過5k的電阻上拉且矩陣鍵盤列信號(hào)和行信號(hào)的“線與”,當(dāng)行信號(hào)為低電平且該行有按鍵按下時(shí),按鍵所在的列信號(hào)將被拉為低電平,該信號(hào)輸入FPGA控制模塊,由核心控制模塊獲取列信號(hào)的值,即可判斷矩陣鍵盤被按下的鍵值,從而將數(shù)據(jù)發(fā)送LED顯示模塊進(jìn)行顯示。</p>

22、<p>  由于使用電子密碼鎖所需的按鍵為數(shù)不多,因此只需按鍵“0”到按鍵“F”,和功能按鍵“Ctrl”、“Esc”和“Enter”即可。</p><p>  掃描輸出信號(hào)Sel3~Sel0的值及相應(yīng)列信號(hào)返回值對(duì)應(yīng)的鍵值如下表所示。</p><p>  表3-1 矩陣鍵盤鍵值表[5]</p><p>  矩陣鍵盤功能鍵相應(yīng)功能如下表所示:</p

23、><p>  表3-2 功能鍵功能表</p><p>  3.2.3 FPGA控制模塊</p><p>  系統(tǒng)的核心部分FPGA模塊接收系統(tǒng)信號(hào)輸入,處理接收數(shù)據(jù),并為系統(tǒng)外設(shè)輸出信號(hào)。其中的關(guān)鍵部分是處理接受數(shù)據(jù)。該系統(tǒng)圍繞有限狀態(tài)機(jī)(FSM)進(jìn)行設(shè)計(jì),采用的有限狀態(tài)機(jī)類型為Mealy型狀態(tài)機(jī),狀態(tài)的切換不僅與當(dāng)前狀態(tài)有關(guān),并與輸入信號(hào)有關(guān)。下面列出了各狀態(tài)的名

24、稱以及特性。</p><p>  (1) 密碼輸入狀態(tài):當(dāng)前狀態(tài)為密碼輸入狀態(tài),由矩陣鍵盤中“0~F”為鍵值的按鍵進(jìn)行輸入,輸入過程中可按下“ESC”鍵進(jìn)行清除。輸入完成后按下“ENTER”鍵進(jìn)行輸入操作的完成,然后由FPGA判斷密碼輸入是否正確。</p><p>  (2) 密碼設(shè)置狀態(tài):當(dāng)前狀態(tài)為密碼設(shè)置狀態(tài)。在密碼輸入狀態(tài)下按下“CTRL”進(jìn)入該狀態(tài),同樣由矩陣鍵盤中“0~F”為鍵值

25、的按鍵進(jìn)行輸入,“ESC”鍵進(jìn)行已輸入值的清除。輸入完成下按下“ENTER”鍵進(jìn)行密碼設(shè)置的完成,重新進(jìn)入密碼輸入狀態(tài)。</p><p>  (3) 解鎖狀態(tài):當(dāng)前狀態(tài)為解鎖狀態(tài)。在密碼輸入完成后由FPGA將輸入的值與密碼預(yù)設(shè)值進(jìn)行比較,若輸入正確則進(jìn)入解鎖狀態(tài),若不正確則對(duì)錯(cuò)誤次數(shù)進(jìn)行計(jì)數(shù)。解鎖狀態(tài)將點(diǎn)亮解鎖指示燈。</p><p>  (4) 報(bào)警狀態(tài):當(dāng)前狀態(tài)為報(bào)警狀態(tài)。當(dāng)連續(xù)三次出

26、現(xiàn)錯(cuò)誤輸入后,將進(jìn)入該狀態(tài)。報(bào)警狀態(tài)將驅(qū)動(dòng)蜂鳴器報(bào)警,并且鎖定鍵盤。進(jìn)入該狀態(tài)后將無法進(jìn)入其他狀態(tài)。</p><p>  3.2.4 LED顯示模塊</p><p>  顯示模塊采用4位共陰極數(shù)碼管進(jìn)行顯示。在多位LED顯示時(shí),為了簡化電路,降低成本,將所有的段選線并聯(lián)在一起,段選碼,每送一次后延時(shí),因?yàn)槿搜垡曈X暫留時(shí)間100ms顯示間隙不超過20ms,并保持延時(shí)一段時(shí)間,以造成視覺暫留

27、效果,給人看上去每個(gè)數(shù)碼管都在亮。[6]</p><p>  (1) 密碼輸入狀態(tài):在密碼輸入狀態(tài)要求用特殊字符對(duì)密碼值進(jìn)行屏蔽,采用該位數(shù)碼管8段全亮的方法。</p><p>  (2) 密碼設(shè)置狀態(tài):在密碼設(shè)置狀態(tài)對(duì)已輸入的密碼值進(jìn)行顯示,以免產(chǎn)生用戶忘記密碼造成諸多不便的情況。</p><p><b>  4.設(shè)計(jì)驗(yàn)證</b></p

28、><p><b>  4.1 軟件仿真</b></p><p>  4.1.1 LED顯示模塊</p><p>  圖4-1 LED顯示模塊仿真波形</p><p>  使用Quartus II軟件對(duì)LED顯示模塊進(jìn)行時(shí)序仿真。如圖4-1所示,在每個(gè)時(shí)鐘信號(hào)的上升沿,4位數(shù)碼管的位選信號(hào)增加1,且數(shù)碼管的段選信號(hào)為相應(yīng)的數(shù)

29、值的段碼,實(shí)現(xiàn)了數(shù)碼管的動(dòng)態(tài)掃描功能。</p><p>  4.1.2 軟件按鍵去抖模塊</p><p>  圖4-2 軟件按鍵去抖模塊仿真波形</p><p>  圖4-2為軟件按鍵去抖模塊的仿真波形。該波形中的列選信號(hào)從高電平變?yōu)榈碗娖降倪^程中產(chǎn)生了大約8ms的抖動(dòng)。從圖中可以看出低電平計(jì)數(shù)器“Counter”在抖動(dòng)期間幾乎沒有計(jì)數(shù),而在抖動(dòng)消失之后計(jì)數(shù)器的值

30、到達(dá)5,系統(tǒng)此時(shí)取走鍵值,即四位密碼中的最高位取走鍵值。從圖中易觀察得到仿真波形中該次按鍵的鍵值為“9”,從而賦值給“Code3”,由“Word3”顯示其值。因此可以得出結(jié)論,該軟件去抖方法具有較好的效果,可以有效地去除鍵盤抖動(dòng)。</p><p>  4.1.3 鍵盤掃描模塊</p><p>  圖4-3 鍵盤掃描模塊仿真波形</p><p>  圖4-3為鍵盤掃描

31、模塊仿真波形。按下對(duì)應(yīng)按鍵,“Word3”由初始值“0”變?yōu)椤?”,同時(shí)數(shù)碼管的段選信號(hào)在位選信號(hào)為“011”時(shí)其值為“7F”,即共陰數(shù)碼管中數(shù)值“8”的段碼。此仿真波形可證明按鍵按下后系統(tǒng)可正確獲取鍵值并正確地顯示在數(shù)碼管上。</p><p>  經(jīng)過以上三步軟件仿真,可初步證明該設(shè)計(jì)的合理性和完整性。由于輸入時(shí)間超時(shí)等功能較簡單,可在硬件電路上直接驗(yàn)證,因此不再贅述。但是軟件仿真的成功不代表硬件電路的實(shí)現(xiàn),因

32、此在EDA V+試驗(yàn)箱連接硬件電路并驗(yàn)證實(shí)際電路的可行性。</p><p><b>  4.2 硬件驗(yàn)證</b></p><p>  圖4-4 密碼輸入狀態(tài)實(shí)圖</p><p>  圖4-5 密碼輸入正確狀態(tài)實(shí)圖</p><p>  經(jīng)驗(yàn)證和調(diào)試,該設(shè)計(jì)完成了電子密碼鎖的開鎖、解鎖、改密碼等基本功能。如圖4-4所示,該圖

33、為密碼輸入狀態(tài),未進(jìn)入輸入狀態(tài)的三位密碼均以數(shù)碼管8段全亮方式屏蔽。如圖4-5所示,該圖為密碼輸入正確狀態(tài),開發(fā)板左側(cè)LED指示燈點(diǎn)亮,說明密碼輸入無誤。當(dāng)用戶密碼連續(xù)三次輸入錯(cuò)誤時(shí),蜂鳴器報(bào)警并且鎖定鍵盤。超時(shí)功能為在密碼輸入或設(shè)置密碼狀態(tài)下5秒無輸入動(dòng)作時(shí),超時(shí)提示燈亮。萬能密碼為“FFFF”,該功能亦實(shí)現(xiàn)。在密碼設(shè)置狀態(tài)下顯示密碼值,在密碼輸入狀態(tài)下用數(shù)碼管八段全亮屏蔽密碼,即如上圖所示。經(jīng)過驗(yàn)證,證明該設(shè)計(jì)較好地完成了設(shè)計(jì)的要求

34、。</p><p><b>  5.總結(jié)</b></p><p>  這次EDA技術(shù)課程設(shè)計(jì)我們做的是電子密碼鎖的設(shè)計(jì)。在課程設(shè)計(jì)的過程中雖然碰到了諸多難題,但是在組員的努力下還是一一解決了。課程設(shè)計(jì)的完成度總體還差強(qiáng)人意,完成了課程設(shè)計(jì)的所有基本要求,另外在擴(kuò)展方面也做了一小部分,是一次非常有益的鍛煉。</p><p>  課程設(shè)計(jì)的總結(jié)有以

35、下幾點(diǎn)。首先是查找資料的過程,平時(shí)我們都習(xí)慣于直接在網(wǎng)上查找資料。但是網(wǎng)上的資料良莠不齊,難以辨別資料的好壞,因此選擇在圖書館查找資料和在維普網(wǎng)查找專業(yè)人士發(fā)表的期刊。我主要負(fù)責(zé)程序的編寫,在編程的過程中也是碰到了不少問題,比如矩陣鍵盤的掃描問題,VHDL的所有進(jìn)程是并發(fā)進(jìn)程,因此在控制其時(shí)序方面不如C語言那樣簡明和易于控制。這點(diǎn)是值得我們學(xué)習(xí)的,控制系統(tǒng)的復(fù)雜性和全局性也有利于編程能力的提升。同時(shí)也感謝指導(dǎo)老師的不吝指導(dǎo),幫助我們分析

36、和解決問題,在此過程中收益頗豐,讓我懂得了分析問題的循序漸進(jìn)是很重要的。當(dāng)碰到問題時(shí)不應(yīng)該盲目嘗試各種方法解決問題,而是應(yīng)該理性分析然后選擇最優(yōu)方案??傊@次課程設(shè)計(jì)讓我的研究能力又有了提高,是非常有益的。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 薛明明.VHDL設(shè)計(jì)電子密碼鎖[J].吉林省教育學(xué)院學(xué)報(bào).2012,28(10):148

37、-150</p><p>  [2] 曹昕燕.EDA技術(shù)實(shí)驗(yàn)與課程設(shè)計(jì)[M].第一版.北京:清華大學(xué)出版社,2006.117-119</p><p>  [3] 李秀霞.電子系統(tǒng)EDA設(shè)計(jì)實(shí)訓(xùn)[M].第一版.北京.北京航空航天大學(xué)出版社,2011.237-260</p><p>  [4] bankrate1.按鍵消抖[EB/OL].http://baike.bai

38、du.com/link?url=K5bBPgbznRydXAASg_cyYc</p><p>  GWcoUtp7AQig1QexDEmTqzGJ5j4P2rAhSxpH8sYEDkS1xjUjzLG5NSCx28wA3upq,2014.1.7</p><p>  [5] 鄒其洪.EDA技術(shù)實(shí)驗(yàn)教程[M].第一版.北京:中國電力出版社,2009.117-119</p><

39、;p>  [6] 李珍.基于FPGA的可靠性電子密碼鎖設(shè)計(jì)[J].現(xiàn)代電子技術(shù).2013,36(7):151-153</p><p><b>  附錄源碼</b></p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use

40、 ieee.std_logic_unsigned.all;</p><p>  entity Lock is</p><p>  port(Clock:in std_logic; --Main Clock Input:1KHz</p><p>  Column:in std_logic_vector(3 downt

41、o 0); --Matrix Keyboard Input</p><p>  LEDSegment:out std_logic_vector(7 downto 0); --LED Segment Selection</p><p>  Sel:buffer std_logic_vector(2 downto 0):="000"; --LED Positi

42、on Selection and Key Position</p><p>  Alarm,LED,NoticeLED:out std_logic:='0' ; --Wrong Code Input Warning and Unlock Signal</p><p>  Word0,Word1,Word2,Word3:out integer range 0 to 30;

43、</p><p>  Counter:out integer range 0 to 50000</p><p><b>  );</b></p><p>  end entity Lock;</p><p>  architecture bhv of Lock is</p><p>  Type

44、FSM_TypeDef is(</p><p>  InputState3,InputState2,InputState1,InputState0,InputStateDone,</p><p>  SetState0,SetState1,SetState2,SetState3,SetStateDone,</p><p>  UnlockState,WarningS

45、tate); --FSM Definition</p><p>  signal State:FSM_TypeDef:=InputState3;</p><p>  signal Set0,Set1,Set2,Set3:integer range 0 to 30:=15; --PreSet Code:"FFFF"</p><p>  si

46、gnal Code0,Code1,Code2,Code3:integer range 0 to 30:=0; --Code Input</p><p>  signal Show0,Show1,Show2,Show3:integer range 0 to 30; --Numbers Used to Display</p><p>  signal DivCounter:integer r

47、ange 0 to 500:=0; --Counter Used to Frequence Division</p><p>  signal KeyCounter:integer range 0 to 50000:=0;--Counter Used to Clear Keyboard Trembling</p><p>  signal KeyValue:integer range 0

48、 to 30; --KeyValue returned</p><p>  signal ErrorCounter:integer range 0 to 3:=0; --Error Times Counter</p><p>  signal EClock:std_logic;</p><p>  signal Loose:std_logic_vector(7

49、downto 0); --Signal Used to Judge Key Loosen or not</p><p>  signal NoticeCounter:integer range 0 to 5000:=0;--Input Overtime Counter</p><p>  function Decode(signal x:in integer range 0 to 30)-

50、-LED Decode Function</p><p>  return std_logic_vector is</p><p><b>  begin</b></p><p><b>  case x is</b></p><p>  when 0=>return x"3f&qu

51、ot;;</p><p>  when 1=>return x"06";</p><p>  when 2=>return x"5b";</p><p>  when 3=>return x"4f";</p><p>  when 4=>return x&qu

52、ot;66";</p><p>  when 5=>return x"6d";</p><p>  when 6=>return x"7d";</p><p>  when 7=>return x"07";</p><p>  when 8=>ret

53、urn x"7f";</p><p>  when 9=>return x"6f";</p><p>  when 10=>return x"77";</p><p>  when 11=>return x"7c";</p><p>  when

54、 12=>return x"39";</p><p>  when 13=>return x"5e";</p><p>  when 14=>return x"79";</p><p>  when 15=>return x"71";</p>&

55、lt;p>  when 20=>return x"40";</p><p>  when 30=>return x"ff";</p><p>  when 25=>return x"00";</p><p>  when others=>return x"40&quo

56、t;;</p><p><b>  end case;</b></p><p>  end function;</p><p><b>  BEGIN</b></p><p>  ----Assignments----</p><p>  Alarm<=

57、'1' when State=WarningState else</p><p><b>  '0';</b></p><p>  LED<='1' when State=UnlockState else</p><p><b>  '0';</b>&l

58、t;/p><p>  Show0<=20 when (((State=SetState0 or State=InputState0)and EClock='1') or State=UnlockState) else</p><p>  Set0 when (State=SetState3 or State=SetState2 or State=SetState1 or

59、 State=SetStateDone) else</p><p>  30 when (State=WarningState or State=InputState3 or State=InputState2 or State=InputState1 or State=InputStateDone) else</p><p>  25 when ((State=SetState0 or

60、 State=InputState0)and EClock='0') else</p><p>  20; -----UnlockState and WarningState</p><p>  Show1<=20 when (((State=SetState1 or State=InputState1)and EClock='1') or St

61、ate=UnlockState) else</p><p>  Set1 when (State=SetState3 or State=SetState2 or State=SetState0 or State=SetStateDone) else</p><p>  30 when (State=WarningState or State=InputState3 or State=In

62、putState2 or State=InputState0 or State=InputStateDone) else</p><p>  25 when ((State=SetState1 or State=InputState1)and EClock='0') else</p><p><b>  20;</b></p><

63、p>  Show2<=20 when (((State=SetState2 or State=InputState2)and EClock='1') or State=UnlockState) else</p><p>  Set2 when (State=SetState3 or State=SetState0 or State=SetState1 or State=SetStat

64、eDone) else</p><p>  30 when (State=WarningState or State=InputState3 or State=InputState0 or State=InputState1 or State=InputStateDone) else</p><p>  25 when ((State=SetState2 or State=InputSt

65、ate2)and EClock='0') else</p><p><b>  20;</b></p><p>  Show3<=20 when (((State=SetState3 or State=InputState3)and EClock='1') or State=UnlockState) else</p>

66、<p>  Set3 when (State=SetState0 or State=SetState2 or State=SetState1 or State=SetStateDone) else</p><p>  30 when (State=WarningState or State=InputState0 or State=InputState2 or State=InputState1

67、or State=InputStateDone) else</p><p>  25 when ((State=SetState3 or State=InputState3)and EClock='0') else</p><p><b>  20;</b></p><p>  Word0<=Show0;</p>

68、;<p>  Word1<=Show1;</p><p>  Word2<=Show2;</p><p>  Word3<=Show3;</p><p>  Counter<=KeyCounter;</p><p>  Division:process(Clock) --Clock Divsion Pr

69、ocess</p><p><b>  begin</b></p><p>  if Clock'event and Clock='1' then</p><p>  if DivCounter=250 then</p><p>  EClock<=not EClock;</p>

70、<p>  DivCounter<=0;</p><p><b>  else</b></p><p>  DivCounter<=DivCounter+1;</p><p><b>  end if;</b></p><p><b>  end if;</

71、b></p><p>  end process Division;</p><p>  MAIN:process(Clock) --Main Process</p><p><b>  begin</b></p><p>  if Clock'event and Clock='1' the

72、n</p><p>  -------Signal Sel Assignment Cycle-------</p><p>  if Sel="111" then</p><p>  Sel<="000";</p><p><b>  else</b></p>

73、<p>  Sel<=Sel+1;</p><p><b>  end if;</b></p><p>  KeyValue<=20;--KeyValue Initial Value Assignment</p><p>  case Sel is</p><p>  when &qu

74、ot;000"=>LEDSegment<=Decode(Show1);</p><p>  case Column is</p><p>  when "1110"=>KeyValue<=0; Loose<="00000000"; --KeyValue Returned</p><p

75、>  when "1101"=>KeyValue<=6; Loose<="00000000";</p><p>  when "1011"=>KeyValue<=20; Loose<="00000000";</p><p>  when "01

76、11"=>KeyValue<=16; Loose<="00000000";</p><p>  when "1111"=>Loose(0)<='1'; </p><p>  when others=>null;</p><p><b>  en

77、d case;</b></p><p>  when "001"=>LEDSegment<=Decode(Show2);</p><p>  case Column is</p><p>  when "1110"=>KeyValue<=1; Loose<="0000

78、0000";</p><p>  when "1101"=>KeyValue<=7; Loose<="00000000";</p><p>  when "1011"=>KeyValue<=20; Loose<="00000000";</p&g

79、t;<p>  when "0111"=>KeyValue<=20; Loose<="00000000";</p><p>  when "1111"=>Loose(1)<='1';</p><p>  when others=>null;</p>

80、;<p><b>  end case;</b></p><p>  when "010"=>LEDSegment<=Decode(Show3);</p><p>  case Column is</p><p>  when "1110"=>KeyValue<=2;

81、 Loose<="00000000";</p><p>  when "1101"=>KeyValue<=20; Loose<="00000000";</p><p>  when "1011"=>KeyValue<=12; Loose<=&qu

82、ot;00000000";</p><p>  when "0111"=>KeyValue<=20; Loose<="00000000";</p><p>  when "1111"=>Loose(2)<='1';</p><p>  when

83、 others=>null;</p><p><b>  end case;</b></p><p>  when "011"=>LEDSegment<=x"00";</p><p>  case Column is</p><p>  when "1

84、110"=>KeyValue<=3; Loose<="00000000";</p><p>  when "1101"=>KeyValue<=20; Loose<="00000000";</p><p>  when "1011"=>KeyVa

85、lue<=13; Loose<="00000000";</p><p>  when "0111"=>KeyValue<=20; Loose<="00000000";</p><p>  when "1111"=>Loose(3)<='1'

86、;;</p><p>  when others=>null;</p><p><b>  end case;</b></p><p>  when "100"=>LEDSegment<=x"00";</p><p>  case Column is</p

87、><p>  when "1110"=>KeyValue<=20; Loose<="00000000";</p><p>  when "1101"=>KeyValue<=8; Loose<="00000000";</p><p>  wh

88、en "1011"=>KeyValue<=14; Loose<="00000000";</p><p>  when "0111"=>KeyValue<=20; Loose<="00000000";</p><p>  when "1111"

89、;=>Loose(4)<='1';</p><p>  when others=>null;</p><p><b>  end case;</b></p><p>  when "101"=>LEDSegment<=x"00";</p>&l

90、t;p>  case Column is</p><p>  when "1110"=>KeyValue<=19; Loose<="00000000";</p><p>  when "1101"=>KeyValue<=9; Loose<="00000000&qu

91、ot;;</p><p>  when "1011"=>KeyValue<=15; Loose<="00000000";</p><p>  when "0111"=>KeyValue<=20; Loose<="00000000";</p>&l

92、t;p>  when "1111"=>Loose(5)<='1';</p><p>  when others=>null;</p><p><b>  end case;</b></p><p>  when "110"=>LEDSegment<=x&

93、quot;00";</p><p>  case Column is</p><p>  when "1110"=>KeyValue<=4; Loose<="00000000";</p><p>  when "1101"=>KeyValue<=10;

94、 Loose<="00000000";</p><p>  when "1011"=>KeyValue<=20; Loose<="00000000";</p><p>  when "0111"=>KeyValue<=20; Loose<="0

95、0000000";</p><p>  when "1111"=>Loose(6)<='1';</p><p>  when others=>null;</p><p><b>  end case;</b></p><p>  when "111

96、"=>LEDSegment<=Decode(Show0);</p><p>  case Column is</p><p>  when "1110"=>KeyValue<=5; Loose<="00000000";</p><p>  when "1101&quo

97、t;=>KeyValue<=11; Loose<="00000000";</p><p>  when "1011"=>KeyValue<=17; Loose<="00000000";</p><p>  when "0111"=>KeyValue<

98、;=20; Loose<="00000000";</p><p>  when "1111"=>Loose(7)<='1';</p><p>  when others=>null;</p><p><b>  end case;</b></p>

99、<p>  when others=>null;</p><p><b>  end case;</b></p><p>  if Loose="11111111" then --Means All Keys Loosen</p><p>  KeyCounter<=0;</p>&l

100、t;p>  ----Input Overtime Notice Detector----</p><p>  if(not (State=WarningState or State=UnlockState)) then</p><p>  NoticeCounter<=NoticeCounter+1;</p><p><b>  end if;

101、</b></p><p>  if (NoticeCounter=5000 and (not(State=WarningState or State=UnlockState))) then --Keyboard Input Overtime</p><p>  NoticeLED<='1';</p><p>  NoticeCoun

102、ter<=0;</p><p><b>  end if;</b></p><p>  elsif (State=WarningState or State=UnlockState) then</p><p>  NoticeLED<='0';</p><p>  NoticeCounter&

103、lt;=0;</p><p><b>  else</b></p><p>  NoticeLED<='0';</p><p>  NoticeCounter<=0;</p><p><b>  end if;</b></p><p>  if (

104、not (KeyValue=20)) then</p><p>  KeyCounter<=KeyCounter+1; ---A Delay For Key Pressed</p><p>  if KeyCounter=5 then ---Key Being Pressed Lasts 5ms</p><p>  cas

105、e State is</p><p>  when InputState3=>if (KeyValue=16) then</p><p>  State<=SetState3;</p><p>  elsif (not(KeyValue=17 or KeyValue=19)) then</p><p>  Code3<=Ke

106、yValue;</p><p>  State<=InputState2;</p><p><b>  end if;</b></p><p>  when InputState2=></p><p>  if KeyValue=19 then</p><p>  State<=

107、InputState3;</p><p>  elsif (KeyValue=16) then </p><p>  State<=SetState3;</p><p>  elsif (not (KeyValue=17)) then</p><p>  Code2<=KeyValue;</p><p> 

108、 State<=InputState1;</p><p><b>  end if;</b></p><p>  when InputState1=></p><p>  if KeyValue=19 then</p><p>  State<=InputState3;</p><p

109、>  elsif (KeyValue=16) then </p><p>  State<=SetState3;</p><p>  elsif (not (KeyValue=17)) then</p><p>  Code1<=KeyValue;</p><p>  State<=InputState0;</p

110、><p><b>  end if;</b></p><p>  when InputState0=></p><p>  if KeyValue=19 then</p><p>  State<=InputState3;</p><p>  elsif (KeyValue=16) the

111、n </p><p>  State<=SetState3;</p><p>  elsif (not (KeyValue=17)) then</p><p>  Code0<=KeyValue;</p><p>  State<=InputStateDone;</p><p><b>  

112、end if;</b></p><p>  when InputStateDone=></p><p>  if KeyValue=19 then</p><p>  State<=InputState3;</p><p>  elsif (KeyValue=16) then </p><p>

113、  State<=SetState3;</p><p>  elsif KeyValue=17 then</p><p>  if ((Code0=Set0 and Code1=Set1 and Code2=Set2 and Code3=Set3) or</p><p>  (Code0=15 and Code1=15 and Code2=15 and Cod

114、e3=15))then --Universal Code</p><p>  State<=UnlockState;</p><p>  ErrorCounter<=0;</p><p><b>  else</b></p><p>  ErrorCounter<=ErrorCounter+1;&l

115、t;/p><p>  if(ErrorCounter=2) then</p><p>  State<=WarningState;</p><p><b>  else</b></p><p>  State<=InputState3;</p><p><b>  end if;

116、</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  when SetState3=></p><p>  if (not(KeyValue=16 or KeyValue=17 or KeyValue=

117、19))then</p><p>  Set3<=KeyValue;</p><p>  State<=SetState2;</p><p><b>  end if;</b></p><p>  when SetState2=></p><p>  if KeyValue=19

118、 then</p><p>  State<=SetState3;</p><p>  elsif (not (KeyValue=16 or KeyValue=17))then</p><p>  Set2<=KeyValue;</p><p>  State<=SetState1;</p><p>

119、<b>  end if;</b></p><p>  when SetState1=></p><p>  if KeyValue=19 then</p><p>  State<=SetState3;</p><p>  elsif (not (KeyValue=16 or KeyValue=17))th

120、en</p><p>  Set1<=KeyValue;</p><p>  State<=SetState0;</p><p><b>  end if;</b></p><p>  when SetState0=></p><p>  if KeyValue=19 then&

121、lt;/p><p>  State<=SetState3;</p><p>  elsif (not (KeyValue=16 or KeyValue=17))then</p><p>  Set0<=KeyValue;</p><p>  State<=SetStateDone;</p><p><

122、;b>  end if;</b></p><p>  when SetStateDone=></p><p>  if KeyValue=19 then</p><p>  State<=SetState3;</p><p>  elsif KeyValue=17 then</p><p>

123、;  State<=InputState3;</p><p><b>  end if;</b></p><p>  when UnlockState=></p><p>  if KeyValue=19 then</p><p>  State<=InputState3;</p><

124、;p><b>  end if;</b></p><p>  when WarningState=>NULL; --Lock Keyboard</p><p>  when others => null;</p><p>  end case;</p><p><b>

125、;  end if;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process MAIN;</p><p>  end architecture bhv;</p><p&

溫馨提示

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

評(píng)論

0/150

提交評(píng)論