|
2.2 程序设计
设计一个高脉冲计数器count1和一个低脉冲计数器conut0。引入一个采样脉冲信号clk,对输入信号button_in进行采样,并对clk进行计数。若button_in为高电平,count1做加法计数,直到count1各位全为1,停止计数,归零,使消抖后的输出信号button_out输出1。若button_in为低电平,count0做加法计数,直到count0各位全为1,停止计数归零,并使消抖后的输出信号button_out输出0。
部分程序如下:
module filter(clk,
reset,
button_in,
button_out);
input clk;
input reset;
input button_in;
output button_out;
wire buttong_out1;
reg [20:0] count0;
reg [20:0] count1;
reg button_out1_reg;
……
assign button_out=button_out1_reg;
//对输入进行采样,计数
always@(posedge clk or negedge reset)
begin
if(!reset) count1<=21'h000000;
else if(button_out1==1'b1) count1<=count1+1;//对高电平计数
else count1<=21'h000000;
end
always@(posedge clk or negedge reset)
begin
if(!reset) count0<=21'h000000;
else if(button_out1==1'b0) count0<=count0+1;//对低电平计数
else count0<=21’h000000;
end
//输出
always@(posedge clk or negedge reset
begin
if(!reset) button_out1_reg<=1'b1;
else if(count0==21'h1312D0) //判断低电平信号是否符合输出条件
button_out1_reg<=1'b0; //如果符合条件,则输出低电平
else if(count1==21'h1312D0) //判断低电平信号是否符合输出条件
button_out1_reg<=1'b1; //如果符合条件,则输出高电平
else button_out1_reg<=button_out1_reg;
end
endmodule
3 按键弹跳消除模块的实际应用
利用Memec virtex-4 开发板,通过开发板上的按钮输入8位的01控制代码,用开发板上的开关输入状态控制位,从而控制板上的1602 C型字符型液晶模块的显示模式和内容。
LCD控制信号生成模块:根据按钮输入,产生控制显示模块的8位控制信号。对按钮送入该模块的1位(0/1)信号进行保存并进行转换,使每8次输入形成一个8位的信号。如果输入不满8位或需重新输入,则取消上次结果;如果确定输入结果正确,则将8位信号保存并输出。
LCD显示控制模块:完成1602 C型字符型液晶模块的初始化,并根据控制信号完成状态转换。
结束语
本文进行性模块化设计,实现了弹跳消除电路模块、LCD控制信号生成模块和LCD显示控制模块组成的系统的具体功能,在Memec实验板上运行效果良好。并且在用FPGA进行电路调试的时候,可以将该系统嵌入其它电路中,增加需要的测试点和观察点,通过按钮控制显示,可以动态的对电路进行测试,找出问题,使调试更加直观,从而提高的FPGA的内部信号的可观察性,提高验证效率。 |
|