原创 一年前写的键盘扫描代码。给大家看看吧,想要的拿去

2009-7-30 23:41 2876 7 9 分类: FPGA/CPLD

fpga的矩阵键盘还是不错的东西,速度也挺快的,个人写了四五个版本,就贴上一个版本吧。


里面不允许同时按下两个,使用的是16*16的格式,呵呵,要改的自己去改啊


代码如下。风格完全是我自己的风格



///下面是key module 主要是扫描用的


module key(clk,col,key_num,row);
parameter wide = 16;
parameter val_wide = 16;


input clk;
input [wide-1:0] col;
output [val_wide-1:0] key_num;
output [wide-1:0] row;
parameter s0 = 0,
     s1 = 5'h1,
     s2 = 5'h2,
     s3 = 5'h3,
     s4 = 5'h4,
     s5 = 5'h5,
     s6 = 5'h6,
     s7 = 5'h7,
     s8 = 5'h8,
     s9 = 5'h9,
     s10 = 5'ha,
     s11 = 5'hb,
     s12 = 5'hc,
     s13 = 5'hd,
     s14 = 5'he,
     s15 = 5'hf,
     s16 = 5'h10;
    
    
parameter en_counter = 32'h7a120;
parameter scan     = 4'h0,
    read_temp = 4'h1,
    read     = 4'h2,
    delay     = 4'h4,
    delay1    = 4'h8;


reg [wide-1:0]     row;


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


reg [4:0]       S_col;
reg [3:0]      statement;
reg [3:0]      next_state;


reg [31:0]       counter;
reg [31:0]       counter1;


reg rst = 1;



always @(posedge clk)
   rst <= 0;
  
always @ ( posedge clk )
if ( rst )
   counter <= 0 ;
else if ( statement == delay )
    begin
     if ( counter == en_counter )
      counter <= 0 ;
     else
      counter <= counter + 1'b1 ;
    end  


always @ ( posedge clk )
if ( rst )
   counter1 <= 0 ;
else if ( statement == delay1 )
    begin
     if ( counter1 == en_counter )
      counter1 <= 0 ;
     else
      counter1 <= counter1 + 1'b1 ;
    end    
  


always @ ( posedge clk )
if ( rst )
   statement <= scan ;
else
   statement <= next_state;


always @ ( rst or statement or counter or counter1 or col )
if (rst)
   next_state = scan ;
else
   case ( statement )
   scan :     next_state = read_temp ;
  
read_temp : if ( col )
       next_state = delay ;
      else
       next_state = scan   ;
      
   read : if ( col )
       next_state = read   ;
      else
       next_state = delay1 ;
      
   delay : if ( counter == en_counter )
       next_state = read ;
      else
       next_state = delay;
      
   delay1: if ( counter1 == en_counter )
       next_state = scan ;
      else
       next_state = delay1 ;
      
   default:    next_state = scan ;
   endcase
  
always @ (posedge clk)
if(rst)
   begin
    row_value <=0;
    S_col <= 1;
    state <= 0;
    row <= 16'h8000;
   end
else
case(statement)
scan:    begin
       row   <= {row[0],row[15:1]};
       state <= state + 1;
       row_value <=16'h0;
       S_col <= 1;
      end
read_temp : ;
  
read:   if (col)
      begin
       case(col)
       16'h8000: begin row_value <=state;S_col <= s1; end
       16'h4000: begin row_value <=state;S_col <= s2; end
       16'h2000: begin row_value <=state;S_col <= s3; end
       16'h1000: begin row_value <=state;S_col <= s4; end
       16'h0800: begin row_value <=state;S_col <= s5; end
       16'h0400: begin row_value <=state;S_col <= s6; end
       16'h0200: begin row_value <=state;S_col <= s7; end
       16'h0100: begin row_value <=state;S_col <= s8; end
       16'h0080: begin row_value <=state;S_col <= s9; end
       16'h0040: begin row_value <=state;S_col <= s10; end
       16'h0020: begin row_value <=state;S_col <= s11; end
       16'h0010: begin row_value <=state;S_col <= s12; end
       16'h0008: begin row_value <=state;S_col <= s13; end
       16'h0004: begin row_value <=state;S_col <= s14; end
       16'h0002: begin row_value <=state;S_col <= s15; end
       16'h0001: begin row_value <=state;S_col <= s16; end
       default : begin row_value <=16'h0;S_col <= 1 ; end
       endcase
      end
      else
                  begin row_value <=16'h0;S_col <= 1 ; end
     
delay :   ;
     
delay1:     ;


default:   ;

endcase     


Value_out instance_name (
    .row_value(row_value),
    .S_col(S_col),
    .clk(clk),
    .rst(rst),
    .key_value(key_num)
    );
endmodule


下面是value—out 模块


module Value_out(row_value, S_col, clk, rst, key_value);
    input [3:0] row_value;
    input [4:0] S_col;
    input clk;
    input rst;
    output [15:0] key_value;
reg [15:0] key_value;

always @(posedge clk)
if(rst)
   key_value <= 0;
else
   key_value <= (row_value<<4) + S_col-1 ;


上面的都是经过实际工程项目的调试的,放心用吧


给个问题吧,为什么我要使用一个read_temp 的状态呢?


呵呵,这个里面发现能有很大的空间值得研究

文章评论2条评论)

登录后参与讨论

用户102051 2011-3-2 09:50

前辈,能不能把你写的代码,注释一下

tengjingshu_112148725 2009-7-31 09:21

谢谢分享
相关推荐阅读
用户563816 2013-04-19 23:45
我突然间发现EDN的博客还活着啊,哈哈,那我就回来了
重新开始我的技术博客生涯...
用户563816 2010-12-27 11:39
orcad capture 16.3 突然启动不了 未响应 解决方法
最近出现一个特别的问题,就是cadence 其他产品都是好的,就是orcad capture 启动不了 显示未响应,我系统是win 7 1 :找到 注册表 HKEY_CURRENT_USER\Soft...
用户563816 2010-12-17 14:52
对于cadence 16.3的安装与破解
很多朋友在16.3上面的破解都是相当的麻烦,前些日子我找了一个破解方法,利用的是一个文件替换的方法吧,感觉还挺好的,在此贴上给大家享用里面的一个sn文件就是破解的方法,具体就是不要装license m...
用户563816 2010-03-27 01:27
要本科毕业了,说说学校的团队和一些感慨吧
      自己正在混实验室之中,呵呵。但是身边很多朋友都在一个比较出色的团队里面了,自己缺乏的就是一个这样的锻炼,导师给了我很大发挥的空间,而且,重要的是,我收到的是老师直接的教诲,所以感觉这一年的...
用户563816 2010-03-17 19:57
话说昨日BUG以及一个电路的理解失误
昨天的问题中午终于得到解决,首先其一是:一个PL2303引脚的电压在设计PCB中,出现了失误,导致了很大一部分时间的浪费。下面是对于PL2303的一些解释,首先给出datasheet中的一些基本说明吧...
用户563816 2010-03-16 23:53
今天很郁闷
本来打算写一些相关的RF项目的事情,后面发现板子出现了毛病,PL2303与电脑的连接出现问题,同时在相关的电源方面有个小bug被我发现,调试两个小时不见效果。。特此发帖,以示郁闷。争取在这两天搞定这个...
我要评论
2
7
关闭 站长推荐上一条 /2 下一条