一、硬件设计
需要说明的是,由于蜂鸣器需要的驱动电流较大,使用默认8mA的驱动电流有可能出现蜂
鸣器发声较小的情况,解决方法是将蜂鸣器输出的驱动电流修改成12mA或者是16mA,如下图所
示:
二、程序设计
top_key_beep.v
//****************************************Copyright (c)***********************************//
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//关注微信公众平台微信号:"正点原子",免费获取FPGA & STM32资料。
//版权所有,盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name: top_key_beep
// Last modified Date: 2018年5月7日14:31:09
// Last Version: V1.1
// Descriptions: 按键消抖
//----------------------------------------------------------------------------------------
// Created by: 正点原子
// Created date: 2018年5月7日14:31:36
// Version: V1.0
// Descriptions: The original version
//
//----------------------------------------------------------------------------------------
// Modified by: 正点原子
// Modified date: 2018/4/24 9:56:36
// Version: V1.1
// Descriptions: 顶层模块
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//
module top_key_beep(
input sys_clk, //时钟信号50Mhz
input sys_rst_n, //复位信号
input key, //按键信号
output beep //蜂鸣器控制信号
);
//wire define
wire key_value;
wire key_flag;
//*****************************************************
//** main code
//*****************************************************
//例化按键消抖模块
key_debounce u_key_debounce(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.key (key),
.key_flag (key_flag),
.key_value (key_value)
);
//例化蜂鸣器控制模块
beep_control u_beep_control(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.key_flag (key_flag),
.key_value (key_value),
.beep (beep)
);
endmodule
beep_control.v
//****************************************Copyright (c)***********************************//
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//关注微信公众平台微信号:"正点原子",免费获取FPGA & STM32资料。
//版权所有,盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name: beep_control
// Last modified Date: 2018/5/7 9:56:36
// Last Version: V1.1
// Descriptions: 按键消抖
//----------------------------------------------------------------------------------------
// Created by: 正点原子
// Created date: 2018/4/29 10:55:56
// Version: V1.0
// Descriptions: The original version
//
//----------------------------------------------------------------------------------------
// Modified by: 正点原子
// Modified date: 2018/4/24 9:56:36
// Version: V1.1
// Descriptions: 按键控制蜂鸣器
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//
module beep_control(
//input
input sys_clk, //系统时钟
input sys_rst_n, //复位信号,低电平有效
input key_flag, //按键有效信号
input key_value, //消抖后的按键信号
output reg beep //蜂鸣器控制信号
);
//*****************************************************
//** main code
//*****************************************************
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
beep <= 1'b1;
else if(key_flag && (~key_value)) //判断按键是否有效按下
beep <= ~beep;
end
endmodule
key_debounce.v
//****************************************Copyright (c)***********************************//
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//关注微信公众平台微信号:"正点原子",免费获取FPGA & STM32资料。
//版权所有,盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name: key_debounce
// Last modified Date: 2018/4/24 9:56:36
// Last Version: V1.1
// Descriptions: 按键消抖
//----------------------------------------------------------------------------------------
// Created by: 正点原子
// Created date: 2018/3/29 10:55:56
// Version: V1.0
// Descriptions: The original version
//
//----------------------------------------------------------------------------------------
// Modified by: 正点原子
// Modified date: 2018/4/24 9:56:36
// Version: V1.1
// Descriptions: 通过计数消除机械按键抖动
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//
module key_debounce(
input sys_clk, //外部50M时钟
input sys_rst_n, //外部复位信号,低有效
input key, //外部按键输入
output reg key_flag, //按键数据有效信号
output reg key_value //按键消抖后的数据
);
//reg define
reg [31:0] delay_cnt;
reg key_reg;
//*****************************************************
//** main code
//*****************************************************
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
key_reg <= 1'b1;
delay_cnt <= 32'd0;
end
else begin
key_reg <= key;
if(key_reg != key) //一旦检测到按键状态发生变化(有按键被按下或释放)
delay_cnt <= 32'd1000000; //给延时计数器重新装载初始值(计数时间为20ms)
else if(key_reg == key) begin //在按键状态稳定时,计数器递减,开始20ms倒计时
if(delay_cnt > 32'd0)
delay_cnt <= delay_cnt - 1'b1;
else
delay_cnt <= delay_cnt;
end
end
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
key_flag <= 1'b0;
key_value <= 1'b1;
end
else begin
if(delay_cnt == 32'd1) begin //当计数器递减到1时,说明按键稳定状态维持了20ms
key_flag <= 1'b1; //此时消抖过程结束,给出一个时钟周期的标志信号
key_value <= key; //并寄存此时按键的值
end
else begin
key_flag <= 1'b0;
key_value <= key_value;
end
end
end
endmodule
这里我们补充下如何查看软件生成的模块端口及信号连接图。首先在对工程进行编译,然
后点击菜单栏的【 Tools】→【 NetList Viewers】→【 RTL Viewer】,如图 9.4.2所示: