• 方案介紹
    • 一、設(shè)計(jì)要求
    • 二、工作原理及系統(tǒng)方框圖
    • 三、各部分具體模塊及設(shè)計(jì)思路
    • 四、調(diào)試過程
    • 五、設(shè)計(jì)結(jié)論
    • 六、設(shè)計(jì)總結(jié)
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

vivado數(shù)字密碼鎖verilog帶詳細(xì)設(shè)計(jì)報(bào)告ego1開發(fā)板驗(yàn)證

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

名稱:vivado數(shù)字密碼鎖verilog帶詳細(xì)設(shè)計(jì)報(bào)告ego1開發(fā)板驗(yàn)證(代碼在文末下載)

軟件:VIVADO

語言:Verilog

代碼功能:

1.設(shè)計(jì)一個(gè)開鎖密碼至少為4位數(shù)字的密碼鎖。

2.當(dāng)開鎖按鍵開關(guān)(可設(shè)置為8位或更多,其中只有4位有效,其余為虛設(shè))的輸入代碼等于所設(shè)密碼時(shí)啟動(dòng)開鎖控制電路,用F1燈亮,F(xiàn)2燈滅表示開鎖狀態(tài),并用數(shù)碼管顯示英文大寫的OP。

3.從第一個(gè)按鍵觸動(dòng)后的10秒內(nèi)若未能將鎖打開,則電路自動(dòng)復(fù)位,同時(shí)用F1燈滅,F(xiàn)2燈亮表示關(guān)鎖狀態(tài),并用數(shù)碼管顯示英文大寫LC。

4.10秒開鎖倒計(jì)時(shí)要求用數(shù)碼管顯示。

FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com

本代碼已在ego1開發(fā)板驗(yàn)證,開發(fā)板如下,其他開發(fā)板可以修改管腳適配:

ego1開發(fā)板.png

演示視頻:

設(shè)計(jì)報(bào)告:

一、設(shè)計(jì)要求

1. 設(shè)計(jì)一個(gè)開鎖密碼至少為4位數(shù)字的密碼鎖

2. 當(dāng)開鎖按鍵開關(guān)(可設(shè)置為8位或更多,其中只有4位有效,其余為虛設(shè))的輸入代碼等于所設(shè)密碼時(shí)啟動(dòng)開鎖控制電路,用F1燈亮,F(xiàn)2燈滅表示開鎖狀態(tài),并用數(shù)碼管顯示英文大寫的OP

3. 從第一個(gè)按鍵觸動(dòng)后的10秒內(nèi)若未能將鎖打開,則電路自動(dòng)復(fù)位,同時(shí)用F1燈滅,F(xiàn)2燈亮表示關(guān)鎖狀態(tài),并用數(shù)碼管顯示英文大寫LC

4. 10秒開鎖倒計(jì)時(shí)要求用數(shù)碼管顯示

二、工作原理及系統(tǒng)方框圖

根據(jù)設(shè)計(jì)要求,采用Verilog代碼設(shè)計(jì),代碼采用自頂向下的設(shè)計(jì)方法,分為頂層模塊和子模塊,頂層模塊調(diào)用子模塊。子模塊包括按鍵消抖模塊,密碼輸入模塊,密碼控制模塊,密碼重置模塊,數(shù)碼管顯示模塊。頂層模塊負(fù)責(zé)將上述模塊調(diào)用并連接,最終形成完整的密碼鎖控制系統(tǒng),實(shí)現(xiàn)設(shè)計(jì)要求。

整體設(shè)計(jì)采用狀態(tài)機(jī)進(jìn)行控制,通過按鍵控制狀態(tài)機(jī)的跳轉(zhuǎn),不同狀態(tài)對應(yīng)不同的功能及輸出。其中按鍵消抖模將外輸入的按鍵進(jìn)行消抖,防止按鍵誤操作;密碼輸入模塊通過密碼輸入按鍵輸入開鎖密碼;密碼控制模塊為主控模塊,內(nèi)部包含狀態(tài)機(jī),通過整體及控制整體流程,比如開鎖輸入密碼、倒計(jì)時(shí)、開鎖、關(guān)鎖、修改密碼燈狀態(tài)。密碼重置模塊用于在修改密碼狀態(tài)下更新密碼鎖的開鎖密碼;數(shù)碼管顯示模塊通過控制8個(gè)數(shù)碼管,顯示倒計(jì)時(shí)、開關(guān)鎖狀態(tài)、輸入密碼值等功能。

