实验原理
若要使用开发板上面的四个SW按键来做计数输入,就需要知道一共按了几下按键。
在这种情况下不能像以前设计电路中,简单地使用输入时钟的上升沿来检测按键是否按
下。因为,如果分频以后的时钟频率是10Hz,按键一下按了1 秒钟,那么如果简单地
以时钟的上升沿来检测按键,程序就会认为实际一共按了十下按键。
我们经常使用的键盘也存在这种情况,这里就需要一部分电路来防止上面情况的出
现。
如果要防抖动,就不能用时钟去检测按键的按下状态,而要去检测按键按下或者抬
起的边沿。例如按键按下的时候就检测与按键连接的FPGA 管脚的下降沿,按键松开
的时候就检测与按键连接的FPGA 管脚的上升沿。这样就可以不用理会按键按下的时
间长度,根据按键按下或者抬起的次数来评定计数。
实验内容
本次实验设计一个防抖动电路,用来检测按键的输入。设置一个计数器,初始数值
为零。用防抖动检测电路来检测SW按键的输入,每检测到一次按键的按下或者抬起,
计数器的数值加一。在数码管显示计数器的数值。
module seg(clk,rst_n,data_in,data_out,data_en);
input clk,rst_n ;
input [3 :0 ] data_in ;
output [7 :0 ] data_out ;
output [3 :0 ] data_en ;
reg [7 :0 ] data_out ;
assign data_en = 4'b1111 ;
always @ ( posedge clk or negedge rst_n )
if( !rst_n )
data_out <= 8'b0000_0000 ;
else
begin
case( data_in )
4'b0000: data_out <= 8'b1111_1100 ;
4'b0000: data_out <= 8'b0110_0000 ;
4'b0000: data_out <= 8'b1101_1010 ;
4'b0000: data_out <= 8'b1111_0010 ;
4'b0000: data_out <= 8'b0110_0110 ;
4'b0000: data_out <= 8'b1011_0110 ;
4'b0000: data_out <= 8'b1011_1110 ;
4'b0000: data_out <= 8'b1110_0000 ;
4'b0000: data_out <= 8'b1111_1110 ;
4'b0000: data_out <= 8'b1111_0110 ;
endcase
end
endmodule
module counter(
clk,
rst_n,
data_in,
data_out
);
input clk,rst_n ;
input data_in ;
output [3 :0 ] data_out ;
reg [3 :0 ] data_out ;
always @ ( posedge clk or negedge rst_n )
if( !rst_n )
data_out <= 4'b0000 ;
else
begin
if( 1'b1 == data_in )
begin
if( 4'b1001 <= data_out )
data_out <= 4'b0000 ;
else
data_out <= data_out + 4'b0001 ;
end
else
data_out <= data_out ;
end
endmodule
module debounce(
clk,
rst_n,
key_i,
key_o
);
input clk;
input rst_n;
input key_i;
output key_o;
reg key_o;
wire key;
wire clk_slow;
//分频电路
reg [22:0] cnt;
reg [25:0] cnt_out;
wire key_o_reg ;
always @ ( posedge clk or negedge rst_n )
if ( !rst_n )
cnt <= 23'd0;
else
cnt <= cnt + 1'b1;
assign clk_slow = cnt[22];
//防反跳电路
reg temp_r [2:0];
reg key_r;
integer i;
always @ ( posedge clk_slow or negedge rst_n )
if ( !rst_n )
begin
for ( i = 0 ; i < 3; i = i+ 1)
temp_r[i] <= 'd0;
end
else
begin
temp_r[0] <= key_i;
temp_r[1] <= temp_r[0];
temp_r[2] <= temp_r[1];
end
assign key = (~temp_r[0]) & temp_r[1] & temp_r[2];
always @ ( posedge clk or negedge rst_n )
if ( !rst_n )
key_r <= 1'b0;
else
key_r <= key;
assign key_o_reg = key & (~key_r);
/*
always @ ( posedge clk or negedge rst_n )
if( !rst_n )
key_o <= 1'b0 ;
else
begin
if( cnt_out<='d33554432 )
begin
if( cnt_out=='d0 )
begin
if( key_o_reg )
begin
cnt_out <= 'd1 ;
key_o <= 1'b1 ;
end
else
begin
cnt_out <= 'd0 ;
key_o <= 1'b0 ;
end
end
else
cnt_out <= cnt_out + 'd1 ;
end
else
cnt_out <= 'd0 ;
end
*/
endmodule
module top_new(clk,
key_i,
rst_n,
data,
en);
input clk;
input key_i;
input rst_n;
output [7:0] data;
output [3:0] en;
wire [3:0] XLXN_1;
wire XLXN_3;
counter XLXI_1 (.clk(clk),
.data_in(XLXN_3),
.rst_n(rst_n),
.data_out(XLXN_1[3:0]));
debounce XLXI_2 (.clk(clk),
.key_i(key_i),
.rst_n(rst_n),
.key_o(XLXN_3));
seg XLXI_3 (.clk(clk),
.data_in(XLXN_1[3:0]),
.rst_n(rst_n),
.data_en(en[3:0]),
.data_out(data[7:0]));
endmodule
分享到:
相关推荐
数电实验-按键防抖动.pdf
西南交通数电实验,按键防抖动较难
用 Verilog HDL 设计一个按键防抖动电路,要求用有限状态机实现。防抖动电路的输入 接实验箱的按键,输出接 1 位十进制计数译码显示电路的时钟输入,实现每按一次按键计数 器加 1,多次测试不出现抖动现象。
交通大学,数字电子技术实验课程实验报告,verliog语言,含源码,仿真图,及引脚分配。按键防抖动,数电实验学习资料,仅供参考。
swjtu数字逻辑与计算机组成原理实验7报告
按键去抖检测:持续按下不低于20mS,认为是有效按下,否则认为是抖动。内含北航夏宇闻verilog语法入门.ppt
(2)用按键进行字符切换,要求为按键设计防抖动电路。 (3)实验板上输入时钟选择 1kHz。 基本思路: (1) BUPTZJ 是六个字符,用模 6 计数器; (2) 用 8×8 点阵显示字符,用模 8 计数器; (3) 在任何一个时刻,点阵...
用触发器、计数器、和适当门电路设计的按键消抖电路,可以消除按键的机械抖动
? 设计并实现一个控制16个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。1. 单点移动模式:从左至右依次循环点亮16个发光二极管,每个发光...3. 两个模式可用按键进行切换,要求为按键设计防抖动电路
设计并实现一个控制16个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。1. 单点移动模式:从左至右依次循环点亮16个发光二极管,每个发光...3. 两个模式可用按键进行切换,要求为按键设计防抖动电路。
? 设计并实现一个控制16个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。1. 单点移动模式:从左至右依次循环点亮16个发光二极管,每个发光...3. 两个模式可用按键进行切换,要求为按键设计防抖动电路。
发光二极管走马灯电路设计与实现 设计并实现一个控制 16 个发光二极管亮灭的电路,仿真验证其功能,并下 ...(3)两个模式可用按键进行切换,要求为按键设计防抖动电路; (4)实验板上输入时钟选择 100Hz。
设计并实现一个控制 16 个发光二极管亮灭的电路,仿真验证其功能,并下 载到实验板测试。 (1) 单点移动模式:从左至右依次... (3)两个模式可用按键进行切换,要求为按键设计防抖动电路; (4)时钟频率选择 100Hz。
3、去抖动:采样、延时、再采样,两次结果相同,即确定有效。 4、显示部分,我们控制的位选信号,段码部分全部设置为有效。 5、按键部分,我们读取的是行信号,列信号全部设置为低电平。 知识点: 1、I/...
数字密码输入部分一般用键盘加防抖动电路和键盘译码电路组成。这里结合SE- 3实验箱,采用十二路开关来模拟0~9十个数字和加锁按钮、解锁按钮。输入部分由输入 译编码器组成,用四位信号来模拟十二个数字信号。 密码...
矩阵扫描实验完整报告(VHDL),含有去抖动,键盘弹起…… 仿真,对应ucf管脚约束,对于初学者不可谓不给力!
xilinx 3s400开发板厂家光盘源码(按键防抖动).zip Xilinx DDR2存储器接口调试代码.rar Xilinx DDR3最新VHDL代码(通过调试).rar Xilinx EDK工程一例MicroBlaze内置USB固件程序.rar Xilinx EDK设计试验.rar Xilinx ISE...
单片机课程设计 题 目 基于单片机的 多功能秒表 ...对于按键的设计,采用了防抖动的程序设计,使系统的性 能得到进一步的提升。当按键被按下时,相应的引脚被拉低,经扫描后,获得键值,并 执行键功能程序,因此按下不
晶振:频率为12MHz的晶振 一个采用采用+5伏的电源89C52单片机 一个八路反向驱动集成块 5个一千欧姆的电阻 九个单触点开关 具体设计: 软件功能流程图: 软件实现键位扫描、消除抖动、键码转换、键码发送等功能。...