Anaconda C语言 HTML框架 extjs6.5 docker安装部署 哨兵模式 multithreading pyspark cassandra datatables vue开发 传智播客python 网络营销视频 jquery遍历子元素 mysql数据库名称 idea整理代码格式 matlab中axis python教学 python正则表达式例子 java多态 java数组添加 java时间函数 sp5 嵌入式linux驱动程序设计从入门到精通 行业软件下载 千千静听绿色版 vbs表白代码 c语言代码表白 梦幻手游助手 ps从入门到精通 mathcad g4560配什么显卡 qt5下载 小程序图片上传 cad指北针 武林外传天师加点 instagram怎么读 上网监控系统 华为虚拟按键 cad删除多余的线
当前位置: 首页 > 学习教程  > 编程语言

Verilog之按键检测(一)

2021/2/13 16:30:13 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

Verilog之按键检测(一)使用说明正文使用说明 //单个按键检测, //功能:当按键按下时,state_out 输出高电平,当按键松开后,state_out 输出低电平 //应用场景:可用于按键检测,中断信号…

Verilog之按键检测(一)

  • 使用说明
    • 正文

使用说明

//单个按键检测,
//功能:当按键按下时,state_out 输出高电平,当按键松开后,state_out 输出低电平
//应用场景:可用于按键检测,中断信号检测
/********************************/
/时钟按照50M计算,检测时延20ms/

正文

module key_detect(
clk,
rst_n,
key_in,
state_out,
);
input wire clk;
input rst_n;
input key_in;
output reg state_out;

/延时计算/
parameter Period=32’d1000000 ;
reg [31:0] cunter;
reg time_up;
reg clear; //1: 开始计数 0:清零计数
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cunter<=32’d0;
time_up<=0;
end
else if(!clear)
begin
cunter<=32’d0;
time_up<=0;
end
else if(cunter==Period)
begin
cunter<=32’d0;
time_up<=1;
end
else
cunter<=cunter+1’b1;
end

//按键检测状态机
define INIT_STATE 3'b000 //初始状态define PRESS_STATE 3’b001 //按键按下状态
`define RELEASE_STATE 3’b010 //按键松开状态

reg [3:0] state;
reg [3:0] state_next;

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
state<=`INIT_STATE;
end
else
begin
state<=state_next;
end
end

wire state_flag;
always @(*)
begin
// state_next=INIT_STATE; // state_out=1'b0; case(state)INIT_STATE:
begin
if(key_in)
begin

					state_next=`PRESS_STATE;
					clear=1'b1;             //开始计时
				  end
				 else
					begin
						clear=0;
						state_out=1'b0; 
						state_next=`INIT_STATE;
					end
			end
		`PRESS_STATE:
			begin
				if(time_up)
					begin
						if(key_in)
							begin
								state_out=1'b1;   
								state_next=`PRESS_STATE;
							end
						else 
							begin
								clear=0;
								state_out=1'b0;
								state_next=`RELEASE_STATE;
							end
					end
				else 
					begin
						clear=1'b1;
						state_out=1'b0;
						state_next=`PRESS_STATE;
					end
			end
		`RELEASE_STATE:
			begin
				clear=1;
				if(time_up)
					begin
						if(key_in)
							begin
								state_next=`PRESS_STATE;
							end
						else
							begin
									state_out=1'b0; 
									clear=0;
									state_next=`INIT_STATE;
							end
					end
				else
					begin
						state_next=`RELEASE_STATE;
					end
			end
	    default: 
			begin
				clear=0;
				state_next=`INIT_STATE;
			end
	endcase
end

endmodule


本文链接: http://www.dtmao.cc/news_show_700053.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?