总线技术|接口技术
直播中

13路车到我家

13年用户 72经验值
私信 关注
[资料]

PS2的FPGA解码模块


     PS2接口主要用到三根线,GROUND,DATA,CLOCK。DATA信号在下降沿的时候有效,CLOCK频率很低,大约10K。PS2一帧是11位:BIT0为开始位,BIT1-BIT8为数据位,BIT9为校验位,BIT10为结束位。一般只需考虑BIT1-BIT8,其余位可忽略。大多数民用编码键盘采用第二套编码方案。键盘编码有通码(按下)和断码(松开)之分。通码为8位数据,断码只是在通码数据前加0XF0。
模块分析
    如图所示分为两块:电平检测模块,解码模块。
     电平检测模块检测PS2的CLOCK的下降沿,产生一个检测信号高脉冲供解码模块读取。解码模块读取到检测模块的高脉冲后读取PS2的DATA电平,检测完一桢数据产生一个高脉冲并将结果送到ps_data[7:0]。
模块代码
  1. module detect_module
  2. (
  3.      input clk,
  4.      input rst,
  5.      input ps_clk_pin_in,
  6.      output h2l_sig
  7. );

  8.      reg h2l_f1;
  9.      reg h2l_f2;
  10.      always @ (posedge clk or negedge rst)
  11.          if (!rst)
  12.              begin
  13.                  h2l_f1 <=1'b1;
  14.                  h2l_f2 <=1'b1;
  15.              end
  16.          else
  17.              begin
  18.                  h2l_f1 <= ps_clk_pin_in;
  19.                  h2l_f2 <= h2l_f1;
  20.              end
  21.             
  22.      assign h2l_sig = h2l_f2 && (!h2l_f1);
  23. endmodule
  1. module ps_decode_module
  2. (
  3.      input clk,
  4.      input rst,
  5.      input h2l_sig,
  6.      input ps_data_pin_in,
  7.      output [7:0] ps_data,
  8.      output ps_done_sig
  9. );

  10.      reg [7:0] rdata;
  11.      reg [4:0] i;
  12.      reg isdone;
  13.      
  14.      always @ (posedge clk or negedge rst)
  15.          if (!rst)
  16.              begin
  17.                  i <= 5'd0;
  18.                  rdata <= 8'd0;
  19.                  isdone <=1'b0;
  20.              end
  21.          else
  22.              case (i)
  23.                  5'd0 :
  24.                      if(h2l_sig) i<=i+1'b1;
  25.                  5'd1,5'd2,5'd3,5'd4,5'd5,5'd6,5'd7,5'd8 :
  26.                      if(h2l_sig) begin i<=i+1'b1;rdata[i-1]<=ps_data_pin_in;end
  27.                  5'd9,5'd10:
  28.                      if(h2l_sig) i<=i+1'b1;
  29.                  5'd11:
  30.                      if (rdata == 8'hf0) i<=5'd12;
  31.                      else i<=5'd23;
  32.                  5'd12,5'd13,5'd14,5'd15,5'd16,5'd17,5'd18,5'd19,5'd20,5'd21,5'd22:
  33.                      if (h2l_sig) i<=i+1'b1;
  34.                  5'd23:
  35.                      begin i<=5'd0;isdone<=1'b1;end
  36.              endcase
  37.      
  38.      assign ps_data =rdata;
  39.      assign ps_done_sig = isdone;
  40. endmodule



回帖(1)

yoonssica

2013-8-4 17:52:02
请问是否知道如何用PS2键盘输入汉字??????????????
举报

更多回帖

发帖
×
20
完善资料,
赚取积分