系統(tǒng)方框圖如下圖所示:

上圖中,key_jitter為按鍵消抖模塊,mima_input為密碼輸入模塊,reset_password為密碼重置模塊,mimasuo_ctrl為密碼鎖控制模塊,display為顯示模塊。

三、各部分具體模塊及設(shè)計(jì)思路

3.1 按鍵消抖模塊

按鍵消抖模塊用于對按鍵進(jì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),為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。按鍵抖動(dòng)如下圖所示:

機(jī)械式按鍵的抖動(dòng)次數(shù)、抖動(dòng)時(shí)間、抖動(dòng)波形都是隨機(jī)的。不同類型的按鍵其最長抖動(dòng)時(shí)間也有差別,抖動(dòng)時(shí)間的長短和按鍵的機(jī)械特性有關(guān),按鍵輸出的信號(hào)的跳變時(shí)間(上升沿和下降沿)最大是在20ms左右。按鍵消抖的關(guān)鍵是提取穩(wěn)定的低電平(或高電平)狀態(tài),濾除按鍵穩(wěn)定前后的抖動(dòng)脈沖。

3.2 密碼鎖控制模塊

密碼鎖控制模塊用于對密碼鎖的整體功能進(jìn)行控制,控制采用狀態(tài)機(jī)的方式。一個(gè)分為6個(gè)狀態(tài),分別是s_lock,s_compare,s_pass,s_error,s_modify,s_keyin;s_lock表示鎖定狀態(tài),s_compare表示比較輸入的密碼和正確的密碼,s_pass表示密碼正確,s_error表示密碼錯(cuò)誤,s_modify表示修改密碼,s_keyin表示密碼輸入狀態(tài)。系統(tǒng)初始處于鎖定狀態(tài)(s_lock),若按下密碼輸入按鍵,則進(jìn)入密碼輸入狀態(tài)(s_keyin),此時(shí)開始倒計(jì)時(shí),當(dāng)?shù)褂?jì)時(shí)結(jié)束還未輸入完成,則跳轉(zhuǎn)到鎖定狀態(tài)(s_lock),否則跳轉(zhuǎn)到s_compare狀態(tài)比較輸入的密碼和正確的密碼。若密碼正確,則進(jìn)入s_pass狀態(tài),否則進(jìn)入s_error狀態(tài)。在pass狀態(tài)下,若按下修改按鍵,則進(jìn)入修改密碼狀態(tài)(s_modify)。在修改密碼狀態(tài)下,可以再次輸入密碼,按下確認(rèn)鍵后即修改完成,狀態(tài)機(jī)回到s_pass狀態(tài)。狀態(tài)轉(zhuǎn)移圖如下圖所示:

3.3密碼輸入模塊

密碼輸入模塊用于控制密碼輸入,密碼輸入采用移位的方式,首先定義一個(gè)16bit的信號(hào),表示4位數(shù)的密碼,每個(gè)密碼為4bit,采用BCD碼表示。當(dāng)按下按鍵時(shí),將對應(yīng)的鍵值賦值到信號(hào)的最低位,同時(shí)將原先的第11~0位左移到第15~4位。即每次按下按鍵后,密碼都會(huì)整體左移一位,新輸入的數(shù)字位于最低位。

3.4密碼重置模塊

密碼重置模塊用于在修改密碼的狀態(tài)下,將新輸入的數(shù)字替換為密碼鎖的密碼。在改模塊下,首先需要定義一個(gè)初始密碼,本系統(tǒng)設(shè)置為3210。當(dāng)檢測到狀態(tài)進(jìn)入修改密碼狀態(tài)后,將輸入的密碼賦值為當(dāng)前的正確密碼即完成了密碼的修改。本模塊的前提是在控制模塊內(nèi)已經(jīng)是系統(tǒng)正確進(jìn)入了修改密碼狀態(tài)。

