名稱:vivado數(shù)字密碼鎖verilog帶詳細設(shè)計報告ego1開發(fā)板驗證(代碼在文末下載)
軟件:VIVADO
語言:Verilog
代碼功能:
1.設(shè)計一個開鎖密碼至少為4位數(shù)字的密碼鎖。
2.當開鎖按鍵開關(guān)(可設(shè)置為8位或更多,其中只有4位有效,其余為虛設(shè))的輸入代碼等于所設(shè)密碼時啟動開鎖控制電路,用F1燈亮,F(xiàn)2燈滅表示開鎖狀態(tài),并用數(shù)碼管顯示英文大寫的OP。
3.從第一個按鍵觸動后的10秒內(nèi)若未能將鎖打開,則電路自動復位,同時用F1燈滅,F(xiàn)2燈亮表示關(guān)鎖狀態(tài),并用數(shù)碼管顯示英文大寫LC。
4.10秒開鎖倒計時要求用數(shù)碼管顯示。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在ego1開發(fā)板驗證,開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
演示視頻:
設(shè)計報告:
一、設(shè)計要求
1. 設(shè)計一個開鎖密碼至少為4位數(shù)字的密碼鎖
2. 當開鎖按鍵開關(guān)(可設(shè)置為8位或更多,其中只有4位有效,其余為虛設(shè))的輸入代碼等于所設(shè)密碼時啟動開鎖控制電路,用F1燈亮,F(xiàn)2燈滅表示開鎖狀態(tài),并用數(shù)碼管顯示英文大寫的OP
3. 從第一個按鍵觸動后的10秒內(nèi)若未能將鎖打開,則電路自動復位,同時用F1燈滅,F(xiàn)2燈亮表示關(guān)鎖狀態(tài),并用數(shù)碼管顯示英文大寫LC
4. 10秒開鎖倒計時要求用數(shù)碼管顯示
二、工作原理及系統(tǒng)方框圖
根據(jù)設(shè)計要求,采用Verilog代碼設(shè)計,代碼采用自頂向下的設(shè)計方法,分為頂層模塊和子模塊,頂層模塊調(diào)用子模塊。子模塊包括按鍵消抖模塊,密碼輸入模塊,密碼控制模塊,密碼重置模塊,數(shù)碼管顯示模塊。頂層模塊負責將上述模塊調(diào)用并連接,最終形成完整的密碼鎖控制系統(tǒng),實現(xiàn)設(shè)計要求。
整體設(shè)計采用狀態(tài)機進行控制,通過按鍵控制狀態(tài)機的跳轉(zhuǎn),不同狀態(tài)對應(yīng)不同的功能及輸出。其中按鍵消抖模將外輸入的按鍵進行消抖,防止按鍵誤操作;密碼輸入模塊通過密碼輸入按鍵輸入開鎖密碼;密碼控制模塊為主控模塊,內(nèi)部包含狀態(tài)機,通過整體及控制整體流程,比如開鎖輸入密碼、倒計時、開鎖、關(guān)鎖、修改密碼燈狀態(tài)。密碼重置模塊用于在修改密碼狀態(tài)下更新密碼鎖的開鎖密碼;數(shù)碼管顯示模塊通過控制8個數(shù)碼管,顯示倒計時、開關(guān)鎖狀態(tài)、輸入密碼值等功能。
系統(tǒng)方框圖如下圖所示:
上圖中,key_jitter為按鍵消抖模塊,mima_input為密碼輸入模塊,reset_password為密碼重置模塊,mimasuo_ctrl為密碼鎖控制模塊,display為顯示模塊。
三、各部分具體模塊及設(shè)計思路
3.1 按鍵消抖模塊
按鍵消抖模塊用于對按鍵進行消抖,按鍵所用開關(guān)為機械彈性開關(guān),當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。按鍵抖動如下圖所示:
機械式按鍵的抖動次數(shù)、抖動時間、抖動波形都是隨機的。不同類型的按鍵其最長抖動時間也有差別,抖動時間的長短和按鍵的機械特性有關(guān),按鍵輸出的信號的跳變時間(上升沿和下降沿)最大是在20ms左右。按鍵消抖的關(guān)鍵是提取穩(wěn)定的低電平(或高電平)狀態(tài),濾除按鍵穩(wěn)定前后的抖動脈沖。
3.2 密碼鎖控制模塊
密碼鎖控制模塊用于對密碼鎖的整體功能進行控制,控制采用狀態(tài)機的方式。一個分為6個狀態(tài),分別是s_lock,s_compare,s_pass,s_error,s_modify,s_keyin;s_lock表示鎖定狀態(tài),s_compare表示比較輸入的密碼和正確的密碼,s_pass表示密碼正確,s_error表示密碼錯誤,s_modify表示修改密碼,s_keyin表示密碼輸入狀態(tài)。系統(tǒng)初始處于鎖定狀態(tài)(s_lock),若按下密碼輸入按鍵,則進入密碼輸入狀態(tài)(s_keyin),此時開始倒計時,當?shù)褂嫊r結(jié)束還未輸入完成,則跳轉(zhuǎn)到鎖定狀態(tài)(s_lock),否則跳轉(zhuǎn)到s_compare狀態(tài)比較輸入的密碼和正確的密碼。若密碼正確,則進入s_pass狀態(tài),否則進入s_error狀態(tài)。在pass狀態(tài)下,若按下修改按鍵,則進入修改密碼狀態(tài)(s_modify)。在修改密碼狀態(tài)下,可以再次輸入密碼,按下確認鍵后即修改完成,狀態(tài)機回到s_pass狀態(tài)。狀態(tài)轉(zhuǎn)移圖如下圖所示:
3.3密碼輸入模塊
密碼輸入模塊用于控制密碼輸入,密碼輸入采用移位的方式,首先定義一個16bit的信號,表示4位數(shù)的密碼,每個密碼為4bit,采用BCD碼表示。當按下按鍵時,將對應(yīng)的鍵值賦值到信號的最低位,同時將原先的第11~0位左移到第15~4位。即每次按下按鍵后,密碼都會整體左移一位,新輸入的數(shù)字位于最低位。
3.4密碼重置模塊
密碼重置模塊用于在修改密碼的狀態(tài)下,將新輸入的數(shù)字替換為密碼鎖的密碼。在改模塊下,首先需要定義一個初始密碼,本系統(tǒng)設(shè)置為3210。當檢測到狀態(tài)進入修改密碼狀態(tài)后,將輸入的密碼賦值為當前的正確密碼即完成了密碼的修改。本模塊的前提是在控制模塊內(nèi)已經(jīng)是系統(tǒng)正確進入了修改密碼狀態(tài)。
3.5數(shù)碼管顯示模塊
數(shù)碼管顯示模塊用于控制數(shù)碼管對應(yīng)值顯示出來,顯示內(nèi)容有倒計時,LC/OP狀態(tài),輸入密碼值等。數(shù)碼管顯示使用動態(tài)掃描的方式,依次顯示頻率的不同位。使用8段數(shù)碼管顯示,每個數(shù)碼管輸入為8位,對應(yīng)下圖中的abcdefg7段加上小數(shù)點dp,當輸入1時對應(yīng)的段點亮,當輸入為0時,對應(yīng)的段滅。
根據(jù)上圖可以觀察到,若要顯示數(shù)字0,需要DP滅,G滅,ABCDEF亮,也就是對應(yīng)編碼為“00111111”,其中從左到右依次對應(yīng)DP-GFEDCBA。以此類推可以得到0~9的所有編碼。一共有8個數(shù)碼管,每4個數(shù)碼管共用一組段選信號(dig_led),因此為了同時顯示8個數(shù)碼管,需要對8個數(shù)碼管依次切換,控制位選信號(wei_led)按順序循環(huán)選通,低電平時對應(yīng)數(shù)碼管點亮。
四、調(diào)試過程
4.1 按鍵消抖模塊
代碼編譯無誤后,對按鍵消抖模塊進行仿真,仿真圖如下圖所示:
按鍵消抖的原理為先檢測按鍵是否按下,即圖中pp信號,在按鍵變化的瞬間會產(chǎn)生一個脈沖信號,根據(jù)這個脈沖信號進行計時,計時夠20ms左右時,再采集穩(wěn)定的按鍵信號,本模塊仿真時,為便于快速仿真,將計時20ms省去,最終輸出為key_negedge信號,改信號表示按鍵消抖后的按鍵下降沿。圖中可以看到,按鍵按下的時候,輸出了一個下降沿脈沖信號,故該模塊驗證正確。
4.2 密碼輸入模塊
代碼編譯無誤后,對密碼輸入模塊進行仿真,密碼輸入模塊的核心為數(shù)字按下后,對應(yīng)的密碼要整體左移一位。仿真圖如下圖所示:
上圖中,key0~3表示按鍵按下,password表示輸入的密碼值,可以看到當依次按下key3,2,1,0后,password顯示0003,0032,0321,3210。因此代碼正確的實現(xiàn)了按鍵輸入和數(shù)字移位的功能。
4.3 密碼鎖控制模塊
代碼編譯無誤后,對密碼鎖控制模塊進行仿真,控制模塊使用狀態(tài)機控制,根據(jù)按鍵控制和倒計時值的不同控制狀態(tài)的跳轉(zhuǎn),下圖中仿真了按鍵開鎖、改密碼、重新開鎖的過程。圖中state信號即為狀態(tài)機的狀態(tài)值,password為輸入的密碼值,correct_password為正確密碼,down_cnt為倒計時,led_open為開鎖指示信號。
圖中,復位后,依次按下密碼3210,時密碼鎖打開,led_open變?yōu)楦唠娖剑缓蟀聪滦薷拿艽a按鍵modify,進入修改狀態(tài),此時輸入0123,并確認,將密碼鎖密碼修改為0123,然后再按下關(guān)鎖鍵關(guān)鎖。此時再輸入3210后無法開鎖,led_open保持低電平。重新輸入0123后按下確認鍵,密碼鎖打開,led_open變?yōu)楦唠娖?。在此期間,down_cnt在第一次輸入密碼時開始倒計時。根據(jù)上圖可以驗證密碼鎖控制模塊功能正確。
4.4 密碼重置模塊
代碼編譯無誤后,對密碼重置模塊進行仿真,下圖中,current_state信號即為狀態(tài)機的狀態(tài)值,password為輸入的密碼值,correct_password為正確密碼。
對上述仿真圖進行分析,當current_state為4時,表示進入修改密碼狀態(tài),此時若確認按鍵按下,會將當前輸入的數(shù)字修改為密碼鎖的密碼。圖中可以看到,current_state為4時有一個確認按鍵的脈沖,此時correct_password立刻變?yōu)閜assword的值,即從3210變?yōu)?123。因此驗證該功能正確。
4.5 數(shù)碼管顯示模塊
代碼編譯無誤后,對數(shù)碼管顯示模塊進行仿真,數(shù)碼管一共有8個,分為2組,每組有一對位選(wei_led)和段選(dig_led)信號。下圖中可以看到位選(wei_led)信號是依次選中(高電平),即在某一時刻只有一個數(shù)碼管顯示,然后再切換位下一個數(shù)碼管,當切換速度夠快時,人眼就認為是所有數(shù)碼管同時顯示了。
數(shù)碼管顯示內(nèi)容有倒計時,LC/OP狀態(tài),輸入密碼值等,以上圖中黃色標線處為例,此時第一組的最左邊數(shù)碼管亮,顯示值為00111001,根據(jù)數(shù)碼管從左到右依次對應(yīng)DP-GFEDCBA的順序,可知當前該數(shù)碼管顯示的內(nèi)容為“C”,即當前位鎖定狀態(tài)。通過該方法,可以分析其他數(shù)碼管顯示內(nèi)容,經(jīng)過分析,該模塊可以在8個數(shù)碼管上依次顯示倒計時,LC/OP狀態(tài)以及輸入密碼值。
4.6 整體仿真
分模塊仿真完成后,對系統(tǒng)進行狀態(tài)仿真,仿真圖如下所示:
圖中可以看到,復位后,依次按下密碼3210,時密碼鎖打開,開鎖燈亮,然后按下修改密碼按鍵modify,進入修改狀態(tài),此時輸入0123,并確認,將密碼鎖密碼修改為0123,然后再按下關(guān)鎖鍵關(guān)鎖,關(guān)鎖燈亮。此時再輸入3210后無法開鎖,關(guān)鎖燈亮。重新輸入0123后按下確認鍵,密碼鎖打開,開鎖燈亮。在此期間,down_cnt在第一次輸入密碼時開始倒計時。根據(jù)上圖可以驗證整體功能正確。
五、設(shè)計結(jié)論
本設(shè)計根據(jù)設(shè)計要求,結(jié)合Verilog語言的設(shè)計規(guī)范,使用VIVADO設(shè)計軟件,采用分模塊的設(shè)計思路,對每個模塊的功能進行劃分和編程調(diào)試,最終完成了4位密碼鎖的設(shè)計。代碼編譯無誤,且分別進行了單模塊仿真和系統(tǒng)整體仿真,仿真了各項功能指標,均正確。最后對該設(shè)計的輸入輸出端口進行管腳分配后,成功下載到EGO1的板子上進行了實物驗證,分別觀察了輸入密碼,修改密碼,倒計時,開關(guān)鎖指示燈,數(shù)碼管顯示等功能。實驗表明,系統(tǒng)能按設(shè)計的方式運行,與仿真的功能一致,達到了設(shè)計要求。
六、設(shè)計總結(jié)
本設(shè)計根據(jù)設(shè)計要求,結(jié)合本次設(shè)計要求,該課題從軟件實現(xiàn)平臺的學習到程序的設(shè)計、仿真、下載和調(diào)試,實現(xiàn)了4位密碼鎖的設(shè)計。
在開發(fā)期間,學習了關(guān)于密碼鎖的知識,對Verilog語言有了深刻地了解與掌握,并對VIVADO軟件有了深入的了解。
運用VIVADO軟件,基于Verilog的密碼鎖設(shè)計,完成了以下工作:
針對4位密碼鎖的總體框圖劃分成幾個相對獨立的模塊,然后對各個模塊在開發(fā)環(huán)境中進行編程和調(diào)試。
對每個模塊單獨進行分析設(shè)計,并在VIVADO中進行了功能仿真。
在設(shè)計的過程中,對擁有固定意義的信號統(tǒng)一命名,并在代碼中進行注釋(包括但不限于低/高有效),方便多個信號連接時應(yīng)用,同時也將一些常用的模塊定義為單獨模塊(按鍵消抖),以便共享和復用,使設(shè)計具有可重用性和可移植性,提高工作效率。
各個模塊都調(diào)試成功后將各個模塊連接起來總體調(diào)試,按照總體的設(shè)計圖進行集成調(diào)試。
4位密碼鎖的仿真及實驗結(jié)果表明密碼鎖達到了設(shè)計的功能要求。
參考文獻:
[1]李晶皎, 李景宏. 曹陽. 邏輯與數(shù)字系統(tǒng)設(shè)計(M) .北京: 清華大學出版社, 2018.
[2]周潤景, 蘇良碧著. 基于Quartus II的FPGA/CPLD數(shù)字系統(tǒng)設(shè)計[M]. 北京: 電子工業(yè)出版社, 2013.
[3] 葉淑群,陳鴻鵬,梁士坤.實現(xiàn)基于FPGA的硬件算法加速器[J].寶雞文理學院學報(自然科學版),2006(02):154-155+168.
[4] 丁黃勝,陸生禮,田淵,吳旭凡.基于FPGA的HMAC_SHA1_96算法設(shè)計與實現(xiàn)[J].半導體技術(shù),2003(06):25-28+32.
[5] 房寶光. FPGA在OCD系統(tǒng)中模擬算法的加速應(yīng)用[D].電子科技大學,2013.
部分代碼展示:
//密碼鎖 module?mimasuo( input?clk,//時鐘 input?reset,//-復位 //數(shù)字輸入按鍵 input?key_0,//--SW0 input?key_1,//--SW1 input?key_2,//--SW2 input?key_3,//--SW3 input?key_4,//--(虛設(shè)) input?key_5,//--(虛設(shè)) input?key_6,//--(虛設(shè)) input?key_7,//--(虛設(shè)) input?confirm_key,//-確認鍵--S0 input?modify_key,//--修改--S1 input?lock_up_key,//--上鎖--S2 output?led_open,//開鎖,燈 output?led_close,//關(guān)鎖,燈 output????????[7:0]?dig_led_1, ?output????????[3:0]?wei_led_1,? ?output????????[7:0]?dig_led_2, ?output????????[3:0]?wei_led_2//高電平點亮,高電平選通 ); wire?key_0_p; wire?key_1_p; wire?key_2_p; wire?key_3_p; wire?[2:0]?current_state; wire?[15:0]?password; wire?[15:0]?correct_password; wire?confirm; wire?modify; wire?lock_up; wire?[3:0]?down_cnt;//10秒倒計時 wire?open; assign?led_close=~open; assign?led_open=open; //上升沿檢測 key_jitter?i1_key_jitter( .?clkin(clk),???? .?key_in(confirm_key),//輸入 .?key_posedge(),//消抖后按鍵上升沿 .?key_negedge(confirm),//消抖后按鍵下降沿 .?key_value()//消抖后按鍵 ); //上升沿檢測 key_jitter?i2_key_jitter( .?clkin(clk),???? .?key_in(modify_key),//輸入 .?key_posedge(),//消抖后按鍵上升沿 .?key_negedge(modify),//消抖后按鍵下降沿 .?key_value()//消抖后按鍵 ); //上升沿檢測 key_jitter?i3_key_jitter( .?clkin(clk),???? .?key_in(lock_up_key),//輸入 .?key_posedge(),//消抖后按鍵上升沿 .?key_negedge(lock_up),//消抖后按鍵下降沿 .?key_value()//消抖后按鍵 ); //密碼輸入模塊 mima_input?i_mima_input( .?clk(clk), .?key_0(key_0), .?key_1(key_1), .?key_2(key_2), .?key_3(key_3), .?key_0_p(key_0_p), .?key_1_p(key_1_p), .?key_2_p(key_2_p), .?key_3_p(key_3_p), .?current_state(current_state), .?password(password) ); //密碼鎖控制模塊 mimasuo_ctrl?i_mimasuo_ctrl( .?clk(clk), .?password(password), .?correct_password(correct_password), .?confirm(confirm), .?reset(reset), .?modify(modify), .?lock_up(lock_up), .?key_0(key_0_p), .?key_1(key_1_p), .?key_2(key_2_p), .?key_3(key_3_p), .?down_cnt(down_cnt),//10秒倒計時 .?led_open(open), .?current_state(current_state) ); //重置密碼模塊 reset_password?i_reset_password( .?clk(clk), .?password(password), .?correct_password(correct_password), .?confirm(confirm), .?current_state(current_state) ); //顯示模塊 display?i_display( .clk(clk), .down_cnt(down_cnt), .?current_state(current_state),//當前狀態(tài) .?password(password),//輸入密碼 .?dig_led_1(dig_led_1), .?wei_led_1(wei_led_1),??? .?dig_led_2(dig_led_2), .?wei_led_2(wei_led_2)//高電平點亮,高電平選通 ); endmodule
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=313