【小梅哥FPGA進階教程】第十二章 數字密碼鎖設計


十二、數字密碼鎖設計

本文由山東大學研友袁卓貢獻,特此感謝

實驗目的

實現數字密碼鎖設計,要求矩陣按鍵輸出且數碼管顯示輸入密碼,密碼輸入正確與否均會有相應標志信號產生。

實驗平台

芯航線FPGA核心板、數碼管_VGA_PS2模塊、矩陣按鍵模塊

圖片1

實驗原理

隨着生活質量的提高,當代人們也認識到了安全的重要性,已經不再滿足於老式的機械鑰匙。近年來越來越多的技術開始在安全領域應用,例如普通的按鍵輸入、指紋輸入或者虹膜輸入等。

本節設計一款按鍵輸入式密碼鎖,用矩陣鍵盤輸入密碼,輸入完成后進行密碼比對,如密碼輸入正確則輸出開門信號以及燈光指示,如密碼輸入錯誤則蜂鳴器進行報警以及燈光指示。

綜合以上要求可以看出此處系統框圖如圖1所示。

圖片2

圖1 系統框圖

其中各模塊功能描述如表1所示。

圖片3

表1 各模塊功能描述

矩陣按鍵模塊

現在分開介紹,矩陣按鍵輸入控制模塊的框圖及其接口列表如下所示,詳細內容可以參考芯航線關於矩陣按鍵的教程,此處不再詳述。

 

圖片4

圖2 矩陣按鍵模塊框圖

圖片5

表2 矩陣按鍵模塊接口列表

密碼比較模塊:

現介紹密碼檢測模塊,其主要功能即比較輸入與預設的密碼是否一致,

圖片6

圖2 密碼檢測模塊框圖

圖片7

表2 密碼檢測模塊列表

這里先將密碼設置為4位十進制數1234,如下所示

parameter PASSWORD = 16'b0001_0010_0011_0100;

通過計數矩陣按鍵按下標志信號,依次將數據暫存到寄存器mima_r中。

    always@(posedge Clk or negedge Rst_n) begin
    if(!Rst_n)
        key_cnt <= 2'b0;
    else if(key_flag) begin 
        if(key_cnt == 2'd3)
            key_cnt <= 2'b0;
        else 
            key_cnt <= key_cnt + 1'b1;
    end 
    else 
        key_cnt <= key_cnt;
    end 

    always@(posedge Clk or negedge Rst_n) begin
    if(!Rst_n)
        mima_r <= 16'b0;
    else if(key_flag)
        case(key_cnt)
            2'd0: mima_r[15:12] <= key_value[3:0]; 
            2'd1: mima_r[11:8]  <= key_value[3:0]; 
            2'd2: mima_r[7:4]   <= key_value[3:0]; 
            2'd3:   mima_r[3:0]   <= key_value[3:0];    
            default: mima_r <= 0;   
        endcase 
    else 
        mima_r <= mima_r;   
    end 

 

 

這里通過一個獨立按鍵來控制比較信號,用到了按鍵消抖模塊,詳細內容可以參考芯航線有關章節。

    wire key_startbj_flag;wire key_startbj_state;

    key_filter key_filter_start(
        .Clk(Clk),
        .Rst_n(Rst_n),
        .key_in(start_bj),
        .key_flag(key_startbj_flag),
        .key_state(key_startbj_state)
        );

當開始比較后,根據實際情況判斷后輸出正確與否。

    always@(posedge Clk or negedge Rst_n)begin
        if(!Rst_n) begin 
            error <= 1'b0;
            right   <= 1'b0;
        end
        else if(key_startbj_flag && !key_startbj_state)begin  
            if(mima_r == PASSWORD) begin 
                right <= 1'b1;
                error <= 1'b0;
            end 
            else begin  
                right   <= 1'b0;
                error <= 1'b1;
            end 
        end 
        else begin
            error <= 1'b0;
            right   <= 1'b0;
        end 
    end 

控制模塊:

現在介紹模塊的控制單元。本模塊主要功能是根據密碼檢測模塊的輸出確定,開關門信號以及聲光信號。其模塊接口列表及功能描述如下所示。

 

圖片12

圖3 控制模塊框圖

圖片13

表3 控制模塊接口列表

在這里使用三段式狀態機進行描述。

    parameter   IDLE  = 3'b001,
                    PASS  = 3'b010,
                    ALARM = 3'b100;

第一個always塊:

    always@(posedge Clk or negedge Rst_n) begin
        if(!Rst_n) 
            current_state <= IDLE;
        else 
            current_state <= next_state;
    end 

第二個always塊:

    always@(current_state or error or right or cnt_2s) begin 
        case(current_state)            
            IDLE: begin
                if(right)
                    next_state = PASS;
                else if(error)
                    next_state = ALARM; 
                else 
                    next_state = IDLE;      
            end             
            PASS: begin             
                if(cnt_2s) //door_close
                    next_state = IDLE;
                else 
                    next_state = PASS;      
            end 
            ALARM: begin
                if(cnt_2s)  
                    next_state = IDLE; 
                else 
                    next_state = ALARM; 
            end             
            default: next_state = IDLE;             
        endcase 
    end

第三個always塊:

    always@(posedge Clk or negedge Rst_n) begin
        if(!Rst_n) begin 
            door_open_r  <= 1'b0;  led_alarm_r  <= 1'b0;
            led_right_r  <= 1'b0;  beep_En <= 1'b0;            
        end 
        else begin 
            case(next_state) 
                IDLE: begin
                    door_open_r  <= 1'b0; led_alarm_r  <= 1'b0;
                    led_right_r  <= 1'b0; beep_En <= 1'b0;                    
                end 
                PASS: begin
                    if(cnt_2s)begin 
                        door_open_r  <= 1'b0; led_alarm_r  <= 1'b0;
                        beep_En <= 1'b0;     led_right_r  <= 1'b0;
                    end 
                    else begin          
                        door_open_r = 1'b1;led_right_r = 1'b1;
                    end 
                end 
                ALARM: begin
                    if(cnt_2s) begin 
                        led_alarm_r = 1'b0; beep_En = 1'b0;
                    end 
                    else begin 
                        led_alarm_r = 1'b1;  beep_En = 1'b1;
                    end 
                end
                default:    begin           
                    door_open_r  <= door_open_r;                     led_alarm_r  <= led_alarm_r;
                    beep_En <= beep_En;
                    led_right_r  <= led_right_r; 
                end 
            endcase 
        end 
    end

 



數碼管顯示模塊:

Hex8為數碼管顯示模塊,其框圖以及其接口列表如下所示,具體功能介紹可參見芯航線相關內容。

圖片18

圖4 數碼管顯示模塊框圖

圖片19

表4 數碼管顯示模塊接口列表

頂層設計:

最后在頂層例化各模塊即可,分配引腳后全編譯無誤后即可下載到芯航線開發板中觀測到對應現象。

圖片20

圖5 頂層文件RTL Viewer

如有更多問題,歡迎加入芯航線 FPGA 技術支持群交流學習:472607506

小梅哥

芯航線電子工作室

關於學習資料,小梅哥系列所有能夠開放的資料和更新(包括視頻教程,程序代碼,教程文檔,工具軟件,開發板資料)都會發布在我的雲分享。(記得訂閱)鏈接:http://yun.baidu.com/share/home?uk=402885837&view=share#category/type=0

贈送芯航線AC6102型開發板配套資料預覽版下載鏈接:鏈接:http://pan.baidu.com/s/1slW2Ojj 密碼:9fn3

贈送SOPC公開課鏈接和FPGA進階視頻教程。鏈接:http://pan.baidu.com/s/1bEzaFW 密碼:rsyh


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM