首页 > 其他分享 >矩阵键盘

矩阵键盘

时间:2022-09-18 22:47:53浏览次数:63  
标签:cnt clk 矩阵 键盘 localparam 按键 reg

 

 

 

module Array_KeyBoard #
(
	parameter			CNT_200HZ = 60000
)
(
	input				clk,
	input				rst_n,
	input		[3:0]	col,
	output	reg	[3:0]	row,
	output	reg	[15:0]	key_out,
	output		[15:0]	key_pulse
);
	
	localparam			STATE0 = 2'b00;
	localparam			STATE1 = 2'b01;
	localparam			STATE2 = 2'b10;
	localparam			STATE3 = 2'b11;
	
	/*
	因使用4x4矩阵按键,通过扫描方法实现,所以这里使用状态机实现,共分为4种状态
	在其中的某一状态时间里,对应的4个按键相当于独立按键,可按独立按键的周期采样法采样
	周期采样时每隔20ms采样一次,对应这里状态机每隔20ms循环一次,每个状态对应5ms时间
	对矩阵按键实现原理不明白的,请去了解矩阵按键实现原理
	*/
	
	//计数器计数分频实现5ms周期信号clk_200hz
	reg		[15:0]		cnt;
	reg					clk_200hz;
	always@(posedge clk or negedge rst_n) begin  //复位时计数器cnt清零,clk_200hz信号起始电平为低电平
		if(!rst_n) begin
			cnt <= 16'd0;
			clk_200hz <= 1'b0;
		end else begin
			if(cnt >= ((CNT_200HZ>>1) - 1)) begin  //数字逻辑中右移1位相当于除2
				cnt <= 16'd0;
				clk_200hz <= ~clk_200hz;  //clk_200hz信号取反
			end else begin
				cnt <= cnt + 1'b1;
				clk_200hz <= clk_200hz;
			end
		end
	end
	
	reg		[1:0]		c_state;
	//状态机根据clk_200hz信号在4个状态间循环,每个状态对矩阵按键的行接口单行有效
	always@(posedge clk_200hz or negedge rst_n) begin
		if(!rst_n) begin
			c_state <= STATE0;
			row <= 4'b1110;
		end else begin
			case(c_state)
				//状态c_state跳转及对应状态下矩阵按键的row输出
				STATE0: begin c_state <= STATE1; row <= 4'b1101; end
				STATE1: begin c_state <= STATE2; row <= 4'b1011; end
				STATE2: begin c_state <= STATE3; row <= 4'b0111; end
				STATE3: begin c_state <= STATE0; row <= 4'b1110; end
				default:begin c_state <= STATE0; row <= 4'b1110; end
			endcase
		end
	end
	
	reg	[15:0]	key,key_r;
	//因为每个状态中单行有效,通过对列接口的电平状态采样得到对应4个按键的状态,依次循环
	always@(negedge clk_200hz or negedge rst_n) begin
		if(!rst_n) begin
			key_out <= 16'hffff; key_r <= 16'hffff; key <= 16'hffff; 
		end else begin
			case(c_state)
				//采集当前状态的列数据赋值给对应的寄存器位
				//对键盘采样数据进行判定,连续两次采样低电平判定为按键按下
				STATE0: begin key_out[ 3: 0] <= key_r[ 3: 0]|key[ 3: 0]; key_r[ 3: 0] <= key[ 3: 0]; key[ 3: 0] <= col; end
				STATE1: begin key_out[ 7: 4] <= key_r[ 7: 4]|key[ 7: 4]; key_r[ 7: 4] <= key[ 7: 4]; key[ 7: 4] <= col; end
				STATE2: begin key_out[11: 8] <= key_r[11: 8]|key[11: 8]; key_r[11: 8] <= key[11: 8]; key[11: 8] <= col; end
				STATE3: begin key_out[15:12] <= key_r[15:12]|key[15:12]; key_r[15:12] <= key[15:12]; key[15:12] <= col; end
				default:begin key_out <= 16'hffff; key_r <= 16'hffff; key <= 16'hffff; end
			endcase
		end
	end
	
	reg		[15:0]		key_out_r;
	//Register low_sw_r, lock low_sw to next clk
	always @ ( posedge clk  or  negedge rst_n )
		if (!rst_n) key_out_r <= 16'hffff;
		else  key_out_r <= key_out;   //将前一刻的值延迟锁存
	
	//wire	[15:0]		 key_pulse;
	//Detect the negedge of low_sw, generate pulse
	assign key_pulse= key_out_r & ( ~key_out);   //通过前后两个时刻的值判断
	
