Verilog實現(xiàn)密碼箱實驗報告_第1頁
Verilog實現(xiàn)密碼箱實驗報告_第2頁
Verilog實現(xiàn)密碼箱實驗報告_第3頁
Verilog實現(xiàn)密碼箱實驗報告_第4頁
Verilog實現(xiàn)密碼箱實驗報告_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Verilog實現(xiàn)密碼箱1.功能概述小腳丫開發(fā)板的有4位撥碼開關(guān),可以表示數(shù)字0-9,有兩個七段數(shù)碼管,所以密碼設(shè)為兩位(00—99),初始密碼00,利用四位撥碼開關(guān)(sw)輸入密碼,,按下個位確認按鍵(low),在數(shù)碼管上顯示個位數(shù)字;再次輸入密碼,按下十位確認按鍵(high),在數(shù)碼管上顯示十位數(shù)字。按下確認按鍵(enter),比較密碼正誤,若正確,實現(xiàn)開鎖功能,用led8燈亮表示;錯誤,實現(xiàn)報錯功能,用led1燈亮表示;連續(xù)錯三次,實現(xiàn)警報功能,用8個燈全亮表示,此時只有重置(rst)才能重新輸入密碼。初始密碼為21。為保證安全性,只有在開鎖狀態(tài)下,才可修改密碼,修改撥碼開關(guān)數(shù)值,按下個位確認按鍵(low),設(shè)置新密碼個位,再次修改撥碼開關(guān)數(shù)值,按下個位確認按鍵(high),設(shè)置新密碼十位(實際上兩個位密碼修改與輸入順序不影響)。再按下重置鍵(rst),即可重新輸入密碼。同時在使用按鍵時,注意到了消抖。2.效果展示密碼錯誤密碼正確修改后密碼正確視頻展示(雙擊播放)3.代碼分析一、密碼顯示在數(shù)碼管上always@(*)//數(shù)碼管顯示控制模塊begin case(code_low) 4'd0:seg_led1=9'b000111111;//數(shù)碼管1顯示0 4'd1:seg_led1=9'b000000110;//1 4'd2:seg_led1=9'b001011011;//2 4'd3:seg_led1=9'b001001111;//3 4'd4:seg_led1=9'b001100110;//4 4'd5:seg_led1=9'b001101101;//5 4'd6:seg_led1=9'b001111101;//6 4'd7:seg_led1=9'b000000111;//7 4'd8:seg_led1=9'b001111111;//8 4'd9:seg_led1=9'b001101111;//9 default:seg_led1=9'b100111111;//0 endcase case(code_high) 4'd0:seg_led2=9'b000111111;//數(shù)碼管2顯示0 4'd1:seg_led2=9'b000000110;//1 4'd2:seg_led2=9'b001011011;//2 4'd3:seg_led2=9'b001001111;//3 4'd4:seg_led2=9'b001100110;//4 4'd5:seg_led2=9'b001101101;//5 4'd6:seg_led2=9'b001111101;//6 4'd7:seg_led2=9'b000000111;//7 4'd8:seg_led2=9'b001111111;//8 4'd9:seg_led2=9'b001101111;//9 default:seg_led2=9'b100111111;//0 endcaseend二、密碼比對判斷always@(posedgeclk)//密碼判斷begin if(!rst) begin wrong_cnt<=2'b00;//初始錯誤次數(shù)為0 code_low<=4'b0000; code_high<=4'b0000; led<=8'b11111111; end elseif(low_d) begin code_low<=sw; end elseif(high_d) begin code_high<=sw; end elseif(enter_d) begin if(wrong_cnt!=2'd2) begin if((code_low==Y&&code_high==X)||(code_low==newcode_low&&code_high==newcode_high)) begin led<=8'b01111111;//密碼正確,led8亮 wrong_cnt<=2'd0; end else begin led<=8'b11111110;//密碼錯誤,led1亮錯誤次數(shù)加一 wrong_cnt<=wrong_cnt+1; end end else led<=8'b00000000;//密碼輸錯三次,報警 endend三、密碼修改實現(xiàn)//修改控制模塊always@(posedgeclk) begin if(!rst) change<=0; elseif(led<=8'b01111111) change<=1; if(change==1&&high_d) begin newcode_high<=sw; end elseif(change==1&&low_d) begin newcode_low<=sw; end endendmodule四、按鍵消抖實現(xiàn)//按鍵消抖模塊moduledebounce(clk,rst,key,key_pulse);parameterN=2;//要消除的按鍵的數(shù)量 inputclk;inputrst;input [N-1:0]key;//輸入的按鍵 output[N-1:0]key_pulse;//按鍵動作產(chǎn)生的脈沖 reg[N-1:0]key_rst_pre;//定義一個寄存器型變量存儲上一個觸發(fā)時的按鍵值reg[N-1:0]key_rst;//定義一個寄存器變量儲存儲當前時刻觸發(fā)的按鍵值wire[N-1:0]key_edge;//檢測到按鍵由高到低變化是產(chǎn)生一個高脈沖//利用非阻塞賦值特點,將兩個時鐘觸發(fā)時按鍵狀態(tài)存儲在兩個寄存器變量中always@(posedgeclkornegedgerst)begin if(!rst) begin key_rst<={N{1'b1}};//初始化時給key_rst賦值全為1,{}中表示N個1key_rst_pre<={N{1'b1}};endelse begin key_rst<=key;//第一個時鐘上升沿觸發(fā)之后key的值賦給key_rst,同時key_rst的值賦給key_rst_pre key_rst_pre<=key_rst;//非阻塞賦值。相當于經(jīng)過兩個時鐘觸發(fā),key_rst存儲的是當前時刻key的值,key_rst_pre存儲的是前一個時鐘的key的值endendassignkey_edge=key_rst_pre&(~key_rst);//脈沖邊沿檢測。當key檢測到下降沿時,key_edge產(chǎn)生一個時鐘周期的高電平 reg [17:0] cnt;//產(chǎn)生延時所用的計數(shù)器,系統(tǒng)時鐘12MHz,要延時20ms左右時間,至少需要18位計數(shù)器//產(chǎn)生20ms延時,當檢測到key_edge有效是計數(shù)器清零開始計數(shù)always@(posedgeclkornegedgerst) begin if(!rst) cnt<=18'h0;elseif(key_edge)cnt<=18'h0;elsecnt<=cnt+1'h1;endreg[N-1:0]key_sec_pre;//延時后檢測電平寄存器變量reg[N-1:0]key_sec;//延時后檢測key,如果按鍵狀態(tài)變低產(chǎn)生一個時鐘的高脈沖。如果按鍵狀態(tài)是高的話說明按鍵無效always@(posedgeclkornegedgerst) begin if(!rst) key_sec<={N{1'b1}};elseif(cnt==18'h3ffff)key_sec<=key;endalways@(posedgeclkornegedgerst) begin if(!rst) key_sec_pre<={N{1'b1}};elsekey_sec_pre<=key_sec;endassignkey_pulse=key_sec_pre&(~key_sec);endmodule4.附錄,源碼圖以及源碼//頂層模塊modulesafebox_plus( inputclk, input[3:0]sw,//四位撥碼開關(guān),用作十進制密碼 inputrst,//復位鍵 inputenter,//密碼確認鍵 inputhigh,//十位輸入鍵 inputlow,//個位輸入鍵 outputreg[7:0]led,//八位報警燈,led8為正確提示燈,led1為錯誤提示燈 outputreg[8:0]seg_led1,//數(shù)碼管1顯示個位密碼 outputreg[8:0]seg_led2//數(shù)碼管2顯示十位密碼);parameterX=4'd0;//用作初始密碼parameterY=4'd0;wireenter_d;//key[3]確認密碼輸入wirelow_d;//key[1]個位確認wirehigh_d;//key[2]十位確認reg[1:0]wrong_cnt;//統(tǒng)計錯誤次數(shù)reg[3:0]code_low;//個位密碼reg[3:0]code_high;//十位密碼regchange;//可修改密碼狀態(tài)reg[3:0]newcode_low;//更新密碼個位reg[3:0]newcode_high;//更新密碼十位//例化調(diào)用消抖模塊debounce#(.N(3))u1( .clk(clk), .rst(rst), .key({enter,low,high}), .key_pulse({enter_d,low_d,high_d}));always@(*)//數(shù)碼管顯示控制模塊begin case(code_low) 4'd0:seg_led1=9'b000111111;//數(shù)碼管1顯示0 4'd1:seg_led1=9'b000000110;//1 4'd2:seg_led1=9'b001011011;//2 4'd3:seg_led1=9'b001001111;//3 4'd4:seg_led1=9'b001100110;//4 4'd5:seg_led1=9'b001101101;//5 4'd6:seg_led1=9'b001111101;//6 4'd7:seg_led1=9'b000000111;//7 4'd8:seg_led1=9'b001111111;//8 4'd9:seg_led1=9'b001101111;//9 default:seg_led1=9'b100111111;//0 endcase case(code_high) 4'd0:seg_led2=9'b000111111;//數(shù)碼管2顯示0 4'd1:seg_led2=9'b000000110;//1 4'd2:seg_led2=9'b001011011;//2 4'd3:seg_led2=9'b001001111;//3 4'd4:seg_led2=9'b001100110;//4 4'd5:seg_led2=9'b001101101;//5 4'd6:seg_led2=9'b001111101;//6 4'd7:seg_led2=9'b000000111;//7 4'd8:seg_led2=9'b001111111;//8 4'd9:seg_led2=9'b001101111;//9 default:seg_led2=9'b100111111;//0 endcaseendalways@(posedgeclk)//密碼判斷begin if(!rst) begin wrong_cnt<=2'b00;//初始錯誤次數(shù)為0 code_low<=4'b0000; code_high<=4'b0000; led<=8'b11111111; end elseif(low_d) begin code_low<=sw; end elseif(high_d) begin code_high<=sw; end elseif(enter_d) begin if(wrong_cnt!=2'd2) begin if((code_low==Y&&code_high==X)||(code_low==newcode_low&&code_high==newcode_high)) begin led<=8'b01111111; wrong_cnt<=2'd0; end else begin led<=8'b11111110; wrong_cnt<=wrong_cnt+1; end end else led<=8'b00000000; endend//修改控制模塊always@(posedgeclk) begin if(!rst) change<=0; elseif(led<=8'b01111111) change<=1; if(change==1&&high_d) begin newcode_high<=sw; end elseif(change==1&&low_d) begin newcode_low<=sw; end endendmodule//按鍵消抖模塊moduledebounce(clk,rst,key,key_pulse);parameterN=2;//要消除的按鍵的數(shù)量 inputclk;inputrst;input [N-1:0]key;//輸入的按鍵 output[N-1:0]key_pulse;//按鍵動作產(chǎn)生的脈沖 reg[N-1:0]key_rst_pre;//定義一個寄存器型變量存儲上一個觸發(fā)時的按鍵值reg[N-1:0]key_rst;//定義一個寄存器變量儲存儲當前時刻觸發(fā)的按鍵值wire[N-1:0]key_edge;//檢測到按鍵由高到低變化是產(chǎn)生一個高脈沖//利用非阻塞賦值特點,將兩個時鐘觸發(fā)時按鍵狀態(tài)存儲在兩個寄存器變量中always@(posedgeclkornegedgerst)begin if(!rst) begin key_rst<={N{1'b1}};//初始化時給key_rst賦值全為1,{}中表示N個1key_rst_pre<={N{1'b1}};endelse begin key_rst<=key;//第一個時鐘上升沿觸發(fā)之后key的值賦給key_rst,同時key_rst的值賦給key_rst_pre key_rst_pre<=key_rst;//非阻塞賦值。相當于經(jīng)過兩個時鐘觸發(fā),key_rst存儲的是當前時刻key的值,key_rst_pre存儲的是前一個時鐘的key的值endendassignkey_edge=key_rst_pre&(~key_rst);//脈沖邊沿檢測。當key檢測到下降沿時,key_edge產(chǎn)生一個時鐘周期的高電平 reg [17:0] cnt;//產(chǎn)生延時所用的計數(shù)器,系統(tǒng)時鐘12MHz,要延時20ms左右時間,至少需要18

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論