【从零开始走进FPGA】 基于PLD的矩阵键盘状态机控制

2016年02月18日 14:10    发布者:designapp
  讲过了独立按键检测,理所当然应该讲讲FPGA中矩阵键盘的应用了。这个思维和电路在FPGA中有所不同,在此,在此做详细解释,Bingo用自己设计的成熟的代码作为案例,希望对你有用。
  一、FPGA矩阵键盘电路图
  在FPGA中的电路,与单片机雷同,如下所示:
  


  在上电默认情况下,L =4''b1,因为上拉了3.3V,而默认情况下H.为低电平;一旦有某一个按键被按下,便是是的该路电路流向该按键的H,是的L检测不到电流。因此可以通过对每一行H输出的控制,来检索是哪一个按键被按下了,这也原理和单片机中一样,只是写法不一样罢了。
  二、FPGA矩阵键盘FSM
  1. 代码
  代码如下所示,采用了三段式状态机来描述矩阵键盘。本模块形式与上一张按键消抖动雷同,方便移植。
  /*************************************************
  * Module Name : matrix_key_design.v
  * Engineer : Crazy Bingo
  * Target Device : EP2C8Q208C8
  * Tool versions : Quartus II 11.0
  * Create Date : 2011-6-26
  * Revision : v1.0
  * Description :
  **************************************************/
  module matrix_key_design
  (
  input clk,
  input rst_n,
  input col_data,
  output reg row_data,
  output key_flag, //the mark of key is pressed
  output reg key_value
  );
  //generate for 2ms signal
  reg cnt; //fffff,≈50Hz 20ms
  always @(posedge clk or negedge rst_n)
  begin
  if(!rst_n)
  cnt ---0----1----2----3
  * | | | |
  * R2 >---4----5----6----7
  * | | | |
  * R1 >---8----9----A----B
  * | | | |
  * R0 >---C----D----E----F
  * | | | |
  * C3 C2 C1 C0
  *****************************************************/
  parameter SCAN_IDLE = 3'b000;
  parameter SCAN_JITTER= 3'b001;
  parameter SCAN_COL0 = 3'b011;
  parameter SCAN_COL1 = 3'b010;
  parameter SCAN_COL2 = 3'b110;
  parameter SCAN_COL3 = 3'b100;
  parameter SCAN_READ = 3'b101;
  parameter SCAN_JTTTER2= 3'b111;
  reg current_state;
  reg next_state;
  always@(posedge clk or negedge rst_n)
  begin
  if(!rst_n)
  current_state


  (2)模块可分为一下几个状态: