集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1637|回复: 1

ps2键盘问题,有的键识别好,有的识别不好 ,各位牛人帮我看看程序啊

[复制链接]
yf210yf 发表于 2010-10-27 10:24:35 | 显示全部楼层 |阅读模式
module ps2_driver(CLK,ps2_clk_out,RST,data,LED_OUT);

input  CLK;
input  RST;
input  ps2_clk_out;
input  data;
output [7:0]LED_OUT;

reg  [7:0] data_tem;
reg  [3:0] state;
reg  [7:0] LED_OUT_tem;
reg  clk_r0,clk_r1,clk_r2;
wire neg_ps2_clk;

assign LED_OUT[7:0]=LED_OUT_tem[7:0];

parameter  idle                                =4'b0000,
                   check_clk                =4'b0001,
                   check_0                    =4'b0010,
                   receive_data0        =4'b0011,
                   receive_data1        =4'b0100,
                   receive_data2        =4'b0101,
                   receive_data3        =4'b0110,
                   receive_data4        =4'b0111,
                   receive_data5        =4'b1000,
                   receive_data6        =4'b1001,
                   receive_data7        =4'b1010,
                   receive_p                =4'b1011,
                   receive_1                =4'b1100,
                   receive_over         =4'b1101;

always@(posedge CLK or negedge RST)
        begin
                if(!RST)
                        begin
                                clk_r0<=1'b0;
                                clk_r1<=1'b0;
                                clk_r2<=1'b0;
                        end
                else
                        begin
                                clk_r0<=ps2_clk_out;
                                clk_r1<=clk_r0;
                                clk_r2<=clk_r1;
                        end
        end

assign neg_ps2_clk=(!clk_r1)&clk_r2;
         
always@(posedge CLK or negedge RST)
        begin
                if(!RST)
                        begin
                                data_tem        <=8'h0;
                                state                <=idle;
                        end
                else
                if(neg_ps2_clk)
                        begin
                                case(state)
                                        idle:
                                                begin
                                                    data_tem[7:0]<=8'h0;
                                                        state<=check_clk;
                                                end
                                               
                                        check_clk:
                                                begin
                                                        state<=check_0;
                                                end
                                               
                                        check_0:
                                                begin
                                                        if(!data)
                                                                begin
                                                                        state<=receive_data0;
                                                                end
                                                        else
                                                                begin
                                                                        state<=idle;
                                                                end
                                                end
                                               
                                        receive_data0:
                                                begin
                                                        data_tem[0]<=data;
                                                        state<=receive_data1;
                                                end
                                               
                                        receive_data1:
                                                begin
                                                        data_tem[1]<=data;
                                                        state<=receive_data2;
                                                end
                                               
                                        receive_data2:
                                                begin
                                                        data_tem[2]<=data;
                                                        state<=receive_data3;
                                                end
                                               
                                        receive_data3:
                                                begin
                                                        data_tem[3]<=data;
                                                        state<=receive_data4;
                                                end
                                               
                                        receive_data4:
                                                begin
                                                        data_tem[4]<=data;
                                                        state<=receive_data5;
                                                end
                                               
                                        receive_data5:
                                                begin
                                                        data_tem[5]<=data;
                                                        state<=receive_data6;
                                                end
                                               
                                        receive_data6:
                                                begin
                                                        data_tem[6]<=data;
                                                        state<=receive_data7;
                                                end
                                               
                                        receive_data7:
                                                begin
                                                        data_tem[7]<=data;
                                                        state<=receive_p;
                                                end
                                               
                                        receive_p:
                                                begin
                                                        //if((~^data_tem)==data)
                                                                //begin
                                                                        state<=receive_1;
                                                                //end
                                                        //else
                                                                //begin
                                                                        //state<=idle;
                                                                //end
                                                end
                                               
                                        receive_1:
                                                begin
                                                        if(data)
                                                                begin
                                                                        state<=receive_over;
                                                                end
                                                        else
                                                                begin
                                                                        state<=idle;
                                                                end
                                                end
                                                                                               
                                        receive_over:
                                                begin                                                                                                               
                                                        state<=idle;
                                                end
                                       
                                        default :
                                                begin
                                                        data_tem[7:0]<=8'h0;
                                                        state<=idle;
                                                end
                                endcase
                        end
        end

always@(posedge CLK or negedge RST)
        begin
                if(!RST)
                        begin
                                LED_OUT_tem<=8'b0000_0000;
                        end
                else  
                        begin       
                                if(state==receive_over)
                                begin
                                        if((data_tem!=8'hf0)&&(data_tem!=8'h00)&&(data_tem!=8'he0))
                                                begin
                                                        //LED_OUT_tem<=data_tem;
                                                         case (data_tem)
                                                         
                                                                 8'h70: LED_OUT_tem<=8'b0000_0001; //0
                                                                 8'h69: LED_OUT_tem<=8'b0000_0010;
                                                                 8'h72: LED_OUT_tem<=8'b0000_0011;
                                                                 8'h7a: LED_OUT_tem<=8'b0000_0111;
                                                                 8'h6b: LED_OUT_tem<=8'b0000_1000;
                                                                 8'h73: LED_OUT_tem<=8'b0000_1001;
                                                                 8'h37: LED_OUT_tem<=8'b0000_1010;
                                                                 8'h6c: LED_OUT_tem<=8'b0000_1011;
                                                                 8'h75: LED_OUT_tem<=8'b0000_1100;
                                                                 8'h7d: LED_OUT_tem<=8'b0000_1101;  //9
                                                                 8'h77: LED_OUT_tem<=8'b0000_1111;  //num
                                                                 8'h4a: LED_OUT_tem<=8'b0001_0000;  ///
                                                                 8'h7c: LED_OUT_tem<=8'b0001_0001;  //*
                                                                 8'h7b: LED_OUT_tem<=8'b0001_0010;  //-
                                                                 8'h79: LED_OUT_tem<=8'b0001_0011;  //+
                                                                 8'h5a: LED_OUT_tem<=8'b0001_0100;  //enter
                                                                 8'h75: LED_OUT_tem<=8'b0001_0101;  //up
                                                                 8'h32: LED_OUT_tem<=8'b0001_0110;  //down
                                                                 
                                                                                                                               
                                                                 defaultED_OUT_tem<=8'h00;
                                                         endcase
                                                end
                                end
                        end
        end


endmodule
kelly07050505 发表于 2010-10-31 21:35:12 | 显示全部楼层
可以讨论下,有点意思
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-20 09:17 , Processed in 0.058631 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表