此程序目前只能仿真實現(xiàn),稍作修改便可以做成實物。
EDA課程設(shè)計報告 課程設(shè)計名稱:電子密碼鎖 院系:機械與電子信息工程系 專業(yè):電子信息工程 班級:1430402 學(xué)號:20143*0228 姓名:吳*琴 指導(dǎo)老師:蔡*民
2017年6月 利用基于所學(xué)EDA相關(guān)知識以Quartus II 軟件設(shè)計一個具有較高安全性和較低成本的通用電子密碼鎖,其具體功能要求如下: - 密碼輸入:每按下一個數(shù)字鍵,就輸入一個數(shù)值,并在顯示器上的最左方顯示‘*’號,輸入第二個數(shù)值后,最左方顯示兩個‘*’號,直到輸入完8位數(shù)值密碼后,顯示器上顯示出8個‘*’號。輸入完成8位數(shù)值密碼后,輸入的數(shù)值無效。
- 密碼清除:按下此鍵可以撤銷前一次輸入的密碼。
- 密碼更改:在開鎖狀態(tài)下按下此鍵時會將目前的數(shù)字設(shè)定成新的密碼,其它狀態(tài)密碼更改無效。
- 解除電鎖:按下此鍵會檢查輸入的密碼是否正確,密碼正確即開鎖。
- 警報:密碼在連續(xù)三次輸入錯誤之后,電子密碼鎖會發(fā)出警報。
- 新建工程dianzimimasuo
- 新建Verilog HDL File
選擇菜單File,選擇New選項,根據(jù)所使用的硬件描述語言類型選擇相應(yīng)的新建文件型(Verilog HDL File)。 三.任務(wù)分析和設(shè)計方案 作為通用電子密碼鎖,主要由三個部分組成:數(shù)字密碼輸入電路,密碼鎖控制電路和密碼顯示電路。 各個模塊電路的選取: (1)4x4矩陣鍵盤的工作原理:矩陣鍵盤又稱為行列式鍵盤,它是由4條行線,4條列線組成的鍵盤,其原理如圖1.1所示,在行線和列線的每個交叉點上,設(shè)置一個按鍵,按鍵的個數(shù)是4x4個,按鍵排列如圖1.2所示。當(dāng)按下某個按鍵后,為了辨別和讀取鍵值信息,一般采用如下的方法:向X端口掃描輸入一組只含一個0的4位數(shù)據(jù),如1110,1101,1011,0111,如有按鍵按下,則Y口一定會輸出對應(yīng)的數(shù)據(jù),因此,只要結(jié)合X,Y口的數(shù)據(jù),就能判斷按鍵的位置。
1.002.jpg (21.41 KB, 下載次數(shù): 173)
下載附件
2017-6-28 16:20 上傳
圖1.1 4x4矩陣鍵盤電路
(圖片詳見51hei附件)
圖1.2按鍵排列 (2)4x4矩陣鍵盤檢測程序:如下是用Verilog編寫的4x4矩陣鍵盤鍵值掃描判斷程序,鍵盤掃描程序由1個always模塊構(gòu)成,在always模塊中先進行模4計數(shù),在計數(shù)器的每個狀態(tài)從FPGA內(nèi)部送出一列掃描數(shù)據(jù)給鍵盤,然后讀入經(jīng)過去抖處理的4行數(shù)據(jù),根據(jù)行,列數(shù)據(jù),確定按下的是哪個鍵。 //按鍵模塊 module scankey(clk,a,b,keyvalue); input clk; //鍵盤掃描時鐘信號 input [3:0]b; output reg[3:0]a; //輸出掃描信號給鍵盤 output reg [3:0]keyvalue; reg [1:0]q; reg [3:0] qdb;//消抖后的b reg [3:0]rxbuf; always @( posedge clk) begin //按鍵消抖 rxbuf[0] <= b[0]; qdb[0] <= ~(rxbuf[0] & (~b[0])); end always @( posedge clk) begin //按鍵消抖 rxbuf[1] <= b[1]; qdb[1] <= ~(rxbuf[1] & (~b[1])); end always @( posedge clk) begin //按鍵消抖 rxbuf[2] <= b[2]; qdb[2] <= ~(rxbuf[2] & (~b[2])); end always @( posedge clk) begin //按鍵消抖 rxbuf[3] <= b[3]; qdb[3] <= ~(rxbuf[3] & (~b[3])); end always@(posedge clk) begin q<=q+1; case(q) //給a口送出掃描數(shù)據(jù) 0:a<=4'b1110; 1:a<=4'b1101; 2:a<=4'b1011; 3:a<=4'b0111; endcase case({a,qdb}) //判斷鍵值 8'b1110_0111:keyvalue<=4'b0000; //key0 8'b1110_1011:keyvalue<=4'b0001; //key1 8'b1110_1101:keyvalue<=4'b0010; 8'b1110_1110:keyvalue<=4'b0011; 8'b1101_0111:keyvalue<=4'b0100; 8'b1101_1011:keyvalue<=4'b0101; 8'b1101_1101:keyvalue<=4'b0110; 8'b1101_1110:keyvalue<=4'b0111; 8'b1011_0111:keyvalue<=4'b1000; 8'b1011_1011:keyvalue<=4'b1001; //key9 8'b1011_1101:keyvalue<=4'b1010; //keyA 8'b1011_1110:keyvalue<=4'b1011; 8'b0111_0111:keyvalue<=4'b1100; 8'b0111_1011:keyvalue<=4'b1101; 8'b0111_1101:keyvalue<=4'b1110; //keyE 8'b0111_1110:keyvalue<=4'b1111; //keyF default:keyvalue=8'b1111_1111; endcase end Endmodule - 密碼顯示電路采用8個七段數(shù)碼管顯示密碼輸入狀態(tài),綠色發(fā)光二極管指示鎖的開閉狀態(tài),黃色發(fā)光二極管指示密碼修改成功與否,紅色發(fā)光二極管指示警報狀態(tài)。
- 密碼鎖控制電路采用EP4CE10F17C8芯片控制。
根據(jù)以上選定的輸入設(shè)備和顯示器件,并考慮到實現(xiàn)各項數(shù)字密碼鎖功能的具體要求,整個電子密碼鎖系統(tǒng)的總體組成框圖如圖1.3所示。 (1)密碼鎖輸入電路包括時序產(chǎn)生電路,鍵盤掃描電路,鍵盤彈跳消除電路,鍵盤譯碼電路等幾個小的功能電路。 (2)密碼鎖控制電路包括按鍵數(shù)據(jù)的緩沖存儲電路,密碼的清除,變更,存儲,密碼核對(數(shù)值比較電路),解鎖電路(開/關(guān)門鎖電路)等幾個小的功能電路。 (3)七段數(shù)碼管顯示電路主要將待顯示數(shù)據(jù)的BCD碼轉(zhuǎn)換成數(shù)碼器的七段顯示驅(qū)動編碼。 (詳見51hei附件)
密碼控制電路 顯示電路 七段數(shù)碼管 圖1.3數(shù)字電子密碼鎖系統(tǒng)總體框圖 總體設(shè)計方案: 采用主,從兩個狀態(tài)機來完成8位電子密碼鎖設(shè)計。 主狀態(tài)機用來完成waits(等待)狀態(tài),pass(開鎖)狀態(tài),changing(改密)狀態(tài),alarm(警報)狀態(tài)之間的切換。主狀態(tài)機狀態(tài)圖如圖2.1所示 (詳見51hei附件) 圖2.1主狀態(tài)機 主狀態(tài)機簡要說明:復(fù)位鍵(Resetb)為0,進入等待(waits)狀態(tài);主現(xiàn)狀態(tài)為等待狀態(tài)且correct為1,主狀態(tài)進入開鎖(pass)狀態(tài);在開鎖狀態(tài)延時10s后,主狀態(tài)回到等待狀態(tài);主現(xiàn)態(tài)為開鎖狀態(tài)且mimagaile為1,主狀態(tài)進入改密(changing)狀態(tài);在改密狀態(tài)延時10s后,主狀態(tài)回到等待狀態(tài);主現(xiàn)態(tài)為等待狀態(tài)且密碼連續(xù)輸入錯誤3次,主狀態(tài)進入警報(alarm)狀態(tài);在警報狀態(tài)延時1分鐘后,主狀態(tài)回到等待狀態(tài)。 從狀態(tài)機用于輸入8位密碼,程序如下: always@(posedge clk or negedge resetb) begin if(!resetb) sub_state<=first;//從狀態(tài)為first else sub_state<=next_sub_state;//從狀態(tài)為下一個從狀態(tài) end always@(cmd or cmd_t or sub_state) begin if(cmd_t==0)//檢測有按鍵按下 case(cmd) cancel:begin //密碼輸入錯誤時,重復(fù)上一個狀態(tài) if(sub_state==first) next_sub_state=first; else case(sub_state) second:next_sub_state=first; third: next_sub_state=second; fourth:next_sub_state=third; fifth:next_sub_state=fourth; sixth:next_sub_state=fifth; seventh:next_sub_state=sixth; eighth:next_sub_state=seventh; finish:next_sub_state=eighth; endcase end //4個密碼輸完時,進行確認 enter:next_sub_state=first; setmima:next_sub_state=first; sure:next_sub_state=first; //default為輸入了某位密碼,輸入完自動將狀態(tài)轉(zhuǎn)入下一位 default: case(sub_state) first:begin next_sub_state=second;dig=8'b00000001;end second:begin next_sub_state=third;dig=8'b00000011;end third:begin next_sub_state=fourth;dig=8'b00000111;end fourth:begin next_sub_state=fifth;dig=8'b00001111;end fifth:begin next_sub_state=sixth;dig=8'b00011111;end sixth:begin next_sub_state=seventh;dig=8'b00111111;end seventh:begin next_sub_state=eighth;dig=8'b01111111;end eighth:begin next_sub_state=finish;dig=8'b11111111;end //當(dāng)輸入完8位密碼后狀態(tài)保持不變,等待輸入enter命令 finish:begin next_sub_state=finish;dig=8'b11111111;end endcase endcase else next_sub_state=sub_state; end 從狀態(tài)機簡要說明:按下清除鍵后從狀態(tài)機狀態(tài)回到前一個狀態(tài),按下數(shù)字鍵后從狀態(tài)機為下一個狀態(tài)(即輸入下一位密碼) 四.實驗結(jié)果 功能驗證: - cmd為輸入命令用來代替按鍵驗證功能,cmd=0000表示按鍵0,cmd=0001表示按鍵1,cmd=0010表示按鍵2,cmd=0011表示按鍵3,cmd=0100表示按鍵4,cmd=0101表示按鍵5,cmd=0110表示按鍵6,cmd=0111表示按鍵7,cmd=1000表示按鍵8,cmd=1001表示按鍵9,cmd=1010表示確認鍵,cmd=1011表示清除鍵,cmd=1101表示改密鍵。
- dig用來控制8個共陽數(shù)碼管的公共端(即可以控制8個數(shù)碼管‘——’的亮滅來顯示密碼輸入到第幾位)。
- passed輸出高電平表示開鎖狀態(tài)。
- resetmimaok輸出高電平表示修改密碼成功。
- alarmed輸出高電平表示警報狀態(tài)。
1.065.jpg (45.2 KB, 下載次數(shù): 178)
下載附件
2017-6-28 16:20 上傳
圖3.1總體功能仿真結(jié)果(包含開鎖,改密,清除,警報,顯示密碼輸入到第幾位) 下面將總圖按功能分解分析:
1.066.jpg (39.53 KB, 下載次數(shù): 169)
下載附件
2017-6-28 16:20 上傳
圖3.2初始密碼開鎖功能 初始密碼為11111111,如圖3.2中40ns開始輸入密碼為11011111按下確認鍵(1010)后密碼錯誤passed保持低電平(電子鎖未打開),接著輸入正確密碼(11111111)按下確認鍵(1010)后密碼正確passed輸出高電平(電子鎖打開)。
1.067.jpg (40.97 KB, 下載次數(shù): 189)
下載附件
2017-6-28 16:20 上傳
圖3.3修改密碼功能 如圖3.3在passed為高(即開鎖狀態(tài))輸入8位數(shù)字后按下改密鍵(1101)密碼被修改為11101111成功,resetmimaok輸出高電平。接著輸入初始密碼11111111按下確認鍵(1010)passed保持低電平(電子鎖未打開)之后再隨便輸入一個錯誤密碼,如圖3.3輸入01111110按下確認鍵(1010)passed保持低電平(電子鎖未打開),最后輸入修改后的密碼11101111按下確認鍵(1010)passed輸出高電平(電子鎖打開)。
1.068.jpg (45.22 KB, 下載次數(shù): 164)
下載附件
2017-6-28 16:20 上傳
圖3.4輸入大于8個數(shù)字時,前8位有效 如圖3.4中800ns處輸入密碼111011111按下確認鍵(1010)后passed輸出高電平(電子鎖打開)說明第九位數(shù)字1無效。
1.069.jpg (44.88 KB, 下載次數(shù): 163)
下載附件
2017-6-28 16:20 上傳
圖3.5三次連續(xù)輸錯密碼后警報 如圖3.5在950ns處開始連續(xù)輸入錯誤三次密碼后,alarmed輸出高電平表示發(fā)出警報。
1.070.jpg (31.09 KB, 下載次數(shù): 169)
下載附件
2017-6-28 16:20 上傳
圖3.6清除功能 如圖3.6在1.31us處輸入密碼1110113后按下清除鍵(1011)接著輸入11后,按下確認鍵(1010)passed輸出高電平(電子鎖打開)。 五.存在的問題及改進分析 - 存在的問題:硬件電路該怎么做?如何把此設(shè)計做成實物?
- 改進分析:數(shù)碼管顯示模塊可以改為輸入數(shù)字后顯示輸入的數(shù)字一秒鐘后變?yōu)椤?’;可以增加一個管理員密碼,管理員密碼優(yōu)先級高于普通密碼,警報的解除只能靠輸入管理員密碼,輸入管理員密碼可以開鎖和更改普通密碼。
六.實驗心得及意見 通過這次設(shè)計,使我對EDA產(chǎn)生了濃厚的興趣。特別是當(dāng)實現(xiàn)每個小功能成功時,心里特別開心。這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到的問題,反映出來我的許多不足之處,我以后要努力克服缺點。雖然此設(shè)計在Quartus II 軟件上功能能夠大體上得到驗證,但是離做出實物還差很遠。一直沒有玩過實物開發(fā)板,根本就不知道進行硬件的連接,就連一個簡單的程序都下載進開發(fā)板進行驗證。總的來說,這次設(shè)計的密碼鎖還是比較成功的,在設(shè)計中遇到了很多問題,最后在同學(xué)和老師的辛勤的指導(dǎo)下外加上自己的努力,終于都得到了解決,因此很有成就感,終于覺得平時所學(xué)的知識有了實用的價值,達到了理論與實際相結(jié)合的目的。 最后說一說我對本課程一些意見,該課程從開始做實驗到最后的課程設(shè)計都一直是在電腦上進行仿真,沒有在板子上跑過程序,我覺得老師應(yīng)該在開發(fā)板給我們演示簡單的程序,這樣能夠帶動我們大多數(shù)人的興趣,也能夠便于我們更快上手做一些簡單的實物,提高大家學(xué)習(xí)的積極性。
七.附錄 程序: - module dianzisuo(clk,resetb,cmd,cmd_t,alarmed,passed,resetmimaok,dig);
- input cmd_t;//輸入命令控制信號
- input clk; //輸入時鐘信號
- input resetb; //輸入復(fù)位信號
- input [3:0] cmd;//輸入命令信號
- output reg [7:0]dig;//位選輸出信號
- output alarmed; //輸出警報信號
- output passed; //輸出通過信號
- output resetmimaok; //輸出密碼修改成功信號
- reg alarmed;
- reg passed;
- reg resetmimaok;
- wire clk;
- wire resetb;
- wire [3:0]cmd;
- wire cmd_t;
- reg[22:0]CNT_R0;//clk1延時寄存器
- reg clk1;//clk為10ns時clk1為5ms周期脈沖
- reg [31:0]inputpassword;//輸入值存放寄存器
- reg [31:0]PASSWORD=32'b0001_0001_0001_0001_0001_0001_0001_0001;//初始密碼
- parameter zero=4'b0000,//0
- one=4'b0001,//1
- two=4'b0010,//2
- three=4'b0011,//3
- four=4'b0100,//4
- five=4'b0101,//5
- six=4'b0110,//6
- seven=4'b0111,//7
- eight=4'b1000,//8
- nine=4'b1001,//9
- enter=4'b1010,//確認鍵
- cancel=4'b1011,//清除一位鍵
- setmima=4'b1100,//
- sure=4'b1101;//修改密碼鍵
- reg [3:0]main_state;//主現(xiàn)態(tài)
- reg [3:0]next_state;//主次態(tài)
- parameter waits=4'b0001,
- pass=4'b0010,
- alarm=4'b0100,
- changing=4'b1000;
- reg [3:0]sub_state;//從現(xiàn)態(tài)
- reg [3:0]next_sub_state;//從次態(tài)
- parameter first=4'b0000,
- second=4'b0001,
- third=4'b0010,
- fourth=4'b0100,
- fifth=4'b1000,
- sixth=4'b0011,
- seventh=4'b0101,
- eighth=4'b0110,
- finish=4'b0111;
- reg[7:0] pass_count;//通過計時寄存器
- reg[10:0] alarm_count;//警報計時寄存器
- reg[1:0] try_count;//嘗試次數(shù)寄存器
- reg[7:0] mima_count;//改密計時寄存器
- reg error;
- reg correct;
- reg mimagaile;
- //clk為10ns時,clk1為5ms時鐘
- always @(posedge clk)
- begin
- CNT_R0 <= CNT_R0 + 1'b1;
- if(CNT_R0 < 5000000)
- begin
- clk1 <= 1;
- end else
- begin
- clk1 <= 0;
- end
- end
- //主狀態(tài)機部分
- always@(main_state or correct or error or try_count or pass_count or alarm_count or mimagaile)
- begin
- case(main_state)
- waits: if(correct==1)//由waits轉(zhuǎn)換到pass的條件
- begin
- next_state=pass;
- end
- else if(error==1&&try_count==2)
- next_state=alarm;//由waits轉(zhuǎn)換的alarm的條件
- else
- next_state=waits;
- pass: if(pass_count[7]==1)//由pass轉(zhuǎn)換到waits的條件
- next_state=waits;
- else if(mimagaile==1)//由pass轉(zhuǎn)換到changing的條件
- next_state=changing;
- else
- next_state=pass;
- changing:if(mima_count[7]==1)//由changing轉(zhuǎn)換到waits的條件
- next_state=waits;
- else
- next_state=changing;
- alarm:if(alarm_count[10]==1)//由alarm轉(zhuǎn)換到waits的條件
- next_state=waits;
- else
- next_state=alarm;
- default:next_state=waits;
- endcase
- end
- //alarm一段時間后,自動進入waits狀態(tài)
- //alarm定時器
- always@(posedge clk1 or negedge resetb)
- begin
- if(!resetb)
- alarm_count<=0;
- else if(main_state==alarm)//alarm狀態(tài)計時器alarm定時器加1
- alarm_count<=alarm_count+1;
- else
- alarm_count<=0;
- end
- //鎖pass以后計數(shù)開始,當(dāng)規(guī)定的時間到達后自動上鎖,并進入waits狀態(tài)
- //pass定時器
- always@(posedge clk1 or negedge resetb)
- begin
- if(!resetb)
- pass_count<=0;
- else if(main_state==pass) //pass狀態(tài)計時器pass定時器加1
- pass_count<=pass_count+1;
- else
- pass_count<=0;
- end
- //changing以后計數(shù)開始,當(dāng)規(guī)定的時間到達后自動上鎖,并進入waits狀態(tài)
- //changing定時器
- always@(posedge clk1 or negedge resetb)
- begin
- if(!resetb)
- mima_count<=0;
- else if(main_state==changing) //changing狀態(tài)計時器mima_count定時器加1
- mima_count<=mima_count+1;
- else
- mima_count<=0;
- end
- //狀態(tài)轉(zhuǎn)換
- always@(posedge clk or negedge resetb)
- begin
- if(!resetb)//如果按下復(fù)位鍵,則主狀態(tài)為等待狀態(tài)
- main_state<=waits;
- else //如果沒按則進入下一個狀態(tài)
- main_state<=next_state;
- end
- //輸出控制部分
- always@(posedge clk or negedge resetb)
- begin
- if(!resetb)//復(fù)位按下時,開鎖輸出和報警輸出都為零
- begin
- passed<=0;
- alarmed<=0;
- resetmimaok<=0;
- end
- else if(main_state==pass)//當(dāng)主機狀態(tài)為pass時開鎖
- begin
- passed<=1;
- alarmed<=0;
- resetmimaok<=0;
- end
- else if(main_state==changing)//當(dāng)主機狀態(tài)為changing時,改密碼
- begin
- passed<=0;
- alarmed<=0;
- resetmimaok<=1;
- end
- else if(main_state==alarm)//當(dāng)主機狀態(tài)為alarm時,警報
- begin
- passed<=0;
- alarmed<=1;
- resetmimaok<=0;
- end
- end
- //從狀態(tài)機,用于輸入8位密碼
- always@(posedge clk or negedge resetb)
- begin
- if(!resetb)
- sub_state<=first;//從狀態(tài)為first
- else
- sub_state<=next_sub_state;//從狀態(tài)為下一個從狀態(tài)
- end
- always@(cmd or cmd_t or sub_state)
- begin
- if(cmd_t==0)//檢測有按鍵按下
- case(cmd)
- cancel:begin //密碼輸入錯誤時,重復(fù)上一個狀態(tài)
- if(sub_state==first)
- next_sub_state=first;
- else
- case(sub_state)
- second:next_sub_state=first;
- third: next_sub_state=second;
- fourth:next_sub_state=third;
- fifth:next_sub_state=fourth;
- sixth:next_sub_state=fifth;
- seventh:next_sub_state=sixth;
- eighth:next_sub_state=seventh;
- finish:next_sub_state=eighth;
- endcase
- end
- //4個密碼輸完時,進行確認
- enter:next_sub_state=first;
- setmima:next_sub_state=first;
- sure:next_sub_state=first;
- //default為輸入了某位密碼,輸入完自動將狀態(tài)轉(zhuǎn)入下一位
- default:
- case(sub_state)
- first:begin next_sub_state=second;dig=8'b00000001;end
- second:begin next_sub_state=third;dig=8'b00000011;end
- third:begin next_sub_state=fourth;dig=8'b00000111;end
- fourth:begin next_sub_state=fifth;dig=8'b00001111;end
- fifth:begin next_sub_state=sixth;dig=8'b00011111;end
- sixth:begin next_sub_state=seventh;dig=8'b00111111;end
- seventh:begin next_sub_state=eighth;dig=8'b01111111;end
- eighth:begin next_sub_state=finish;dig=8'b11111111;end //當(dāng)輸入完8位密碼后狀態(tài)保持不變,等待輸入enter命令
- finish:begin next_sub_state=finish;dig=8'b11111111;end
- endcase
- endcase
- else
- next_sub_state=sub_state;
- end
- //記錄密碼
- always@(posedge clk or negedge resetb)
- begin
- if(!resetb)
- inputpassword<=0;
- else if(cmd_t==0)
- case(sub_state)
- first:inputpassword[31:28]<=cmd[3:0];
- second:inputpassword[27:24]<=cmd[3:0];
- third:inputpassword[23:20]<=cmd[3:0];
- fourth:inputpassword[19:16]<=cmd[3:0];
- fifth:inputpassword[15:12]<=cmd[3:0];
- sixth:inputpassword[11:8]<=cmd[3:0];
- seventh:inputpassword[7:4]<=cmd[3:0];
- eighth:inputpassword[3:0]<=cmd[3:0];
- default:inputpassword<=inputpassword;
- endcase
- else
- inputpassword<=inputpassword;
- end
- //比較密碼
- always@(posedge clk or negedge resetb)
- begin
- if(!resetb)//如果復(fù)位鍵按下則正確,錯誤都清零
- begin
- correct<=0;
- error<=0;
- end
- else if(cmd_t==0&&cmd==enter)//當(dāng)按鍵按下,且是enter鍵按下時對密碼進行比較
- if(inputpassword==PASSWORD)//密碼正確時correct=1
- begin
- correct<=1;
- error<=0;
- end
- else //密碼錯誤時,error為1
- begin
- error<=1;
- correct<=0;
- end
- else
- begin
- correct<=0;
- error<=0;
- end
- end
- //修改密碼
- always@(posedge clk )
- begin
- if(cmd_t==0&&cmd==sure)
- begin
- PASSWORD<=inputpassword;
- mimagaile<=1;
- end
- else
- mimagaile<=0;
- end
- //記錄錯誤次數(shù)
- always@(posedge clk or negedge resetb)
- begin
- if(!resetb)//復(fù)位時密碼重試次數(shù)清零
- try_count<=0;
- else
- if(error==1)//當(dāng)輸入密碼錯誤時,重試次數(shù)加1
- try_count<=try_count+2'b01;
- else if(main_state==pass||main_state==alarm)//當(dāng)有一次成功,重試次數(shù)超過三次后,進入報警后重試次數(shù)清零
- try_count<=0;
- end
- endmodule
- //按鍵模塊
- module scankey(clk,a,b,keyvalue);
- input clk;
- input [3:0]b;
- output reg[3:0]a;
- output reg [3:0]keyvalue;
- reg [1:0]q;
- reg [3:0] qdb;//消抖后的b
- reg [3:0]rxbuf;
- always @( posedge clk) begin //按鍵消抖
- rxbuf[0] <= b[0];
- qdb[0] <= ~(rxbuf[0] & (~b[0]));
- end
- always @( posedge clk) begin //按鍵消抖
- rxbuf[1] <= b[1];
- qdb[1] <= ~(rxbuf[1] & (~b[1]));
- end
- always @( posedge clk) begin //按鍵消抖
- rxbuf[2] <= b[2];
- qdb[2] <= ~(rxbuf[2] & (~b[2]));
- end
- always @( posedge clk) begin //按鍵消抖
- rxbuf[3] <= b[3];
- qdb[3] <= ~(rxbuf[3] & (~b[3]));
- end
- always@(posedge clk)
- begin q<=q+1;
- case(q)
- 0:a<=4'b1110;
- 1:a<=4'b1101;
- 2:a<=4'b1011;
- 3:a<=4'b0111;
- endcase
- case({a,qdb})
- 8'b1110_0111:keyvalue<=4'b0000;//按鍵0
- 8'b1110_1011:keyvalue<=4'b0001;//按鍵1
- 8'b1110_1101:keyvalue<=4'b0010;
- 8'b1110_1110:keyvalue<=4'b0011;
- 8'b1101_0111:keyvalue<=4'b0100;
- 8'b1101_1011:keyvalue<=4'b0101;
- 8'b1101_1101:keyvalue<=4'b0110;
- 8'b1101_1110:keyvalue<=4'b0111;
- 8'b1011_0111:keyvalue<=4'b1000;//按鍵8
- 8'b1011_1011:keyvalue<=4'b1001;//按鍵9
- 8'b1011_1101:keyvalue<=4'b1010;//確認鍵
- 8'b1011_1110:keyvalue<=4'b1011;//清除鍵
- 8'b0111_0111:keyvalue<=4'b1100;
- 8'b0111_1011:keyvalue<=4'b1101;//改密鍵
- 8'b0111_1101:keyvalue<=4'b1110;
- 8'b0111_1110:keyvalue<=4'b1111;
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
完整論文下載(word格式 可編輯):
EDA電子密碼鎖課程設(shè)計報告.docx
(673.02 KB, 下載次數(shù): 189)
2017-6-28 15:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|