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
学习了,果然高人