久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13303|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

我做的EDA密碼鎖仿真Quartus II課程設(shè)計(jì)報(bào)告

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
此程序目前只能仿真實(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)。
  • 實(shí)驗(yàn)內(nèi)容
  • 新建工程dianzimimasuo
  • 新建Verilog HDL File
選擇菜單File,選擇New選項(xiàng),根據(jù)所使用的硬件描述語(yǔ)言類型選擇相應(yīng)的新建文件型(Verilog HDL File)。                           
  • 輸入程序
  • 編譯
  • 仿真

三.任務(wù)分析和設(shè)計(jì)方案

作為通用電子密碼鎖,主要由三個(gè)部分組成:數(shù)字密碼輸入電路,密碼鎖控制電路和密碼顯示電路。

各個(gè)模塊電路的選取:

  • 數(shù)字密碼輸入電路采用4x4矩陣鍵盤。

(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.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)。

圖3.1總體功能仿真結(jié)果(包含開(kāi)鎖,改密,清除,警報(bào),顯示密碼輸入到第幾位)

下面將總圖按功能分解分析:

圖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))。

圖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))。

圖3.4輸入大于8個(gè)數(shù)字時(shí),前8位有效

如圖3.4中800ns處輸入密碼111011111按下確認(rèn)鍵(1010)后passed輸出高電平(電子鎖打開(kāi))說(shuō)明第九位數(shù)字1無(wú)效。

圖3.5三次連續(xù)輸錯(cuò)密碼后警報(bào)

如圖3.5在950ns處開(kāi)始連續(xù)輸入錯(cuò)誤三次密碼后,alarmed輸出高電平表示發(fā)出警報(bào)。

圖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í)的積極性。


