首页 > 其他分享 >【数字系统设计---FPGA】基于GW1N9系列开发板数字密码锁设计

【数字系统设计---FPGA】基于GW1N9系列开发板数字密码锁设计

时间:2024-11-13 09:49:23浏览次数:3  
标签:数字 FPGA 密码 计数器 模块 设计 密码锁

【数字系统设计---FPGA】基于GW1N9开发板数字密码锁设计

引言

在这篇文章中,我将带领大家完成一个简单基于FPGA的数字密码锁设计项目。本项目基于GW1N9开发板,利用Gowin开发工具进行设计。

文章将从FPGA的基础知识入手,逐步介绍Gowin工具的基本操作以及开发板的使用方法。接着,我们将深入探讨数字密码锁的设计总体思路和模块化实现方法。在此过程中,我将介绍密码锁的核心模块,包括密码输入、密码验证、LED指示报警控制等模块,并详细讲解每个模块的设计细节和相互配合关系。此外,文章还会列出在设计过程中常见的故障排查,以帮助读者更好地理解和调试设计中的问题。在最后的改进建议部分,我将分享一些优化思路,帮助大家进一步提升项目的性能与可靠性。

通过阅读本文,希望读者能够掌握如何使用FPGA和Gowin工具进行数字系统的设计和调试,并能够独立完成类似的数字系统设计项目。

一、数字系统—FPGA简介

FPGA(现场可编程门阵列)是一种高度灵活的数字电路设计平台,广泛应用于各种电子系统中。与传统的固定功能集成电路(ASIC)相比,FPGA的主要优势在于其可编程性和可重配置性,使得设计师可以根据需要随时修改电路功能。这种特性使得FPGA在原型验证、产品开发及小批量生产等场合尤为有用。

FPGA内部包含大量的逻辑单元、存储单元和可编程互连资源,设计师可以通过硬件描述语言(如Verilog或VHDL)对FPGA进行编程,定义逻辑功能和数据处理流程。FPGA的应用领域包括但不限于通信系统、图像处理、数字信号处理、控制系统和嵌入式系统。

二、Gowin工具介绍

1. Gowin开发工具

Gowin开发工具是一个集成的开发环境,专为Gowin FPGA系列设计而开发。它提供了从设计、仿真到编程和调试的完整流程支持。主要功能包括:

功能
硬件描述语言支持 支持VerilogVHDL语言,使设计师可以灵活选择合适的编程语言进行项目开发。
图形化设计界面 提供用户友好的图形界面,方便用户进行电路图的设计与管理。
仿真工具 集成仿真工具,可以对设计进行时序仿真和功能验证,确保设计的正确性。
编程和调试 支持直接将设计下载到FPGA开发板,并提供调试工具,方便用户实时监测和调整设计。
IP核库 内置丰富的IP核(知识产权核心)库,用户可以快速集成现成的模块,提升设计效率。

下载和具体使用方式可以参考下面的文章:国产高云GoWin软件使用(初级)

2. GW1N9开发板

高云半导体GW1N系列FPGA产品是高云半导体小蜜蜂(LittleBee卿)家族第一代可编程逻辑器件产品,具有较丰富的逻辑资源,支持多种I/0电平标准,内嵌块状静态随机存储器、数字信号处理模块、锁相环资源,此外,内嵌Flash资源,是一款具有非易失性的FPGA产品,具有低功耗、瞬时启动、低成本、高安全性、产品尺寸小、封装类型丰富、使用方便灵活等特点。
GW1N9系列开发板示意图
开发板包含50MHz时钟晶振、USB Type-C转JTAG、USB Type-C转UART、8个单色LED灯、8个按键、一个6位数码管、一个4位拨码开关、8颗带IC的RGB三色LED灯、一个无源蜂鸣器、SPI Flash等资源,其他I0均通过2个排针引出。2个USB Type-C接口均可为板卡供电。

三、数字密码锁设计

1. 数字密码锁介绍

数字密码锁作为一种数字系统,具有广泛的应用前景。与传统的机械锁相比,数字密码锁操作便捷、防盗性强且无需钥匙即可解锁。其主要功能包括:

  1. 支持通过外部按键等外设输入四位或以上的密码。
  2. 初始状态下,数码管显示当前输入为 “----”,此时不进行密码验证。
  3. 提供输入清除功能,便于用户重新输入密码。
  4. 支持双密码设置:用户密码和万能密码,防止用户遗忘。
  5. 在密码输入正确或错误时,会发出相应的控制信号(如 LED 闪烁等)
  6. 具备其他特色功能(如密码输入超过五次自动锁定一段时间),升安全性。

