1.试验任务:
使用按键控制蜂鸣器发声。 初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停
止鸣叫,再次按下开关,蜂鸣器重新鸣叫。
2. 按键消抖
3.程序设计
文章来源:https://www.toymoban.com/news/detail-520481.html
3.1消抖模块
// An highlighted block
module key_debounce( //消抖模块
input sys_clk, //时钟信号,50Mhz
input sys_rst_n, //复位信号
input key, //按键
output reg key_flag, //按键有效的标志
output reg key_value //按键有效的值
);
reg key_reg; //key的寄存器,比对两个时钟时将值放在寄存器内
reg [19:0]delay_cnt; //延时20ns的寄存器,20ms=20000000ns,20000000ns/20=1000000个时钟周期,位宽为20位
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin //按下复位按键
key_reg <= 1'b1; //key_reg按键为低电平有效,所以拉高
delay_cnt <= 20'd0; //计数器清零
end
else begin
key_reg <= key; //将key的值存入寄存器中(注,key的值等到下一个边沿过来时,才会传递给key_reg,既key_reg的值和key的值相差一个时钟周期)
if(key_reg!=key) //上一个值是否和当前值相同,若按下按键则当前值和上一值不同,则进入该语句
delay_cnt <= 32'd100_0000; //把delay_cnt寄存器充满20ms
else if(key_reg==key)begin //上一个值是否和当前值相同,若没有按按键则当前值和上一值相同,则进入该语句
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; //如果复位将flag清零
key_value <= 1'b1; //为低时才判定按键按下
end
else begin
if(delay_cnt == 32'd1)begin
key_flag <= 1'b1;
key_value <= key;
end
else begin
key_flag <= 1'b0;
key_value <= key_value;
end
end
end
endmodule
3.2消抖模块流程图
文章来源地址https://www.toymoban.com/news/detail-520481.html
3.3 蜂鸣器驱动模块程序
// An highlighted block
module beep_control( //消抖模块
input sys_clk, //时钟信号,50Mhz
input sys_rst_n, //复位信号
input key_flag, //按键有效的标志
input key_value, //按键有效的值
output reg beep
);
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
3.4 顶层例化模块程序
// An highlighted block
module top_key_beep(
input sys_clk, //时钟信号,50Mhz
input sys_rst_n, //复位信号
input key,
output beep
);
wire key_flag;
wire key_value;
key_debounce key_debounce_u(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.key (key),
.key_flag (key_flag),
.key_value (key_value)
);
beep_control beep_control_u(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.key_flag (key_flag),
.key_value (key_value),
.beep (beep)
);
endmodule
3.5 ucf模块
// An highlighted block
NET sys_clk TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 20ns HIGH 50%;
#------------------------------系统时钟和复位-----------------------------------
NET sys_clk LOC = N8 | IOSTANDARD = "LVCMOS33";
NET sys_rst_n LOC = G16 | IOSTANDARD = "LVCMOS33";
NET "key" LOC = P5 | IOSTANDARD = "LVCMOS33";
NET beep LOC = P4 | IOSTANDARD = "LVCMOS33";
到了这里,关于key_beep按键控制蜂鸣器程序及流程图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!