• 【小梅哥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

  • 相关阅读:
    memcached注意事项与应用范围、应用条件、限制
    memcached系列之二
    Memcached系列之一
    memcached监控工具
    memcached能获取所有的key吗
    数据库数据处理性能提升技术
    memcached Java Client
    衡量企业应用数据库性能的6大指标
    objelement = event.target || event.srcElement;
    com.alibaba.com.caucho.hessian.io.SerializerFactory getDeserializer
  • 原文地址:https://www.cnblogs.com/xiaomeige/p/6419728.html
Copyright © 2020-2023  润新知