一、实验目标
能够熟练的进行可编程逻辑器件开发,能够通过具体工程需求进行需求分析、模块划分、代码编写、功能仿真、综合分析、板级验证,能够独立正确的进行实验操作,培养学生的工程实践研究能力和动手实践能力,具备借助可编程逻辑器件开发平台和仿真工具科学的获取实验数据或实验现象,并能够对采集到的数据或实验现象进行合理的分析与解释的能力。
二、实验内容
按键在汽车控制系统中具有广泛的应用,例如空调开关控制、车门锁止控制、车载音乐控制等,驾驶人员在驾驶室进行按键操作过程中,由于按下或松开按键需要时间,不可避免的存在抖动现象,由于按键的抖动可能会造成一次操作被系统默认为进行了多次操作,造成按键不灵或误触法等现象,本实验是一个汽车按键消抖系统的设计,用于解决汽车中各按键抖动造成误操作、操作不灵现象。
三、实验要求
1、 使用 FPGA 开发工具 Quartus II及仿真工具 Modelsim 打开对应工
程,记录工程占用资源,说明仿真信号波形与硬件对应关系或作用;
2、 读程序结合仿真描述按键消抖原理;
3、 将给定的程序上板验证,多次按键记录验证设计是否稳定,并给出对应结论。
四、实验预习(实验原理、整体设计方案等)
(一)、实验基本原理:
1.FPGA按键原理
MINI_FPGA 开发板提供了 8 个按键开关 KEY7-KEY0 和一个复位键 RESET,如图 1.1所示。复位键 RESET 的一端接地,一端直接连接到 FPGA 的 nCONFIG 引脚,当按键被按下时,向 FPGA 输入一个低电平,nCONFIG 置为“低”;当按键未被按下时,nCONFIG 直接与上拉电阻相连,置为“高”。同理,按键开关 KEY7-KEY0 的一端接地,另一端直接与 FPGA 的相应引脚连接,当按键被按下时向 FPGA 的相应引脚输送低电平。

图1.1按键开关连接电路
2.按键消抖
2.1按键抖动原因:
由于机械按键的物理特性,按键被按下的过程中,存在一段时间的抖动,同时在释放按键的过程中也存在抖动,这就导致在识别的时候可能检测为多次的按键按下,而通常检测到一次按键输入信号的状态为低电平,就可以确认按键被按下了,所以我们在使用按键时往往需要消抖,以确保按键被按下一次只检测到一次低电平。

图2.1
2.2解决方案:
我们首先需要一个模块来检测按键是否抖动,如果抖动,给计时模块一个标志位开始计时,记满20ms,再给输出消抖后按键信号模块一个标志位进行采样。理清思路,整个程序分为三个模块,模块之间相互关联,关联之处需要一个起到连接作用的器件,也就是标志位。比如将flag作为标志位,检测到按键抖动之后,将flag作为计时开始的条件。
(二)、整体设计方案:
1.对输入按键进行打拍,异步信号同步并检测边沿

图2.2

图2.3
key_in:这是按键输入信号,低电平有效
key_ff0:为了滤除掉小于一个周期的抖动,对key_in推迟一个周期进行同步.如图2.3 方框位置key_in输入的按键信号抖动为低电平,小于一个周期,在时钟上升沿(posedge 代表上升沿敏感)到来的时候信号已经恢复高电平,key_ff0还是保持高电平,这样就达到了滤波的效果。
key_ff1:这个信号是把同步信号再延时一个周期,主要是为了保存key_ff0上一个周期的值,来判断是否出现下降沿。
2.20ms延时计数器

图2.4
3.根据延时计数器获取按键状态以及按键值

图2.5
五、测试验证(仿真、硬件测试)
仿真测试文件:

图5.1
仿真结果图:

