打印

使用CPLD做一个键盘

[复制链接]
2559|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wayner|  楼主 | 2009-2-25 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上关于键盘的程序很多了,可这次我打算用CPLD:XC9536。设想是3行8列的键盘,行为输出,列为读入,3X8=24个按键可编码为5 bits,那就再用5个CPLD的I/O口线将键值送给单片机。要求是如果有按键则将此键值数据锁存起来,单片机发出读按键的信号则CPLD键值数据送到那5个I/O口线上,平时单片机没发出读按键信号则CPLD的5个I/O口线上是高阻的。CPLD的时钟采用单片机的ALE脚,频率约是1.84MHz。
我的程序是:
module kpad3L8(keyOUT,Yin,Xout,clk,MCU_HgAdr,WR,RD);
  input WR,RD,clk;          //时钟源
  input [1:0]MCU_HgAdr;     //单片机高位地址
  input [7:0] Yin;            //输入,行坐标
  
  output [2:0] Xout;      //输出,列坐标
  output [4:0]keyOUT;
  reg [4:0] keyval;    //最高位作为键值有效的指示
  reg [2:0] Xout;
  
  wire GET_KV;   // = 
  wire CLR_KV;
  reg [7:0]cutn;
  reg scan_en;
  reg [2:0]scan;
  reg [23:0]keyvalue;
  reg [4:0]Hold_key;
 assign GET_KV=RD|(~MCU_HgAdr[1]) | (~MCU_HgAdr[0]);
 assign CLR_KV=WR|(~MCU_HgAdr[1]) | (~MCU_HgAdr[0]);
   
  //CLOCK source is MCU ALE pin,11.0592MHz/6=1.8432MHz 
  always @(posedge clk)
  begin
      cutn=cutn+1;
  end
  
 
  always @(posedge clk)
  begin
      if(~cutn[0]&&cutn[4]) scan_en=1;
      else scan_en=0;
  end
  
  always @(posedge cutn[4])
  begin
      scan=scan+1;
  end
      
  
  always @(posedge clk)
  begin
      if(scan_en)
        case(scan)
            0:Xout=4'b110;
            1:keyvalue[7:0]=Yin;
            2:Xout=4'b101;
            3:keyvalue[15:8]=Yin;
            4:Xout=4'b011;
            5:keyvalue[23:16]=Yin;
            default:
              Xout=4'b110;
        endcase    
  end
  
  always @(posedge cutn[5] or negedge CLR_KV)  //
  begin    //Key value read OK,must clear
   if (CLR_KV==0) keyval=5'h00;
   else
    begin
       if(&keyvalue)        //无按键
        begin               //全是1
            keyval=5'h00;     //
        end    
       else
        begin
            if(~&keyvalue[7:0])
             begin
              case(keyvalue[7:0])
                  8'b0111_1111:keyval=5'h08;
                  8'b1011_1111:keyval=5'h07;
                  8'b1101_1111:keyval=5'h06;
                  8'b1110_1111:keyval=5'h05;
                  8'b1111_0111:keyval=5'h04;
                  8'b1111_1011:keyval=5'h03;
                  8'b1111_1101:keyval=5'h02;
                  8'b1111_1110:keyval=5'h01;
              endcase
             end
            else if(~&keyvalue[15:8])
            begin
              case(keyvalue[15:8])
                  8'b0111_1111:keyval=5'h10;
                  8'b1011_1111:keyval=5'h0f;
                  8'b1101_1111:keyval=5'h0e;
                  8'b1110_1111:keyval=5'h0d;
                  8'b1111_0111:keyval=5'h0c;
                  8'b1111_1011:keyval=5'h0b;
                  8'b1111_1101:keyval=5'h0a;
                  8'b1111_1110:keyval=5'h09;
              endcase
            end  
            else 
            begin
              case(keyvalue[23:16])
                  8'b0111_1111:keyval=5'h18;
                  8'b1011_1111:keyval=5'h17;
                  8'b1101_1111:keyval=5'h16;
                  8'b1110_1111:keyval=5'h15;
                  8'b1111_0111:keyval=5'h14;
                  8'b1111_1011:keyval=5'h13;
                  8'b1111_1101:keyval=5'h12;
                  8'b1111_1110:keyval=5'h11;
              endcase 
            end
        end           
   end
  end
  
  always @(posedge clk)
  begin
    if(keyval) Hold_key=keyval;
  end
     
  assign keyOUT=!GET_KV ? Hold_key : 5'bzzzzz;
endmodule  

各位看官,以上程序综合结果是不通过,改用器件XC9572也不行,只有改成95108才行,就这么个按键就要老大的一个95108,不太浪费了吗?
我想到的一个办法将时钟改成慢的1000Hz,但也要9572。其它您有什么建议么?尽量只用9536就能实现。

相关帖子

沙发
lsqdesign| | 2009-2-25 12:09 | 只看该作者

没有任何实际意义

用CPLD作键盘扫描.这种工作没有任何实际意义.

使用特权

评论回复
板凳
starm| | 2009-2-25 12:14 | 只看该作者

如何用CPLD来实现QWERTY键盘

http://www.xilinx.com/support/documentation/application_notes/xapp512.pdf

此设计非常适合于CoolRunner-II 32宏单元装置(利用率大约为75%),留下25%空间作他用。此外,此设计还采用了其他一些方法来减少功耗并利用 CoolRunner-II的节能功能。

xc9536 有 36 个宏单元吗?

使用特权

评论回复
地板
红心j| | 2009-2-25 17:48 | 只看该作者

好像没意义,适合联系

使用特权

评论回复
5
wayner|  楼主 | 2009-2-26 08:08 | 只看该作者

谢谢大家!

2L:CPLD现在价格很便宜了,XC9536不到9元就可以买到,但它的解密费用是一万元左右,基于此,我认为用CPLD的一大理由。
3L:xc9536 有 36 个宏单元,请问CoolRunner-II 系列的价格,如XC2C32的价格大概是多少?我习惯了用XC95系列,脑子一下子还不太想改用其他的。谢谢你的提示!
4L:同样我的理由如上。

使用特权

评论回复
6
wangkj| | 2009-2-26 08:42 | 只看该作者

epm240 10元,240个宏单元

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

848

帖子

1

粉丝