七.附錄
程序:
  1. module dianzisuo(clk,resetb,cmd,cmd_t,alarmed,passed,resetmimaok,dig);
  2. input cmd_t;//輸入命令控制信號(hào)
  3. input clk;  //輸入時(shí)鐘信號(hào)
  4. input resetb;  //輸入復(fù)位信號(hào)
  5. input [3:0] cmd;//輸入命令信號(hào)
  6. output reg [7:0]dig;//位選輸出信號(hào)
  7. output alarmed; //輸出警報(bào)信號(hào)
  8. output passed;  //輸出通過(guò)信號(hào)
  9. output resetmimaok;  //輸出密碼修改成功信號(hào)
  10. reg alarmed;
  11. reg passed;
  12. reg resetmimaok;
  13. wire clk;
  14. wire resetb;
  15. wire [3:0]cmd;
  16. wire cmd_t;
  17. reg[22:0]CNT_R0;//clk1延時(shí)寄存器
  18. reg clk1;//clk為10ns時(shí)clk1為5ms周期脈沖                                
  19. reg [31:0]inputpassword;//輸入值存放寄存器
  20. reg [31:0]PASSWORD=32'b0001_0001_0001_0001_0001_0001_0001_0001;//初始密碼
  21. parameter zero=4'b0000,//0
  22.                          one=4'b0001,//1
  23.                          two=4'b0010,//2
  24.                          three=4'b0011,//3
  25.                          four=4'b0100,//4
  26.                          five=4'b0101,//5
  27.                          six=4'b0110,//6
  28.                          seven=4'b0111,//7
  29.                          eight=4'b1000,//8
  30.                          nine=4'b1001,//9
  31.                          enter=4'b1010,//確認(rèn)鍵
  32.                          cancel=4'b1011,//清除一位鍵
  33.                          setmima=4'b1100,//
  34.                          sure=4'b1101;//修改密碼鍵
  35. reg [3:0]main_state;//主現(xiàn)態(tài)
  36. reg [3:0]next_state;//主次態(tài)
  37. parameter waits=4'b0001,
  38.                          pass=4'b0010,
  39.                          alarm=4'b0100,
  40.                          changing=4'b1000;
  41. reg [3:0]sub_state;//從現(xiàn)態(tài)
  42. reg [3:0]next_sub_state;//從次態(tài)
  43. parameter first=4'b0000,
  44.                     second=4'b0001,
  45.                          third=4'b0010,
  46.                          fourth=4'b0100,
  47.                          fifth=4'b1000,
  48.                          sixth=4'b0011,
  49.                          seventh=4'b0101,
  50.                          eighth=4'b0110,
  51.                          finish=4'b0111;
  52. reg[7:0] pass_count;//通過(guò)計(jì)時(shí)寄存器
  53. reg[10:0] alarm_count;//警報(bào)計(jì)時(shí)寄存器
  54. reg[1:0] try_count;//嘗試次數(shù)寄存器
  55. reg[7:0] mima_count;//改密計(jì)時(shí)寄存器
  56. reg error;
  57. reg correct;
  58. reg mimagaile;
  59. //clk為10ns時(shí),clk1為5ms時(shí)鐘
  60. always @(posedge clk)
  61. begin
  62. CNT_R0 <= CNT_R0 + 1'b1;
  63. if(CNT_R0 < 5000000)
  64. begin
  65. clk1 <= 1;
  66. end else
  67. begin
  68. clk1 <= 0;
  69. end
  70. end
  71. //主狀態(tài)機(jī)部分
  72. always@(main_state or correct or error or try_count or pass_count or alarm_count or mimagaile)
  73. begin
  74. case(main_state)
  75. waits: if(correct==1)//由waits轉(zhuǎn)換到pass的條件
  76.                 begin
  77.                 next_state=pass;
  78.                 end
  79.                 else if(error==1&&try_count==2)
  80.                 next_state=alarm;//由waits轉(zhuǎn)換的alarm的條件
  81.                 else
  82.                 next_state=waits;
  83. pass: if(pass_count[7]==1)//由pass轉(zhuǎn)換到waits的條件
  84.                 next_state=waits;
  85.                 else if(mimagaile==1)//由pass轉(zhuǎn)換到changing的條件
  86.                 next_state=changing;
  87.                 else
  88.                 next_state=pass;
  89. changing:if(mima_count[7]==1)//由changing轉(zhuǎn)換到waits的條件
  90.                         next_state=waits;
  91.                         else
  92.                         next_state=changing;
  93. alarm:if(alarm_count[10]==1)//由alarm轉(zhuǎn)換到waits的條件
  94.                 next_state=waits;
  95.                 else
  96.                 next_state=alarm;
  97. default:next_state=waits;
  98. endcase
  99. end
  100. //alarm一段時(shí)間后,自動(dòng)進(jìn)入waits狀態(tài)
  101. //alarm定時(shí)器
  102. always@(posedge clk1 or negedge resetb)
  103. begin
  104. if(!resetb)
  105. alarm_count<=0;
  106. else if(main_state==alarm)//alarm狀態(tài)計(jì)時(shí)器alarm定時(shí)器加1
  107. alarm_count<=alarm_count+1;
  108. else
  109. alarm_count<=0;
  110. end
  111. //鎖pass以后計(jì)數(shù)開(kāi)始,當(dāng)規(guī)定的時(shí)間到達(dá)后自動(dòng)上鎖,并進(jìn)入waits狀態(tài)
  112. //pass定時(shí)器
  113. always@(posedge clk1 or negedge resetb)
  114. begin
  115. if(!resetb)
  116. pass_count<=0;
  117. else if(main_state==pass) //pass狀態(tài)計(jì)時(shí)器pass定時(shí)器加1
  118. pass_count<=pass_count+1;
  119. else
  120. pass_count<=0;
  121. end
  122. //changing以后計(jì)數(shù)開(kāi)始,當(dāng)規(guī)定的時(shí)間到達(dá)后自動(dòng)上鎖,并進(jìn)入waits狀態(tài)
  123. //changing定時(shí)器
  124. always@(posedge clk1 or negedge resetb)
  125. begin
  126. if(!resetb)
  127. mima_count<=0;
  128. else if(main_state==changing) //changing狀態(tài)計(jì)時(shí)器mima_count定時(shí)器加1
  129. mima_count<=mima_count+1;
  130. else
  131. mima_count<=0;
  132. end
  133. //狀態(tài)轉(zhuǎn)換
  134. always@(posedge clk or negedge resetb)
  135. begin
  136.         if(!resetb)//如果按下復(fù)位鍵,則主狀態(tài)為等待狀態(tài)
  137.         main_state<=waits;
  138.         else                        //如果沒(méi)按則進(jìn)入下一個(gè)狀態(tài)
  139.         main_state<=next_state;
  140. end
  141. //輸出控制部分
  142. always@(posedge clk or negedge resetb)
  143. begin
  144.                 if(!resetb)//復(fù)位按下時(shí),開(kāi)鎖輸出和報(bào)警輸出都為零
  145.                 begin
  146.                       passed<=0;
  147.                                 alarmed<=0;
  148.                                 resetmimaok<=0;
  149.                 end
  150.                 else if(main_state==pass)//當(dāng)主機(jī)狀態(tài)為pass時(shí)開(kāi)鎖
  151.                 begin
  152.                                 passed<=1;
  153.                                 alarmed<=0;
  154.                                 resetmimaok<=0;
  155.                 end
  156.                 else if(main_state==changing)//當(dāng)主機(jī)狀態(tài)為changing時(shí),改密碼
  157.                 begin
  158.                                 passed<=0;
  159.                                 alarmed<=0;
  160.                                 resetmimaok<=1;
  161.                 end
  162.                 else if(main_state==alarm)//當(dāng)主機(jī)狀態(tài)為alarm時(shí),警報(bào)
  163.                 begin
  164.                                 passed<=0;
  165.                                 alarmed<=1;
  166.                                 resetmimaok<=0;
  167.                 end
  168. end
  169. //從狀態(tài)機(jī),用于輸入8位密碼
  170. always@(posedge clk or negedge resetb)
  171. begin
  172.       if(!resetb)
  173.                 sub_state<=first;//從狀態(tài)為first
  174.                 else
  175.                 sub_state<=next_sub_state;//從狀態(tài)為下一個(gè)從狀態(tài)
  176. end
  177.                 always@(cmd or cmd_t or sub_state)
  178. begin
  179.       if(cmd_t==0)//檢測(cè)有按鍵按下
  180.                 case(cmd)
  181.                 cancel:begin //密碼輸入錯(cuò)誤時(shí),重復(fù)上一個(gè)狀態(tài)
  182.                                  if(sub_state==first)
  183.                                  next_sub_state=first;
  184.                                  else
  185.                                  case(sub_state)
  186.                                  second:next_sub_state=first;
  187.                                  third: next_sub_state=second;
  188.                                  fourth:next_sub_state=third;
  189.                                  fifth:next_sub_state=fourth;
  190.                                  sixth:next_sub_state=fifth;
  191.                                  seventh:next_sub_state=sixth;
  192.                                  eighth:next_sub_state=seventh;
  193.                                  finish:next_sub_state=eighth;
  194.                                  endcase
  195. end
  196. //4個(gè)密碼輸完時(shí),進(jìn)行確認(rèn)
  197. enter:next_sub_state=first;
  198. setmima:next_sub_state=first;
  199. sure:next_sub_state=first;
  200. //default為輸入了某位密碼,輸入完自動(dòng)將狀態(tài)轉(zhuǎn)入下一位
  201. default:
  202.                         case(sub_state)
  203.                                                 first:begin next_sub_state=second;dig=8'b00000001;end
  204.                                                 second:begin next_sub_state=third;dig=8'b00000011;end
  205.                                                 third:begin next_sub_state=fourth;dig=8'b00000111;end
  206.                                                 fourth:begin next_sub_state=fifth;dig=8'b00001111;end
  207.                                                 fifth:begin next_sub_state=sixth;dig=8'b00011111;end
  208.                                                 sixth:begin next_sub_state=seventh;dig=8'b00111111;end
  209.                                                 seventh:begin next_sub_state=eighth;dig=8'b01111111;end
  210.                                                 eighth:begin next_sub_state=finish;dig=8'b11111111;end      //當(dāng)輸入完8位密碼后狀態(tài)保持不變,等待輸入enter命令
  211.                                                 finish:begin next_sub_state=finish;dig=8'b11111111;end
  212.                         endcase
  213. endcase
  214. else
  215. next_sub_state=sub_state;
  216. end
  217. //記錄密碼
  218. always@(posedge clk or negedge resetb)
  219. begin
  220.           if(!resetb)
  221.           inputpassword<=0;
  222.           else if(cmd_t==0)
  223.                 case(sub_state)
  224.                         first:inputpassword[31:28]<=cmd[3:0];
  225.                         second:inputpassword[27:24]<=cmd[3:0];
  226.                         third:inputpassword[23:20]<=cmd[3:0];
  227.                         fourth:inputpassword[19:16]<=cmd[3:0];
  228.                         fifth:inputpassword[15:12]<=cmd[3:0];
  229.                         sixth:inputpassword[11:8]<=cmd[3:0];
  230.                         seventh:inputpassword[7:4]<=cmd[3:0];
  231.                         eighth:inputpassword[3:0]<=cmd[3:0];
  232.                         default:inputpassword<=inputpassword;
  233.                 endcase
  234.                 else
  235.                 inputpassword<=inputpassword;
  236.                 end
  237.                 //比較密碼
  238.                 always@(posedge clk or negedge resetb)
  239.                 begin
  240.                 if(!resetb)//如果復(fù)位鍵按下則正確,錯(cuò)誤都清零
  241.                    begin
  242.                                 correct<=0;
  243.                                 error<=0;
  244.                         end
  245.                 else if(cmd_t==0&&cmd==enter)//當(dāng)按鍵按下,且是enter鍵按下時(shí)對(duì)密碼進(jìn)行比較
  246.                                 if(inputpassword==PASSWORD)//密碼正確時(shí)correct=1
  247.                                 begin
  248.                                         correct<=1;
  249.                                         error<=0;
  250.                                 end
  251.                                 else //密碼錯(cuò)誤時(shí),error為1
  252.                                 begin
  253.                                                 error<=1;
  254.                                                 correct<=0;
  255.                                 end
  256.                                 else
  257.                                         begin
  258.                                                 correct<=0;
  259.                                                 error<=0;
  260.                                                 end
  261. end
  262. //修改密碼
  263. always@(posedge clk )
  264. begin
  265. if(cmd_t==0&&cmd==sure)
  266.     begin
  267.          PASSWORD<=inputpassword;
  268.          mimagaile<=1;
  269.          end
  270. else
  271. mimagaile<=0;
  272. end
  273. //記錄錯(cuò)誤次數(shù)
  274. always@(posedge clk or negedge resetb)
  275. begin
  276. if(!resetb)//復(fù)位時(shí)密碼重試次數(shù)清零
  277.         try_count<=0;
  278.         else
  279.         if(error==1)//當(dāng)輸入密碼錯(cuò)誤時(shí),重試次數(shù)加1
  280.         try_count<=try_count+2'b01;
  281.         else if(main_state==pass||main_state==alarm)//當(dāng)有一次成功,重試次數(shù)超過(guò)三次后,進(jìn)入報(bào)警后重試次數(shù)清零
  282.                         try_count<=0;
  283.                         end
  284.         endmodule
  285. //按鍵模塊
  286. module scankey(clk,a,b,keyvalue);
  287. input clk;
  288. input [3:0]b;
  289. output reg[3:0]a;
  290. output reg [3:0]keyvalue;
  291. reg [1:0]q;
  292. reg [3:0] qdb;//消抖后的b
  293. reg [3:0]rxbuf;
  294. always @( posedge clk) begin //按鍵消抖
  295. rxbuf[0] <= b[0];
  296. qdb[0] <= ~(rxbuf[0] & (~b[0]));
  297. end
  298. always @( posedge clk) begin //按鍵消抖
  299. rxbuf[1] <= b[1];
  300. qdb[1] <= ~(rxbuf[1] & (~b[1]));
  301. end
  302. always @( posedge clk) begin //按鍵消抖
  303. rxbuf[2] <= b[2];
  304. qdb[2] <= ~(rxbuf[2] & (~b[2]));
  305. end
  306. always @( posedge clk) begin //按鍵消抖
  307. rxbuf[3] <= b[3];
  308. qdb[3] <= ~(rxbuf[3] & (~b[3]));
  309. end
  310. always@(posedge clk)
  311. begin q<=q+1;
  312. case(q)
  313. 0:a<=4'b1110;
  314. 1:a<=4'b1101;
  315. 2:a<=4'b1011;
  316. 3:a<=4'b0111;
  317. endcase
  318. case({a,qdb})
  319. 8'b1110_0111:keyvalue<=4'b0000;//按鍵0
  320. 8'b1110_1011:keyvalue<=4'b0001;//按鍵1
  321. 8'b1110_1101:keyvalue<=4'b0010;
  322. 8'b1110_1110:keyvalue<=4'b0011;
  323. 8'b1101_0111:keyvalue<=4'b0100;
  324. 8'b1101_1011:keyvalue<=4'b0101;
  325. 8'b1101_1101:keyvalue<=4'b0110;
  326. 8'b1101_1110:keyvalue<=4'b0111;
  327. 8'b1011_0111:keyvalue<=4'b1000;//按鍵8
  328. 8'b1011_1011:keyvalue<=4'b1001;//按鍵9
  329. 8'b1011_1101:keyvalue<=4'b1010;//確認(rèn)鍵
  330. 8'b1011_1110:keyvalue<=4'b1011;//清除鍵
  331. 8'b0111_0111:keyvalue<=4'b1100;
  332. 8'b0111_1011:keyvalue<=4'b1101;//改密鍵
  333. 8'b0111_1101:keyvalue<=4'b1110;
  334. 8'b0111_1110:keyvalue<=4'b1111;


  335. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

完整論文下載(word格式 可編輯):
EDA電子密碼鎖課程設(shè)計(jì)報(bào)告.docx (673.02 KB, 下載次數(shù): 189)



評(píng)分

參與人數(shù) 2黑幣 +11 收起 理由
2457514212 + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
這貨不是小武啊 + 6 贊一個(gè)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2017-6-28 16:22 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:235109 發(fā)表于 2017-9-24 21:41 | 只看該作者
感謝!!十分實(shí)用~~
回復(fù)

使用道具 舉報(bào)

地板
ID:335906 發(fā)表于 2018-5-22 19:05 | 只看該作者
感謝樓主,我的畢設(shè)課題和這個(gè)有相似之處,很有用
回復(fù)

使用道具 舉報(bào)

5#
ID:361408 發(fā)表于 2018-6-28 22:37 來(lái)自手機(jī) | 只看該作者
樓主其他的怎么看
回復(fù)

使用道具 舉報(bào)

6#
ID:538262 發(fā)表于 2019-5-14 19:57 | 只看該作者
感謝十分有用!
回復(fù)

使用道具 舉報(bào)

7#
ID:511206 發(fā)表于 2019-5-23 22:35 | 只看該作者
優(yōu)秀
回復(fù)

使用道具 舉報(bào)

8#
ID:495974 發(fā)表于 2019-7-4 16:59 | 只看該作者
有沒(méi)有實(shí)物圖啊
回復(fù)