图5.3
通过将仿真文件与仿真结果可以看到,当按键抖动时间超过20ms时(即key_in高电平持续时间超过20ms时),判定按键按下而不是抖动(即key_out<=1),实验仿真结果与实验仿真测试文件预测结果一致,实验代码符合实验要求。
六、实验小结
本次实验为按键消抖实验,按键的控制对于FPGA的学习是基础而又必须的,正如前一个数码管实验一样,这种基础的实验往往都是在一些比较复杂的实验中都会应用到的。
本次实验课程中的按键消抖并不能够上板进行实验验证,需要配合数码管等一些显示功能才能够验证,这在后续的课程中我会将他们拼接在一起进行使用,按键消抖实验本身的功能就是提高按键按下与否判断的准确性,单个实验并不具备实际的应用价值,但是将其加入到按键一类的项目中,就可以提高项目的精确程度,给项目使用者带来更好的体验,就比如可以将其加入到“按键消抖+shi别字符串(类似于验证密码)”“或者是按键消抖+led灯状态切换(切换LED灯和呼吸灯)”。知识的学习本来就是应用到实际的生活当中,给生活带来更大的方便,所以我会尽我所能努力学习,成长为一名合格的工程师。
七、实验代码
module sy2(
clk ,
rst_n ,
key_in ,
key_out
);
// parameter TIME_20MS = 1000000 ;//为了缩短仿真周期,仿真时可适当缩小
parameter TIME_20MS = 10000 ;
//输入信号定义
input clk ;
input rst_n ;
input key_in;
//输出信号定义
output key_out;
//输出信号reg定义
reg key_out;
reg key_ff0;
reg key_ff1;
reg[15:0] shake_cnt;
wire shake_flag;
/*************************
异步处理,打两拍
**************************/
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_ff0 <= 1'b1;
key_ff1 <= 1'b1;
end
else begin
key_ff0 <= key_in ;
key_ff1 <= key_ff0;
end
end
/************************
消抖 20MS
**************************/
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
shake_cnt <= 0;
end
else if(key_ff1!=1'h1)begin
if(shake_flag)
shake_cnt <= shake_cnt;
else
shake_cnt <= shake_cnt + 1;
end
else begin
shake_cnt <= 0;
end
end
assign shake_flag = shake_cnt>=TIME_20MS-1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_out <= 1'b1;
end
else if(shake_flag)begin
key_out <= 1'b0;
end
else begin
key_out <= 1'b1;
end
end
endmodule
八、测试代码
// Copyright (C) 1991-2013 Altera Corporation
// Your use of Altera Corporation's design tools, logic functions
// and other software and tools, and its AMPP partner logic
// functions, and any output files from any of the foregoing
// (including device programming or simulation files), and any
// associated documentation or information are expressly subject
// to the terms and conditions of the Altera Program License
// Subscription Agreement, Altera MegaCore Function License
// Agreement, or other applicable license agreement, including,
// without limitation, that your use is for the sole purpose of
// programming logic devices manufactured by Altera and sold by
// Altera or its authorized distributors. Please refer to the
// applicable agreement for further details.
// *****************************************************************************
// This file contains a Verilog test bench template that is freely editable to
// suit user's needs .Comments are provided in each section to help the user
// fill out necessary details.
// *****************************************************************************
// Generated on "04/21/2022 11:23:20"
// Verilog Test Bench template for design : sy2
//
// Simulation tool : ModelSim-Altera (Verilog)
//
`timescale 1 ps/ 1 ps
module sy2_vlg_tst();
// constants
// general purpose registers
//reg eachvec;
// test vector input registers
reg clk;
reg key_in;
reg rst_n;
// wires
wire key_out;
// assign statements (if any)
sy2 i1 (
// port map - connection between master ports and signals/registers
.clk(clk),
.key_in(key_in),
.key_out(key_out),
.rst_n(rst_n)
);
initial
begin
clk =0 ;
rst_n =0;
key_in = 1 ;
#50000;
rst_n =1 ;
#1000;
key_in = 0 ;
#5000;
key_in = 1 ;
#10000;
key_in = 0 ;
#5000;
key_in = 1 ;
#5000;
key_in = 0 ;
#10000;
key_in = 1 ;
#5000;
key_in = 0 ;
#10000;
key_in = 1 ;
#10000;
key_in = 0 ;
#1500000;
key_in = 1 ;
#10000;
$stop;
end
always #10 clk = ~clk ;
endmodule