PS2操作

1.整体框架
image
2.子模块
(1)PS2_Module
image
文件:PS2_Module.v
module PS2_Module(CLK,nRST,PS2_CLK_Pin_IN,PS2_Data_Pin_IN,PS2_Data,PS2_Done_Sig);
input CLK;
input nRST;
input PS2_CLK_Pin_IN;
input PS2_Data_Pin_IN;
output [7:0]PS2_Data;
output PS2_Done_Sig;

wire H2L_Sig;
Detect_Module U1
(
.CLK(CLK),.nRST(nRST),
.PS2_CLK_Pin_IN(PS2_CLK_Pin_IN),
.H2L_Sig(H2L_Sig)
);

PS2_Decoder_Module U2
(
.CLK(CLK),.nRST(nRST),
.H2L_Sig(H2L_Sig),
.PS2_Data_Pin_IN(PS2_Data_Pin_IN),
.PS2_Done_Sig(PS2_Done_Sig),
.PS2_Data(PS2_Data)
);
endmodule

image
image

文件:Detect_Module.v
module Detect_Module(CLK,nRST,PS2_CLK_Pin_IN,H2L_Sig);
input CLK;
input nRST;
input PS2_CLK_Pin_IN;
output H2L_Sig;

reg H2L_F1;
reg H2L_F2;
always @(posedge CLK or negedge nRST)
if(!nRST)
begin
H2L_F1<=1'b1;
H2L_F2<=1'b1;
end
else
begin
H2L_F1<=PS2_CLK_Pin_IN;
H2L_F2<=H2L_F1;
end

assign H2L_Sig=H2L_F2&!H2L_F1;

endmodule

image

文件: PS2_Decoder_Module.v
module PS2_Decoder_Module(CLK,nRST,H2L_Sig,PS2_Data_Pin_IN,PS2_Data,PS2_Done_Sig);
input CLK;
input nRST;
input H2L_Sig;
input PS2_Data_Pin_IN;
output [7:0]PS2_Data;
output PS2_Done_Sig;

reg [7:0]rData;
reg isDone;
reg [4:0]i;

always @(posedge CLK or negedge nRST)
if(!nRST)
begin
rData<=8'd0;
i<=5'd0;
isDone<=1'b0;
end
else
case(i)
5'd0:if(H2L_Sig) i<=i+1'b1;

   4'd1,4'd2,4'd3,4'd4, 
   4'd5,4'd6,4'd7,4'd8:if(H2L_Sig)
                        begin i<=i+1'b1;
                             rData[i-1]<=PS2_Data_Pin_IN;
                        end

   5'd9,5'd10:if(H2L_Sig) i<=i+1'b1;

   5'd11:if(rData==8'hf0)
             i<=5'd12;
          else
             i<=5'd23;

   5'd12,5'd13,5'd14,5'd15,5'd16,
   5'd17,5'd18,5'd19,5'd20,5'd21,5'd22:if(H2L_Sig)
                                         i<=i+1'b1;

   5'd23:begin i<=i+1'b1;
               isDone<=1'b1;
         end

   5'd24:begin
            i<=5'd0;
            isDone<=1'b0;
         end
 endcase

assign PS2_Done_Sig=isDone;
assign PS2_Data=rData;

endmodule

(2)Cmd_Control_Module
image
文件:Cmd_Control_Module.v
module Cmd_Control_Module(CLK,nRST,PS2_Data,Data_Out,PS2_Done_Sig);
input CLK;
input nRST;
input [7:0]PS2_Data;
input PS2_Done_Sig;
output [3:0]Data_Out;

reg [3:0]rData;
always @(posedge CLK or negedge nRST)
if(!nRST)
rData<=4'b0001;
else if(PS2_Done_Sig)
case(PS2_Data)
8'h1d: rData <= { rData[2:0], rData[3] }; 
8'h22: rData <= { rData[0], rData[3:1] }; 
8'h14: rData <= { rData[0],rData[1],rData[2],rData[3]};
endcase

assign Data_Out=rData;
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬 卉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值