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