3.5數(shù)碼管顯示模塊

數(shù)碼管顯示模塊用于控制數(shù)碼管對應(yīng)值顯示出來,顯示內(nèi)容有倒計(jì)時(shí),LC/OP狀態(tài),輸入密碼值等。數(shù)碼管顯示使用動(dòng)態(tài)掃描的方式,依次顯示頻率的不同位。使用8段數(shù)碼管顯示,每個(gè)數(shù)碼管輸入為8位,對應(yīng)下圖中的abcdefg7段加上小數(shù)點(diǎn)dp,當(dāng)輸入1時(shí)對應(yīng)的段點(diǎn)亮,當(dāng)輸入為0時(shí),對應(yīng)的段滅。

根據(jù)上圖可以觀察到,若要顯示數(shù)字0,需要DP滅,G滅,ABCDEF亮,也就是對應(yīng)編碼為“00111111”,其中從左到右依次對應(yīng)DP-GFEDCBA。以此類推可以得到0~9的所有編碼。一共有8個(gè)數(shù)碼管,每4個(gè)數(shù)碼管共用一組段選信號(hào)(dig_led),因此為了同時(shí)顯示8個(gè)數(shù)碼管,需要對8個(gè)數(shù)碼管依次切換,控制位選信號(hào)(wei_led)按順序循環(huán)選通,低電平時(shí)對應(yīng)數(shù)碼管點(diǎn)亮。

四、調(diào)試過程

4.1 按鍵消抖模塊

代碼編譯無誤后,對按鍵消抖模塊進(jìn)行仿真,仿真圖如下圖所示:

按鍵消抖的原理為先檢測按鍵是否按下,即圖中pp信號(hào),在按鍵變化的瞬間會(huì)產(chǎn)生一個(gè)脈沖信號(hào),根據(jù)這個(gè)脈沖信號(hào)進(jìn)行計(jì)時(shí),計(jì)時(shí)夠20ms左右時(shí),再采集穩(wěn)定的按鍵信號(hào),本模塊仿真時(shí),為便于快速仿真,將計(jì)時(shí)20ms省去,最終輸出為key_negedge信號(hào),改信號(hào)表示按鍵消抖后的按鍵下降沿。圖中可以看到,按鍵按下的時(shí)候,輸出了一個(gè)下降沿脈沖信號(hào),故該模塊驗(yàn)證正確。

4.2 密碼輸入模塊

代碼編譯無誤后,對密碼輸入模塊進(jìn)行仿真,密碼輸入模塊的核心為數(shù)字按下后,對應(yīng)的密碼要整體左移一位。仿真圖如下圖所示:

上圖中,key0~3表示按鍵按下,password表示輸入的密碼值,可以看到當(dāng)依次按下key3,2,1,0后,password顯示0003,0032,0321,3210。因此代碼正確的實(shí)現(xiàn)了按鍵輸入和數(shù)字移位的功能。

4.3 密碼鎖控制模塊

代碼編譯無誤后,對密碼鎖控制模塊進(jìn)行仿真,控制模塊使用狀態(tài)機(jī)控制,根據(jù)按鍵控制和倒計(jì)時(shí)值的不同控制狀態(tài)的跳轉(zhuǎn),下圖中仿真了按鍵開鎖、改密碼、重新開鎖的過程。圖中state信號(hào)即為狀態(tài)機(jī)的狀態(tài)值,password為輸入的密碼值,correct_password為正確密碼,down_cnt為倒計(jì)時(shí),led_open為開鎖指示信號(hào)。