使用道具 舉報(bào)

9#
ID:514848 發(fā)表于 2019-12-17 16:48 | 只看該作者
優(yōu)秀,我拿去借鑒了
回復(fù)

使用道具 舉報(bào)

10#
ID:790676 發(fā)表于 2020-6-27 09:25 | 只看該作者
很有幫助,借鑒一下
回復(fù)

使用道具 舉報(bào)

11#
ID:806589 發(fā)表于 2020-7-22 09:38 | 只看該作者
很有幫助,想看之后的代碼
回復(fù)

使用道具 舉報(bào)

12#
ID:777603 發(fā)表于 2020-11-20 20:22 | 只看該作者
優(yōu)秀,拿去借鑒了

回復(fù)

使用道具 舉報(bào)

13#
ID:830608 發(fā)表于 2020-12-2 10:27 | 只看該作者
666可以的挺有用的
回復(fù)

使用道具 舉報(bào)

14#
ID:839981 發(fā)表于 2021-1-14 15:36 | 只看該作者
你好,有關(guān)于引腳鎖定的代碼嗎
回復(fù)

使用道具 舉報(bào)

15#
ID:839981 發(fā)表于 2021-1-14 15:37 | 只看該作者
你好,有關(guān)于引腳鎖定的代碼嗎?
回復(fù)

