ShaoKn 发表于 2011-8-25 00:40:12

记号

afei8856 发表于 2011-11-12 11:42:16

mark

xue2003265029 发表于 2011-11-12 11:54:51

MARK,有空的话,自己也要研究一下了

xzf962 发表于 2011-11-12 13:24:38

MARK

qianj1986 发表于 2011-11-12 22:45:17

MARK

krontheway 发表于 2011-11-14 11:12:31

谢谢楼主!!先收藏了!

hangbaby 发表于 2011-11-15 15:04:40

好贴!试了一个,非常好使!

tongluren 发表于 2011-12-14 16:47:21

mark一下

lcmdw 发表于 2011-12-15 13:24:59

mark

Gavin_GC 发表于 2011-12-15 14:26:35

mark

enovo2468 发表于 2011-12-15 15:35:22

mark

love_zjb 发表于 2011-12-15 16:00:53

mark

xaityang 发表于 2011-12-15 16:18:25

mark

xiangzi28 发表于 2011-12-21 15:59:23

FPGA 模拟PS2协议,标记,正在学FPGA

nonez 发表于 2011-12-21 19:08:52

PS2协议

lxb007 发表于 2011-12-25 20:48:03

mark

ecclles1 发表于 2011-12-26 10:57:50

感谢!最近刚好用到PS2,先收藏了!

szfrg 发表于 2011-12-26 17:57:55

biaojiyixia

howmoney 发表于 2012-2-25 13:42:14

mark

beck_ck 发表于 2012-2-25 14:23:47

回复【楼主位】laoki8888 阿虚
-----------------------------------------------------------------------

mark

beck_ck 发表于 2012-2-25 14:33:29

回复【6楼】appleboy
-----------------------------------------------------------------------

厉害

bigrocks 发表于 2012-2-25 21:06:57

mark

greatwall2 发表于 2012-2-25 22:45:01

mark PS/2, thanks for sharing...

wanghu1232001 发表于 2012-2-29 12:41:22

记号下

qzboy 发表于 2012-3-25 21:06:55

yuantielei 发表于 2009-1-19 21:20 static/image/common/back.gif
看看我写的PS2通信程序....

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

error404 not find

NemoGu 发表于 2012-3-25 22:22:53

verilog实现很简单 mark

cc6868 发表于 2012-3-25 22:39:26

学习了....

andyskyboy 发表于 2012-8-30 19:31:35

强悍记下了、、、、

sos9616 发表于 2012-11-15 22:27:39

{:titter:}{:titter:}{:handshake:}

Fourier00 发表于 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 key_dat
);
parameterIDLE   = 5'b00001;
parameterREC    = 5'b00010;
parameterCHECK= 5'b00100;
parameterEND    = 5'b01000;
parameterFIR    = 5'b01000;

reg ps2_clk_reg;
reg ps2_dat_reg;
wire      ps2_clk_syn;
reg ps2_sta_cur;
reg ps2_sta_nxt;
reg       odd_even_check;
reg ps2_cnt    ;
reg shift_reg;
wire      odd_even_check;
assign    ps2_clk_syn = (~ps2_clk_reg)&ps2_clk_reg;//采样随路过来的时钟上升沿
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,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,ps2_dat};//数据沿拍
end

always @(*)
begin
        case(ps2_sta_cur)
               IDLE:
               begin
                       if(ps2_clk_syn == 1'b1)
                       begin
                                if(ps2_dat_reg == 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) //校验,校验成功,去找结束字符
                                        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'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
               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,ps2_dat_reg}; //在接收状态,通过移位寄存器寄存
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))
                key_dat <= shift_reg; //寄存,校验正确的情况下
end
endmodule

xhyzjiji 发表于 2012-11-17 14:23:03

先mark,不过如果是usb键盘该怎么操作呢?

banye2010 发表于 2012-11-17 23:31:02

不要丢掉4*4啊,4*4是我的最爱

lfeng105 发表于 2013-4-9 13:49:57

MARK MARK MARK

左侧右侧 发表于 2013-8-14 17:03:02

Mark!!!!!1

kongethan 发表于 2013-8-15 15:40:46

学习了,果然高人
页: 1 2 [3]
查看完整版本: FPGA模拟PS2协议,丢掉4x4键盘,来用标准键盘吧!