2. 总体设计思路

密码锁流程图
用户按下数字按钮后,按键模块采集输入,与此同时数码管显示输入的密码或存储的密码,并在复位时同步清零显示,确保系统状态直观可见。根据拨码开关选择设置模式或输入模式,将输入缓存或存储为密码。当用户按下确认按钮后,生成输入有效信号。此时,密码检测模块接收输入密码和已存储密码进行验证,输出匹配结果(成功或失败)。接着,LED模块根据验证结果点亮相应的指示灯,Buzzer模块在验证失败时触发蜂鸣器发出声响。

3. 模块化设计

3.1 基础模块(分频、移位寄存器等)

以下提到的基础模块是构建顶层设计的基本单元,类似于搭建房子所需的一块块积木。通过这些模块的组合和拼接,可以形成系统的各个部分,最终汇集成完整的顶层模块。值得注意的是,这些基础模块不仅限于单个项目的应用,而是通用的、可复用的设计,适合在各类项目中使用。希望大家能收藏这些模块,以备在未来的设计中使用。

3.1.1 计数器模块
`timescale 1ns/1ns

module counter #(
    parameter WIDTH = 4,             // 定义计数器位宽,默认为4位
    parameter DATA_MAX = 15          // 定义计数器的最大值,默认为15
)(
    input clk,                       // 时钟输入信号
    input rst,                       // 复位信号,高电平有效
    input clear_i,                   // 清零信号,高电平有效
    input enable_i,                  // 使能信号,高电平有效
    output reg cout_o,               // 进位输出信号,当计数溢出时为1
    output reg [WIDTH-1:0] count_o   // 当前计数值输出
);

    localparam SIM_DELAY = 1;        // 模拟延时参数,确保计数器变化与时钟同步

    // 计数器逻辑,响应时钟和复位信号
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            // 当复位信号有效时,计数器和进位输出清零
            cout_o <= #SIM_DELAY 0;
            count_o <= #SIM_DELAY 0;
        end else if (clear_i) begin
            // 当清零信号有效时,计数器和进位输出清零
            cout_o <= #SIM_DELAY 0;
            count_o <= #SIM_DELAY 0;
        end else if (enable_i) begin
            // 当使能信号有效时,计数器开始计数
            if (count_o < DATA_MAX) begin
                // 如果当前计数值小于最大值,计数器递增
                cout_o <= #SIM_DELAY 1'b0;           // 溢出信号保持为0
                count_o <= #SIM_DELAY count_o + 1;   // 计数值加1
            end else begin
                // 如果计数器达到最大值,触发溢出信号
                cout_o <= #SIM_DELAY 1'b1;           // 溢出信号置为1
                count_o <= #SIM_DELAY 0;             // 计数器重置为0
            end
        end else begin
            // 如果使能信号无效,保持当前进位输出信号
            cout_o <= #SIM_DELAY 0;
        end
    end

endmodule

计数器模块根据时钟输入进行计数,具有复位、清零和使能控制功能。当复位或清零信号有效时,计数器和进位信号被重置;在使能信号有效时,计数器递增并在达到DATA_MAX时溢出触发cout_o,同时重置为0。通过参数WIDTHDATA_MAX,配置计数器的位宽和最大计数值,以适应不同的应用需求。

3.1.2 分频模块

分频模块通过计数器对输入时钟进行分频,支持方波和脉冲两种输出模式。

`timescale 1ns/1ns

module freq_div #(
    parameter PULSE_MODE_EN = 1'b0,    // 脉冲模式使能,1表示输出单个脉冲,0表示输出方波
    parameter DIV_RATE      = 10,      // 分频率,即输入时钟被分频的倍数
    parameter INIT_VALUE    = 0        // 初始化计数器的值
)(
    input clk,                         // 输入时钟信号
    input rst,                         // 复位信号,高电平有效
    
    input enable_i,                    // 使能信号,高电平时分频模块工作
    output reg clk_out_o               // 输出分频后的时钟信号
);

    localparam CNT_WIDTH = $clog2(DIV_RATE); // 计数器位宽,满足DIV_RATE所需的最小位宽
    localparam CNT_MAX   = PULSE_MODE_EN ? DIV_RATE-1 : DIV_RATE/2-1; 
    // 当PULSE_MODE_EN为1时,计数器达到DIV_RATE-1触发输出脉冲;为0时达到DIV_RATE/2-1切换输出方波信号

    reg [CNT_WIDTH-1:0] counter;           // 定义计数器,计数到CNT_MAX后复位

    // 时钟驱动的计数器过程
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            // 当复位信号有效时,计数器和输出信号清零
            counter   <= INIT_VALUE;
            clk_out_o <= 0;
        end else if (enable_i) begin
            // 当使能信号有效时,计数器开始计数
            if (counter < CNT_MAX) begin
                // 若计数器未达到最大值,继续计数
                counter   <= counter + 1;
                clk_out_o <= PULSE_MODE_EN ? 1'b0 :

