搜索
bottom↓
123
返回列表 发新帖
楼主: laoki8888

FPGA模拟PS2协议,丢掉4x4键盘,来用标准键盘吧!

[复制链接]

出0入0汤圆

发表于 2011-8-25 00:40:12 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-11-12 11:42:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-12 11:54:51 | 显示全部楼层
MARK,有空的话,自己也要研究一下了

出0入0汤圆

发表于 2011-11-12 13:24:38 | 显示全部楼层
MARK

出20入12汤圆

发表于 2011-11-12 22:45:17 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-14 11:12:31 | 显示全部楼层
谢谢楼主  !!先收藏了!

出0入0汤圆

发表于 2011-11-15 15:04:40 | 显示全部楼层
好贴!试了一个,非常好使!

出0入0汤圆

发表于 2011-12-14 16:47:21 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2011-12-15 13:24:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-15 14:26:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-15 15:35:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-15 16:00:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-15 16:18:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-21 15:59:23 | 显示全部楼层
FPGA 模拟PS2协议,标记,正在学FPGA

出0入0汤圆

发表于 2011-12-21 19:08:52 | 显示全部楼层
PS2协议

出0入0汤圆

发表于 2011-12-25 20:48:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-26 10:57:50 | 显示全部楼层
感谢!最近刚好用到PS2,先收藏了!

出0入0汤圆

发表于 2011-12-26 17:57:55 | 显示全部楼层
biaojiyixia

出0入16汤圆

发表于 2012-2-25 13:42:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-25 14:23:47 | 显示全部楼层
回复【楼主位】laoki8888 阿虚
-----------------------------------------------------------------------

mark

出0入0汤圆

发表于 2012-2-25 14:33:29 | 显示全部楼层
回复【6楼】appleboy
-----------------------------------------------------------------------

厉害

出0入0汤圆

发表于 2012-2-25 21:06:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-25 22:45:01 | 显示全部楼层
mark PS/2, thanks for sharing...

出0入0汤圆

发表于 2012-2-29 12:41:22 | 显示全部楼层
记号下

出0入0汤圆

发表于 2012-3-25 21:06:55 | 显示全部楼层
yuantielei 发表于 2009-1-19 21:20
看看我写的PS2通信程序....

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=2167690&bbs_page_no=1&bbs ...

error404 not find

出0入0汤圆

发表于 2012-3-25 22:22:53 | 显示全部楼层
verilog实现很简单 mark

出0入0汤圆

发表于 2012-3-25 22:39:26 | 显示全部楼层
学习了....

出0入0汤圆

发表于 2012-8-30 19:31:35 | 显示全部楼层
强悍记下了、、、、

出0入0汤圆

发表于 2012-11-15 22:27:39 | 显示全部楼层

出0入0汤圆

发表于 2012-11-17 14:11:32 | 显示全部楼层
//时钟频率为 10 16.7kHz 从时钟脉冲的上升沿到一个数据转变的时间至少要有 5 微秒 数据变化到时
//钟脉冲的下降沿的时间至少要有 5 微秒并且不大于 25 微秒 这个定时非常重要 你应该严格遵循它
//主机可以在第 11 个时钟脉冲 停止位 之前把线拉低 导致设备放弃发送当前字节 这是非常罕见的
//在停止位发送后 设备在发送下个包前至少应该等待 50 毫秒 这将给主机时间当它处理接收到的字节
//时抑制发送 主机在收到每个包时 通常自动做这个 在主机释放抑制后 设备至少应该在发送任何
//数据前等 50 毫秒

module ps2_proc
(
        input            clk    ,
        input            rst_n  ,
        input            ps2_clk,
        input            ps2_dat,
        output reg [7:0] key_dat
);
parameter  IDLE   = 5'b00001;
parameter  REC    = 5'b00010;
parameter  CHECK  = 5'b00100;
parameter  END    = 5'b01000;
parameter  FIR    = 5'b01000;

reg [2:0] ps2_clk_reg;
reg [1:0] ps2_dat_reg;
wire      ps2_clk_syn;
reg [4:0] ps2_sta_cur;
reg [4:0] ps2_sta_nxt;
reg       odd_even_check;
reg [9:0] ps2_cnt    ;
reg [7:0] shift_reg  ;
wire      odd_even_check;
assign    ps2_clk_syn = (~ps2_clk_reg[2])&ps2_clk_reg[1];//采样随路过来的时钟上升沿
always @(posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)
                ps2_clk_reg <= 3'd0;
        else
                ps2_clk_reg <= {ps2_clk_reg[1:0],ps2_clk}; //时钟延拍