圖中,復(fù)位后,依次按下密碼3210,時(shí)密碼鎖打開,led_open變?yōu)楦唠娖剑缓蟀聪滦薷拿艽a按鍵modify,進(jìn)入修改狀態(tài),此時(shí)輸入0123,并確認(rèn),將密碼鎖密碼修改為0123,然后再按下關(guān)鎖鍵關(guān)鎖。此時(shí)再輸入3210后無法開鎖,led_open保持低電平。重新輸入0123后按下確認(rèn)鍵,密碼鎖打開,led_open變?yōu)楦唠娖健T诖似陂g,down_cnt在第一次輸入密碼時(shí)開始倒計(jì)時(shí)。根據(jù)上圖可以驗(yàn)證密碼鎖控制模塊功能正確。

4.4 密碼重置模塊

代碼編譯無誤后,對密碼重置模塊進(jìn)行仿真,下圖中,current_state信號(hào)即為狀態(tài)機(jī)的狀態(tài)值,password為輸入的密碼值,correct_password為正確密碼。

對上述仿真圖進(jìn)行分析,當(dāng)current_state為4時(shí),表示進(jìn)入修改密碼狀態(tài),此時(shí)若確認(rèn)按鍵按下,會(huì)將當(dāng)前輸入的數(shù)字修改為密碼鎖的密碼。圖中可以看到,current_state為4時(shí)有一個(gè)確認(rèn)按鍵的脈沖,此時(shí)correct_password立刻變?yōu)閜assword的值,即從3210變?yōu)?123。因此驗(yàn)證該功能正確。

4.5 數(shù)碼管顯示模塊

代碼編譯無誤后,對數(shù)碼管顯示模塊進(jìn)行仿真,數(shù)碼管一共有8個(gè),分為2組,每組有一對位選(wei_led)和段選(dig_led)信號(hào)。下圖中可以看到位選(wei_led)信號(hào)是依次選中(高電平),即在某一時(shí)刻只有一個(gè)數(shù)碼管顯示,然后再切換位下一個(gè)數(shù)碼管,當(dāng)切換速度夠快時(shí),人眼就認(rèn)為是所有數(shù)碼管同時(shí)顯示了。

數(shù)碼管顯示內(nèi)容有倒計(jì)時(shí),LC/OP狀態(tài),輸入密碼值等,以上圖中黃色標(biāo)線處為例,此時(shí)第一組的最左邊數(shù)碼管亮,顯示值為00111001,根據(jù)數(shù)碼管從左到右依次對應(yīng)DP-GFEDCBA的順序,可知當(dāng)前該數(shù)碼管顯示的內(nèi)容為“C”,即當(dāng)前位鎖定狀態(tài)。通過該方法,可以分析其他數(shù)碼管顯示內(nèi)容,經(jīng)過分析,該模塊可以在8個(gè)數(shù)碼管上依次顯示倒計(jì)時(shí),LC/OP狀態(tài)以及輸入密碼值。

4.6 整體仿真

分模塊仿真完成后,對系統(tǒng)進(jìn)行狀態(tài)仿真,仿真圖如下所示:

圖中可以看到,復(fù)位后,依次按下密碼3210,時(shí)密碼鎖打開,開鎖燈亮,然后按下修改密碼按鍵modify,進(jìn)入修改狀態(tài),此時(shí)輸入0123,并確認(rèn),將密碼鎖密碼修改為0123,然后再按下關(guān)鎖鍵關(guān)鎖,關(guān)鎖燈亮。此時(shí)再輸入3210后無法開鎖,關(guān)鎖燈亮。重新輸入0123后按下確認(rèn)鍵,密碼鎖打開,開鎖燈亮。在此期間,down_cnt在第一次輸入密碼時(shí)開始倒計(jì)時(shí)。根據(jù)上圖可以驗(yàn)證整體功能正確。

五、設(shè)計(jì)結(jié)論