标签:数字,FPGA,密码,计数器,模块,设计,密码锁
From: https://blog.csdn.net/qq_74144402/article/details/143468580

相关文章

  • 协伴丨商协会数字化解决方案,如何开启运营新篇章?
    2024年随着科技的快速进步和市场环境的不断变化,商协会的未来发展方向变得愈发引人关注。在全面迈向数字经济的时代背景下,商协会数字化转型已然势在必行。为了更好地服务会员单位,提升运营效率,商协会纷纷开始寻求更加便捷、高效的数字化解决方案。未来,商协会数字化解决方案的发......
  • 今日商协丨数字蝶变,商协会如何搭乘技术快车,领跑市场?
    随着技术的飞速发展和市场环境的不断演变,商协会数字化解决方案的未来发展方向正逐渐变得更加明朗和充满希望。如今,我们正处于一个以数据为核心驱动的时代,数字化已经成为提升商协会效率和竞争力的关键所在。在这样的背景下,商协会数字化解决方案无疑将在未来扮演更为重要的角色。......
  • 夏光明:数字能量风水、算命、看八字骗局大揭秘
    在现代社会,一些所谓的“大师”利用人们对未知的恐惧和对命运的好奇,通过互联网平台大肆宣传数字能量风水,算命、看八字,声称能够通过手机号码、生辰八字等预测个人命运并提供改运服务。然而,这些看似神秘的服务背后隐藏着精心策划的骗局。数字能量风水的虚假宣传所谓的“数字能......
  • 夏光明:手机号能改变命运?警惕“算命大师”的数字能量学诈骗
    在现代社会,当人们面临挑战和不顺时,有时会寻求“大师”的指引以求心灵的慰藉。然而,这种寻求帮助的行为有时会被不法分子所利用,成为诈骗的温床。2021年4月,郑州市的小韩就陷入了这样一个精心设计的诈骗陷阱。小韩在工作和生活中感到不顺,通过抖音了解到一个可以通过生辰八字测算数......
  • Java常用方法:StringUtils.isNotBlank()、StringUtils.isEmpty()、去除空格的函数、手
    Java常用方法:StringUtils.isNotBlank()、StringUtils.isEmpty()、去除空格的函数、手机号中间4位换成*、判断字符是否为数字要使用工具类StringUtils,首先得导入依赖<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><ve......
  • 数字相加,出现一大串小数问题
    方法1:使用整数进行计算通过将浮点数转换为整数进行计算,然后再转换回浮点数,可以有效避免浮点数精度问题。letnum1=68121.81;letnum2=181927.58;//将数字转换为整数进行计算lettotal=(num1*100+num2*100)/100;//使用toString()方法去掉多余的零和小数......
  • 字符串和数字的相互转换
    1、数字转字符串        方法1:使用String类的静态方法valueOf        方法2:先把基本类型装箱为对象,然后调用对象的toStringpublicclassTest{publicstaticvoidmain(String[]args){inti=8;//方法1......
  • 2024年人工智能与数字图书馆国际学术会议
    【Fellow领衔|高校认可会议|合作出版社:ACM】 2024年人工智能与数字图书馆国际学术会议2024年12月13-15日|中国-三亚2024InternationalConferenceon ArtificialIntelligenceandDigitalLibraries(AIDL2024)重要信息关于投稿大会官网:www.icaidl.com......
  • 网络安全领域的 16 个专业,零基础入门到精通,收藏这一篇就够了_数字取证
    ......
  • Z-library数字图书馆镜像地址/官网入口及客户端app (长期更新)
    Z-Library是一家电子图书馆,被誉为全球最大的科学图书和学术文献免费资源之一。它创办于2009年,截至2022年10月1日,已收录超过1129万本图书和8483万篇学术文章。从各种知名文学著作,理工学科,人文艺术、到学术论文等应有尽有!支持PDF、epub、mobi等多种格式图书资源下载绝对是你找书的不......