【数字系统设计---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系列设计而开发。它提供了从设计、仿真到编程和调试的完整流程支持。主要功能包括:
功能 | |
---|---|
硬件描述语言支持 | 支持Verilog和VHDL语言,使设计师可以灵活选择合适的编程语言进行项目开发。 |
图形化设计界面 | 提供用户友好的图形界面,方便用户进行电路图的设计与管理。 |
仿真工具 | 集成仿真工具,可以对设计进行时序仿真和功能验证,确保设计的正确性。 |
编程和调试 | 支持直接将设计下载到FPGA开发板,并提供调试工具,方便用户实时监测和调整设计。 |
IP核库 | 内置丰富的IP核(知识产权核心)库,用户可以快速集成现成的模块,提升设计效率。 |
下载和具体使用方式可以参考下面的文章:国产高云GoWin软件使用(初级)
2. GW1N9开发板
高云半导体GW1N系列FPGA产品是高云半导体小蜜蜂(LittleBee卿)家族第一代可编程逻辑器件产品,具有较丰富的逻辑资源,支持多种I/0电平标准,内嵌块状静态随机存储器、数字信号处理模块、锁相环资源,此外,内嵌Flash资源,是一款具有非易失性的FPGA产品,具有低功耗、瞬时启动、低成本、高安全性、产品尺寸小、封装类型丰富、使用方便灵活等特点。
开发板包含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. 数字密码锁介绍
数字密码锁作为一种数字系统,具有广泛的应用前景。与传统的机械锁相比,数字密码锁操作便捷、防盗性强且无需钥匙即可解锁。其主要功能包括:
- 支持通过外部按键等外设输入四位或以上的密码。
- 初始状态下,数码管显示当前输入为 “----”,此时不进行密码验证。
- 提供输入清除功能,便于用户重新输入密码。
- 支持双密码设置:用户密码和万能密码,防止用户遗忘。
- 在密码输入正确或错误时,会发出相应的控制信号(如 LED 闪烁等)。
- 具备其他特色功能(如密码输入超过五次自动锁定一段时间),升安全性。
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。通过参数WIDTH和DATA_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