博客
关于我
4*4矩阵键盘的FPGA驱动
阅读量:356 次
发布时间:2019-03-04

本文共 2714 字,大约阅读时间需要 9 分钟。

4*4矩阵键盘的FPGA驱动

一、硬件原理

在这里插入图片描述

4*4矩阵键盘有4行与4列,在按键按下时一行与一列即导通。其驱动方法非常简单。本设计中以一定的时间频率分别将每一行的引脚电平拉高,并在拉高某个引脚的同时检测每一列的电平变化,当检测到某列引脚有上升沿跳变时,即为该行与该列导通对应的那个按键被按下。
例如上图中,拉高PD4,此时检测到PD2引脚有上升沿电平跳变,则按键S5被按下。其余同理。

二、Verilog代码实现

//// Company: NanJing University of Information Science & Technology// Engineer: Yang Cheng Yu// // Create Date: 2020/01/13 20:01:50// Design Name: keyboard_4_4// Module Name: keyboard_4_4// Project Name: Clock// Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision:// Revision 0.01 - File Created// Additional Comments:// //module keyboard_4_4(	input 					clk,//时钟	input 					rst,//复位	output reg[3:0] 		c_pin,//行引脚	input[3:0] 				r_pin,//列引脚	output reg[3:0]			key_out//按键编号输出);	reg[15:0] 				div_cnt;//分频计数器	reg[2:0]				state;	reg						cnt_full;//分频计数器计满逻辑	localparam				CHECK_R1=3'b000;//检测R1	localparam				CHECK_R2=3'b001;//检测R2	localparam				CHECK_R3=3'b011;//检测R3	localparam				CHECK_R4=3'b010;//检测R4	//分频计数器逻辑	always@(posedge clk or negedge rst)begin//此处设计每次拉高一行时间为1ms		if(!rst)begin			div_cnt <= 16'd0;			cnt_full <= 1'b0;		end		else			if(div_cnt==16'd49999)begin				div_cnt <= 16'd0;				cnt_full <= 1'b1;			end			else begin				div_cnt <= div_cnt + 1'b1;				cnt_full <= 1'b0;			end	end	//状态组合判断	always@(posedge cnt_full or negedge rst)begin		if(!rst)			state <= CHECK_R1;		else			case(state)				CHECK_R1:					if(cnt_full)						state <= CHECK_R2;					else						state <= CHECK_R1;				CHECK_R2:					if(cnt_full)						state <= CHECK_R3;					else						state <= CHECK_R2;				CHECK_R3:					if(cnt_full)						state <= CHECK_R4;					else						state <= CHECK_R3;				CHECK_R4:					if(cnt_full)						state <= CHECK_R1;					else						state <= CHECK_R4;				default:					state <= state;			endcase	end	//状态机输出逻辑	always@(posedge clk or negedge rst)begin		if(!rst)			c_pin <= 4'b0000;		else			case(state)				CHECK_R1:begin					c_pin <= 4'b1000;					case(r_pin)						4'b1000:key_out <= 4'd0;						4'b0100:key_out <= 4'd1;						4'b0010:key_out <= 4'd2;						4'b0001:key_out <= 4'd3;					endcase				end				CHECK_R2:begin					c_pin <= 4'b0100;					case(r_pin)						4'b1000:key_out <= 4'd4;						4'b0100:key_out <= 4'd5;						4'b0010:key_out <= 4'd6;						4'b0001:key_out <= 4'd7;					endcase				end				CHECK_R3:begin					c_pin <= 4'b0010;					case(r_pin)						4'b1000:key_out <= 4'd8;						4'b0100:key_out <= 4'd9;						4'b0010:key_out <= 4'd10;						4'b0001:key_out <= 4'd11;					endcase				end				CHECK_R4:begin					c_pin <= 4'b0001;					case(r_pin)						4'b1000:key_out <= 4'd12;						4'b0100:key_out <= 4'd13;						4'b0010:key_out <= 4'd14;						4'b0001:key_out <= 4'd15;					endcase				end					default:begin					c_pin <= 4'b0000;					key_out <= 4'd0;				end			endcase	endendmodule

状态转移图

在这里插入图片描述

转载地址:http://qpug.baihongyu.com/

你可能感兴趣的文章
SpringBoot中使用Mybatis访问MySQL数据库(使用xml方式)
查看>>
数组--Go语言学习笔记
查看>>
Redis (三)——Linux 上安装 Redis
查看>>
java 重写(override)和重载(overload)区别
查看>>
java 多态类型转换
查看>>
常用正则表达式
查看>>
XML:采用XHTML和CSS设计可重用可换肤的WEB站点
查看>>
Tomcat6中web项目部署路径webapps和wtpwebapps的区别
查看>>
Java判断字符串是否为金额
查看>>
软件架构-zookeeper快速入门
查看>>
angr学习笔记(7)(malloc地址单元符号化)
查看>>
「CF149D」括号涂色 区间DP好题
查看>>
树状数组 模板总结
查看>>
「NOI2015」程序自动分析 并查集题解
查看>>
[JSOI2008]Blue Mary的战役地图 Hash题解
查看>>
结构型设计在工作中的一些经验总结
查看>>
如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了!
查看>>
2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态
查看>>
Netty4服务端入门代码示例
查看>>
MyBatis自定义类型转换器
查看>>