使用道具 舉報(bào)

16#
ID:1054542 發(fā)表于 2022-11-29 11:34 | 只看該作者
樓主好了厲害,想學(xué)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 自拍偷拍第一页 | 特a毛片 | 国产小视频在线观看 | 色姑娘综合网 | 国产午夜在线 | 涩涩视频在线观看 | 91porn在线 | 国产视频中文字幕 | a级大毛片 | 成人国产精品免费观看视频 | 免费成人高清在线视频 | 欧美日韩视频在线第一区 | 日韩精品一区在线 | 国产玖玖 | 亚洲在线 | 在线一区视频 | 国产激情毛片 | 91久久精品一区二区三区 | 国色天香综合网 | 国产日韩欧美精品 | 午夜免费视频 | 免费看黄视频网站 | 久久久国产精品视频 | 久久av在线播放 | 午夜影院在线观看免费 | 亚洲国产精品久久久久 | 蜜桃精品视频在线 | 国产精品久久久久久久久久久久久 | 国产精品久久在线观看 | 一区二区三区四区不卡 | 天天操夜夜骑 | 亚洲人在线观看视频 | 欧美精品1区 | 人操人人干人 | 欧美精品一二区 | 激情国产| 国产欧美视频一区二区三区 | 一区二区在线免费播放 | 欧美美女被c | 综合中文字幕 | 黄网站涩免费蜜桃网站 |