哈工大数字逻辑与数字系统设计大作业(数字密码锁)
哈工大2020數字邏輯大作業
1.設計要求
1.1 主要設計要求
(1)設計一個開鎖密碼至少為4位數字(或更多)的密碼鎖。
(2)當開鎖按扭開關(可設置8位或更多,其中只有4位有效,其余位為虛設)的輸入代碼等于所設密碼時啟動開鎖控制電路,并且用綠燈亮、紅燈滅表示開鎖狀態。
(3)從第一個按扭觸動后的5秒內若未能將鎖打開,則電路自動復位并發出報警信號,同時用綠燈滅、紅燈亮表示關鎖狀態。
1.2附加功能
(1)可以設置密碼,在解鎖狀態下通過設置密碼按鈕SP設置密碼。
(2)五秒計時采用倒計時(即從5s計時到0)的方式,將秒數顯示在開發板的七段數碼管上。五秒后發出警報(警示燈亮)。
(3)可以清空密碼輸入,重新輸入密碼(不中止計時器)。
(4)設置密碼及輸入密碼時,所鍵入的密碼均會顯示在開發板的七段數碼管上。
(5)輸入密碼錯誤、設置密碼成功、輸入密碼成功,均會有相應的提示燈亮。
2.工作原理及系統方框圖
2.1工作原理
根據系統功能來分析,可將整個系統分為以下4個主要功能模塊。
(1)編碼模塊:將輸入的4位密碼分別轉換成8421-BCD碼;
(2)存儲模塊:在設置密碼后,將密碼保存;
(3)比較模塊:將之后輸入的密碼和存儲的密碼進行比較;
(4)計時模塊:主要體現五秒倒計時的功能。
首先通過輸入端輸入密碼,進而通過編碼模塊將十進制的密碼轉化成8421-BCD碼進行保存,如果是設計密碼的狀態,則直接將密碼保存下來,否則在輸入4位密碼后調用比較模塊,將輸入的密碼與之前保存的密碼進行比較。一旦輸入的密碼與設置的密碼相等,則綠燈亮;否則,會有相應的指示燈閃爍表示輸入密碼錯誤。另外,在輸入的第一位密碼被讀取的瞬間,計時模塊啟動,5s倒計時開始。如果在倒計時期間成功解鎖,則立刻中止計時;如果倒計時結束后仍未解鎖,則密碼鎖進入鎖死狀態,同時警示燈亮起。
2.2系統框圖
系統的結構框圖如下圖所示。
3. 各部分模塊具體功能及設計思路
3.1編碼模塊
編碼模塊的核心功能是將輸入的十進制數(0~7)編碼為3位二進制數,功能類似于一個8-3編碼器,它的主要作用是為其他模塊提供數據來源。編碼模塊的輸入和輸出都是高電平有效的。
3.2存儲模塊
通過編碼模塊,我們已經將輸入的十進制數轉換成了二進制數。顯然,由于需要輸入4位密碼,也就是4個十進制數,我們就需要保存下4個3位二進制數。我們想通過4個3位寄存器來分別存儲這4個3位二進制數。但是,四位密碼是依次輸入的,這也就意味著4個寄存器是依次工作的,并且一次只能有一個寄存器工作。
這里的依次存儲功能可以通過一個4位計數器和一個2-4譯碼器的組合來實現。計數器負責選擇每位數,從 1-4 位計數。為了知道已經輸入幾位密碼而且依次準確地存儲,我們將計數器的時鐘端脈沖設置為密碼輸入端按下時產生的上升沿,用來驅動計數器,讓計數器從00記到11。進而將計數器的輸出端接到譯碼器的輸入端,并且將譯碼器的輸出端分別與4個寄存器的使能端相連接,從而完整實現分別使能四個寄存器,依次存儲的功能。
另外,要想使每次密碼輸入端按下時都產生一個脈沖,我們可以用或門來實現,開始時密碼輸入端都為低電平,只要有一個高電平輸入,輸出的時鐘信號就是高電平,計數器就向下計一個數。
另外為了便于用戶設置以及輸入密碼,每當用戶輸入一位密碼(無論是設置密碼時還是嘗試解鎖時),均有一個提示燈閃爍一下表示輸入成功。與此同時,用戶所輸入的密碼會通過開發板上的七段數碼管顯示出來,以便于用戶操作。
3.3比較模塊
比較模塊的核心工作是判斷輸入的密碼與存儲模塊存儲的密碼是否相同。我們設計了4個3位的數值比較器來實現比較的功能,如果當前輸入的3位二進制數與之前保存的數均相等,則輸出1(高電平)。因此,當每個比較器的輸出端都為1(表示數值相等)時,密碼正確。我們將4個輸出端用與門連接,當與門輸出1時綠燈亮。每輸入一位密碼,就會產生一個脈沖,從而觸發比較器的工作,依次輸入四個密碼如果都正確,那么密碼鎖就會打開。
一旦密碼正確,綠燈就會亮起,表示解鎖成功,與此同時計時器會停止計時,其他的所有指示燈均熄滅。而如果輸入的4位密碼有誤,會有指示燈閃爍以做出提示,此時計時器模塊不停止工作。
3.4計時模塊
計時模塊主要包括分頻器、計數器和顯示器,能準確通過7段數碼管顯示秒數,并且能在計時5s后,發出警告(alarm 警示燈亮),且使紅燈亮。此時,進入復位狀態(清空輸入,設置的密碼保存),即使輸入正確密碼也不能再使綠燈亮。
這里的計時5s可以通過計數器和分頻器的組合來實現,由于開發板的時鐘頻率是100Mhz,可以先將它分頻100M,然后計數器每計數1次就代表1s,并且通過一個多多譯碼器在7段數碼管上顯示對應的秒數。當輸入0~7數字中的任何一個(即開始輸入密碼)時,5秒倒計時開始,此時復位信號is_locked=0(低電平),其他模塊均可以正常工作。一旦5s倒計時結束,就把is_locked設置為1(高電平),即進入鎖死狀態,并且警示燈亮起。
4. 調試過程
4.1 計時器的調試
計時器的主要功能是5s倒計時,并且將秒數顯示在七段數碼管上。倒計時的功能其實相對容易,只要調整分頻參數即可實現。最需要調試的其實是計時器的啟動和終止,因為盡管計時器是一個相對獨立的模塊,它的開始和停止很大程度上受到輸入密碼的控制。
我們規定,在設置密碼的狀態下,計時器不會啟動;在嘗試解鎖時,輸入第一位密碼后,計時器啟動;輸入密碼正確時,計時器中止;倒計時結束后,計時器中止,如不手動復位,則計時器不再啟動。
上述功能我們是通過向計時器(timer)模塊傳遞一個start參數進行實現的。首先初始化start<=0。在任何時候,一旦sp== 1(即進入設置密碼狀態),start保持為0;而一旦密碼鎖已經上鎖,嘗試輸入密碼時,更改start<=1;如果倒計時未停止且解鎖成功,便立刻將start賦值為0,停止計時。這三種情況都比較好實現,相對復雜的是最后一種情況,即倒計時結束后,計時器需要立刻中止。因為start是傳入timer模塊的參數,所以在模塊內部是不能給start賦值的,正是這一點造成了這種情況的復雜性。不過由于計時器倒計時結束alarm便會變成高電平,我們可以在主模塊內部對alarm的值進行判斷,一旦alarm==1,則start<=1。
4.2 設置及輸入密碼的調試
我最初的設想是只要pw(輸入的密碼)值改變,并且是有效值,就把輸入轉為二進制后保存下來。但是這樣做存在一個致命的問題——對于一個reg類型的變量,verilog是不允許它在不同的兩個always語句塊中被賦值的,比如說我設置了一個clr按鈕,一旦按下就清空當前輸入的密碼,那么清空操作觸發的信號其實是posedge clr,這個操作改變了暫存密碼的幾個寄存器的值;而在always @(pw)語句塊中,肯定也需要修改這幾個寄存器的值,這就產生了矛盾。而如果將這兩個always語句塊合并,又與預期的功能不符,所以這個設想被否定了。
我在最后的代碼里采用的想法是將這幾個模塊的處理統一放在一個always @(div_clk)語句塊中,在語句塊里檢測sp,clr是否按下,pw是否有效等等。相對于之前的設想,這里對密碼輸入、clr操作等的檢測的靈敏度一定程度上都下降了,但卻能保證所有功能的正常實現。這里div_clk是對系統時鐘的一個分頻,這里分頻的目的是便于用戶輸入密碼——如果時鐘頻率過高,系統可能會一次讀入多個密碼;而如果頻率過低,輸入密碼、clr、sp操作的效率就會下降。而只要分頻合適,就能夠兼顧上述功能的實現。以下是分頻以及clr操作的部分代碼。
4.3 七段數碼管顯示的調試
七段數碼管在開發板的左上方,一共有8組數碼管。下圖是七段數碼管的實物圖。
但是在這8組數碼管下方只標出了兩組接口(圖中較大的矩形框),這表明一次最多使用兩個數碼管。另外,在調試中我發現如果只對這兩組接口進行賦值,七段數碼管是不會有任何顯示的,這就類似于數碼管沒有使能。經過更仔細的觀察,我發現在每個七段數碼管上方都有一個對應的接口(圖中較小的藍色矩形框),可以把這個看做數碼管的使能端,只有在對應接口輸入高電平數碼管才能正常工作。
4.4 各類指示燈的調試
整個系統里有6個指示燈——alarm(警示燈)、red(紅燈)、green(綠燈)、work(輸入有效)、sp_success(設置密碼成功)、fail(輸入密碼錯誤)。這些指示燈的設置一方面是便于用戶使用,另一方面也是便于調試。
指示燈的調試其實是對不同狀態的調試,指示燈不同代表密碼鎖進入了不同的狀態。以下是密碼鎖的幾個主要狀態以及對應指示燈的情況:
(1)復位狀態:密碼鎖啟動后的狀態——只有紅燈亮;
(2)設置或輸入密碼狀態:每輸入一個有效密碼——work燈閃爍一次;
(3)設置密碼成功狀態:設置密碼狀態下連續讀入4位有效密碼——sp_success燈閃爍一次;
(4)輸入密碼錯誤狀態:嘗試解鎖時輸入的4位密碼錯誤——fail燈閃爍一次;
(5)解鎖成功狀態——只有綠燈亮;
(6)鎖死狀態:倒計時結束——alarm燈亮。
在調試過程中,經常出現的問題是在控制相應燈亮起的同時會忽略關閉其他指示燈,這會造成很多指示燈同時亮起,導致對狀態辨別的困難。例如,一旦輸入密碼正確,便會進入解鎖狀態,綠燈亮起,但如果忘記對其他指示燈操作,很有可能紅燈也是亮起狀態,這就產生了一個沒有規定過的狀態。如果這時又按下了sp按鈕,綠燈就必須立馬熄滅,因為進入了設置密碼狀態。下面這段代碼展示的是在解鎖后對指示燈的配置。
5. 設計結論
我設計的電子密碼鎖有8個數字輸入端,能存儲4位密碼,可以設置、修改密碼,能夠用綠燈亮表示密碼輸入正確,警示燈亮表示鎖死。除了基本的功能外,我設計的電子密碼鎖還加入了一些對用戶進行提示的功能。例如,倒計時和輸入的密碼均可以通過七段數碼管顯示出來,用戶可以時刻了解到剩余的開鎖時間、輸入的密碼;為了防止用戶誤輸了密碼,我還增加了清空密碼輸入的clr按鈕,一旦按下就會清空密碼輸入;當設置密碼成功、嘗試輸入密碼錯誤時均會有相應指示燈亮起,以提示用戶。
在現有基礎上,密碼鎖還可以實現更多的功能。比如增加密碼的位數,又比如在設置密碼時也可以清空輸入,這些都是密碼鎖可以優化、改進的地方。
6. 設計心得與總結
(1)模塊化
將整個系統劃分成若干子模塊是非常重要的。模塊化的過程是對整個問題分析、理解的過程,也有助于理清整個問題的實現思路。盡管我最后的代碼并沒有完全依照模塊的劃分去實現,但是總的思路偏差不大。除此之外,模塊化還有一個好處在于如果想添加新的功能,只需要在相應模塊里修改即可,而無需考慮整個代碼。
(2)加注釋
在編寫一個較為復雜的工程時,及時地添加必要的注釋是很重要的。寫注釋不僅僅是為了讓別人看懂你的代碼,更重要的是為自己理清思路,也便于后續的修改。對我而言,我不是很擅長變量命名,所以我在每個變量后面都加上了注釋,如圖所示。
這樣一來,即使我一時忘記了某個變量的含義,也可以通過查看注釋很快回想起來。
而在主程序中,也可以在if語句、case語句后加上注釋,標明某段代碼的功能。
(3)仿真文件
仿真文件可以幫助我驗證某段代碼的正確性,但一旦代碼過多、輸入輸出變量個數過多,編寫仿真文件反而成了一件麻煩的事情。我采取的方法是只針對子模塊編寫仿真程序,而不對整個工程編寫仿真程序,因為那樣做不僅費時費力,而且一旦某個變量出錯還難以發現。
仿真文件測試通過也不能完全保證代碼的正確性。有的問題只有把程序燒到板子上的時候才能發現。比如七段數碼管的問題,如果只看仿真波形圖的話,不會有一點問題,但是在板子上一測試就會發現數碼管是不亮的,這時候才會發現問題所在。在板子上進行測試的另一個好處就是直觀,也更容易發現一些隱藏的問題。比如我的密碼鎖共有6個指示燈,如果只看仿真波形圖,很不直觀,也很難發現問題,而在板子上一測試就會發現有些指示燈沒控制好。
總結
這次的大作業很好的鍛煉了我獨立完成整個工程的能力。我收獲到的不僅是代碼的編寫、調試能力的提升,還有自信心的提升。
在代碼的編寫方面,我體會到了模塊化、添加注釋的重要性,其實這些都不會花費很多時間,但如果不去做的話就會給后續的調試帶去很大的麻煩。而代碼的調試也是很有講究的,在我看來,編寫仿真文件、看仿真波形是粗調,可以大致驗證代碼的正確性;驗證通過后再將代碼燒錄到板子上細調,如果直接燒到板子上調理論上也可以,不過若代碼錯誤較多,是不方便定位錯誤的。
在自信心方面,這次的大作業對我的自信心是一次很大的提升。剛看到這道題目的時候,我是沒有什么思路的。但經過細細分析,將問題逐漸分解,編寫子模塊的代碼,組合代碼等一系列過程后,我不但基本上完成了整個電子密碼鎖程序的編寫,而且很有成就感,對于解決類似工程問題的信心增加了。
參考文獻
[1] 李建軍,胡苗苗.基于FPGA的電子密碼鎖系統的設計[J].智能計算機與應用,2019(02): 187-188+192.
[2] 熊軍洲. 基于FPGA的電子密碼鎖控制電路設計[J].石家莊職業技術學院學報,2018(06): 11-15.
[3] 王俊博.關于FPGA的電子密碼鎖系統的設計[J].科學技術創新,2019(26):89-90.
[4] 康浩,葉翔,王建國,鄢夢林,楊斐.基于FPGA的智能電子密碼鎖的設計[J].湖北理工學院學報,2014(03):45-49.
[5] 肖萌萌.電子密碼鎖控制電路設計[J].黑龍江科技信息,2017(15):38.
附錄
附錄一:總體設計圖
附錄二:各模塊仿真截圖
以下為各個模塊的仿真結果截圖。
附錄三:組員所做工作說明
所有工作均由本人獨立完成。
總結
以上是生活随笔為你收集整理的哈工大数字逻辑与数字系统设计大作业(数字密码锁)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @interface List
- 下一篇: source-map