end
always @(posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)
                ps2_dat_reg <= 2'd0;
        else
                ps2_dat_reg <= {ps2_dat_reg[0],ps2_dat};//数据沿拍
end

always @(*)
begin
        case(ps2_sta_cur)
                 IDLE:
                 begin
                         if(ps2_clk_syn == 1'b1)
                         begin
                                if(ps2_dat_reg[1] == 1'b1)//在IDLE状态下的时候,如果采样到一个时钟上升沿,状态机跳到接收状态
                                        ps2_sta_nxt = REC;
                                else
                                        ps2_sta_nxt = FIR; //如果没有时钟上升沿过来,证明发过来的起始有错误,就直接跳到过滤状态
            end
                        else
                                ps2_sta_nxt = IDLE; //如果没有上升沿就一直处于IDLE状态  
                 end
                 REC:
                 begin
                         if(ps2_clk_syn == 1'b1)
                        begin
                                if(ps2_cnt >= 10'd7)    //在接收状态下计数器计数到7次的时候,就表示数据已经接收完毕,跳到检验
                                        ps2_sta_nxt = CHECK;
                                else
                                        ps2_sta_nxt = REC; //如果计数器没有到7,就一直等待接收完毕
                        end
                        else
                                ps2_sta_nxt = REC;//没有来上升沿,就一直在接收状态
                 end
                 CHECK:
                 begin
                         if(ps2_clk_syn == 1'b1)
                        begin       
                                if(odd_even_check == ps2_dat_reg[1]) //校验,校验成功,去找结束字符
                                        ps2_sta_nxt = END;
                                else
                                        ps2_sta_nxt = FIR; //校验,校验失败,直接去过滤状态
                        end
                        else
                                ps2_sta_nxt = CHECK;       
                 end
                 END:
                 begin
                         if(ps2_clk_syn == 1'b1)
                        begin
                                if(ps2_dat_reg[1] == 1'b1)  //结束字符如果是1,就跳转到IDLE
                                        ps2_sta_nxt = IDLE;
                                else        
                                        ps2_sta_nxt = FIR; //否则就结束字符失败,跳转到过滤状态
                        end
                 end
                 FIR:
                 begin
                         if(ps2_cnt >= 10'd1023) //1m的时钟,过滤1.023ms以后,继续跳转到IDLE
                                ps2_sta_nxt = IDLE;
                        else
                                ps2_sta_nxt = FIR;
                 end
                 default:
                 begin
                         ps2_sta_nxt = IDLE;odd_even_check == ps2_dat_reg[1]
                 end
        endtask
end
always @(posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)
                ps2_sta_cur <= IDLE;
        else
                ps2_sta_cur <= ps2_sta_nxt;
end

always@(posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)
           ps2_cnt <= 10'd0;
        else if(sta_cur == REC&&ps2_clk_syn == 1'b1)
           ps2_cnt <= ps2_cnt + 10'd1; //计数器计数,在接收状态
        else if(sta_cur == FIR )
       ps2_cnt <= ps2_cnt + 10'd1; //在过滤状态下,进行计数
        else
           ps2_cnt <= 10'd0;        //其他状态对计数器进行清零
end

always @(posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)
                shift_reg <= 8'd0;
        else if(ps2_sta_cur == REC &&ps2_clk_syn == 1'b1)
                shift_reg <= {shift_reg[6:0],ps2_dat_reg[1]}; //在接收状态,通过移位寄存器寄存
end
assign odd_even_check = ^shift_reg; //奇偶校验
always @(posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)
                key_dat <= 8'd0;
    else if((ps2_sta_cur == CHECK )&&(odd_even_check == ps2_dat_reg[1]))
                key_dat <= shift_reg; //寄存,校验正确的情况下
end
endmodule

出0入0汤圆

发表于 2012-11-17 14:23:03 | 显示全部楼层
先mark,不过如果是usb键盘该怎么操作呢?

出0入0汤圆

发表于 2012-11-17 23:31:02 | 显示全部楼层
不要丢掉4*4啊,4*4是我的最爱

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-9 13:49:57 | 显示全部楼层
MARK MARK MARK

出0入0汤圆

发表于 2013-8-14 17:03:02 | 显示全部楼层
Mark!!!!!1

出0入0汤圆

发表于 2013-8-15 15:40:46 | 显示全部楼层
学习了,果然高人
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 12:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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