本設(shè)計(jì)根據(jù)設(shè)計(jì)要求,結(jié)合Verilog語言的設(shè)計(jì)規(guī)范,使用VIVADO設(shè)計(jì)軟件,采用分模塊的設(shè)計(jì)思路,對每個(gè)模塊的功能進(jìn)行劃分和編程調(diào)試,最終完成了4位密碼鎖的設(shè)計(jì)。代碼編譯無誤,且分別進(jìn)行了單模塊仿真和系統(tǒng)整體仿真,仿真了各項(xiàng)功能指標(biāo),均正確。最后對該設(shè)計(jì)的輸入輸出端口進(jìn)行管腳分配后,成功下載到EGO1的板子上進(jìn)行了實(shí)物驗(yàn)證,分別觀察了輸入密碼,修改密碼,倒計(jì)時(shí),開關(guān)鎖指示燈,數(shù)碼管顯示等功能。實(shí)驗(yàn)表明,系統(tǒng)能按設(shè)計(jì)的方式運(yùn)行,與仿真的功能一致,達(dá)到了設(shè)計(jì)要求。

六、設(shè)計(jì)總結(jié)

本設(shè)計(jì)根據(jù)設(shè)計(jì)要求,結(jié)合本次設(shè)計(jì)要求,該課題從軟件實(shí)現(xiàn)平臺(tái)的學(xué)習(xí)到程序的設(shè)計(jì)、仿真、下載和調(diào)試,實(shí)現(xiàn)了4位密碼鎖的設(shè)計(jì)。

在開發(fā)期間,學(xué)習(xí)了關(guān)于密碼鎖的知識(shí),對Verilog語言有了深刻地了解與掌握,并對VIVADO軟件有了深入的了解。

運(yùn)用VIVADO軟件,基于Verilog的密碼鎖設(shè)計(jì),完成了以下工作:

針對4位密碼鎖的總體框圖劃分成幾個(gè)相對獨(dú)立的模塊,然后對各個(gè)模塊在開發(fā)環(huán)境中進(jìn)行編程和調(diào)試。

對每個(gè)模塊單獨(dú)進(jìn)行分析設(shè)計(jì),并在VIVADO中進(jìn)行了功能仿真。

在設(shè)計(jì)的過程中,對擁有固定意義的信號(hào)統(tǒng)一命名,并在代碼中進(jìn)行注釋(包括但不限于低/高有效),方便多個(gè)信號(hào)連接時(shí)應(yīng)用,同時(shí)也將一些常用的模塊定義為單獨(dú)模塊(按鍵消抖),以便共享和復(fù)用,使設(shè)計(jì)具有可重用性和可移植性,提高工作效率。

各個(gè)模塊都調(diào)試成功后將各個(gè)模塊連接起來總體調(diào)試,按照總體的設(shè)計(jì)圖進(jìn)行集成調(diào)試。

4位密碼鎖的仿真及實(shí)驗(yàn)結(jié)果表明密碼鎖達(dá)到了設(shè)計(jì)的功能要求。

參考文獻(xiàn):

[1]李晶皎, 李景宏. 曹陽. 邏輯與數(shù)字系統(tǒng)設(shè)計(jì)(M) .北京: 清華大學(xué)出版社, 2018.

[2]周潤景, 蘇良碧著. 基于Quartus II的FPGA/CPLD數(shù)字系統(tǒng)設(shè)計(jì)[M]. 北京: 電子工業(yè)出版社, 2013.

[3] 葉淑群,陳鴻鵬,梁士坤.實(shí)現(xiàn)基于FPGA的硬件算法加速器[J].寶雞文理學(xué)院學(xué)報(bào)(自然科學(xué)版),2006(02):154-155+168.

[4] 丁黃勝,陸生禮,田淵,吳旭凡.基于FPGA的HMAC_SHA1_96算法設(shè)計(jì)與實(shí)現(xiàn)[J].半導(dǎo)體技術(shù),2003(06):25-28+32.

[5] 房寶光. FPGA在OCD系統(tǒng)中模擬算法的加速應(yīng)用[D].電子科技大學(xué),2013.

部分代碼展示:

//密碼鎖
module?mimasuo(
input?clk,//時(shí)鐘
input?reset,//-復(fù)位
//數(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,//-確認(rèn)鍵--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//高電平點(diǎn)亮,高電平選通
);
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秒倒計(jì)時(shí)
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秒倒計(jì)時(shí)
.?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),//當(dāng)前狀態(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)//高電平點(diǎn)亮,高電平選通
);
endmodule

點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=313

相關(guān)推薦