endmodule

  

 

标签:cnt,clk,矩阵,键盘,localparam,按键,reg
From: https://www.cnblogs.com/54programer/p/16706078.html

相关文章

  • Qt5.14.2使用虚拟键盘
    说明这是关于Qt5(Qt5.1.4.2),QWidget编程使用Qt虚拟键盘(qtvirtualkeyboard)Tag:QT5,Qt,软件盘、虚拟键盘,Widget程序,QML 作者:474609810@qq.com 关键代码启用虚拟键盘......
  • 13.1 反射 13.2selenium键盘事件13.3文件上传13.4滚动条操作 13.5鼠标事件13.6验证码
    13.1反射#什么是反射?#如果有一个变量名,是字符串的数据类型,你能获取到这个变量的值吗?#反射方法:classStudent:def__init__(self):self.name='张三'......
  • 矩阵的运算
    目录矩阵的加法数与矩阵相乘矩阵与矩阵相乘方阵的幂运算方阵的多项式线性方程的矩阵表示矩阵的转置对称矩阵、反对称矩阵矩阵的逆矩阵的加法定义:设\(A=(a_{ij})、B=(b......
  • c语音键盘输入和屏幕输出
    键盘输入和屏幕输出单个字符的输入输出getchar字符输入putchar字符输出缓冲区优先每次只读一个字符输出输入量不加引号,只有转义字符加实践:大小写转换注意:getchar()......
  • 矩阵及其快速幂
    矩阵及其快速幂模板Codetemplate<typenameT>conceptarithmetic=is_arithmetic_v<T>;template<typenameT>structmat:publicvector<vector<T>>{int......
  • H5 键盘弹出把底部固定定位的元素挤上来
    这里的解决方法是安卓监听窗口高度,iOS监听文本块焦点,以实现隐藏与显示底部固定定位元素//以下为vue2的写法//originHeight为窗口高度,当键盘弹出时,android手机会改变,......
  • R语言中实现将矩阵的每一列随机排序
     001、dat<-rbind(a=1:5,b=letters[1:5],c=LETTERS[1:5],d=10:6)##测试数据框datidx<-order(c(col(dat)),runif(length(dat)))......
  • 三个稠密矩阵A,B,C的乘积ABC,假设三个矩阵的尺寸分别为mn,np,pq,且m<n<p<q,以下计算顺序
    题目在深度学习中,涉及到大量矩阵相乘,现在需要计算三个稠密矩阵A,B,C的乘积ABC,假设三个矩阵的尺寸分别为mn,np,p*q,且m<n<p<q,以下计算顺序效率最高的是:()a.A(BC)b.(AB)C......
  • MPI学习笔记(四):矩阵相乘的Cannon卡农算法
    mpi矩阵乘法:C=αAB+βC一、Cannon卡农算法基本介绍1、二维矩阵串行乘法两个n维方阵的乘法A×B=C的串行计算公式为:下图是用图示来表示的这种计算规则:2、二维块划分的......
  • 二进制矩阵中的特殊位置
    二进制矩阵中的特殊位置一、题目描述给一个矩阵mat,其中的元素都为0或1。找出其中的特殊位置的个数。特殊位置就是此位置为1,所在行和列其余位置都为0;返回有几个这样的位......