ps2接口键盘如何改usb的键盘连接fpga的问题

用Verilog写基于FPGA的PS2键盘驱动,当按键按下时,LED亮,放开熄灭_百度知道
用Verilog写基于FPGA的PS2键盘驱动,当按键按下时,LED亮,放开熄灭
前段代码是利用始终周期扫描并锁存键盘输入代码,得到键值送ps2_data_buff.
我的想法是检测到断码F0熄灭,即
if(ps2_data_buff==fo)
运行结果是按键松开时,LED只是非常短暂的熄灭一下,马上又亮。我分析是当下一个clk时...
我有更好的答案
熄灭了一下说明是检测到断码F0的,为什么马上有亮了,那就很简单了if(buffer的值是F0) //检测到断码
led = 熄灭;
else //不再发送断码或者你的buffer值已经更新
led = 点亮;熄灭时间是根据你的buffer的值持续为F0的时间来判断的,松开后,buffer值不再是F0,LED马上又亮了,那么就代表LED应该只会持续亮一个时钟周期或者几个时钟周期,具体buffer是什么值以及LED持续熄灭时间,可能要看你的代码以及PS2协议规定。所以,要亮就比较简单了。直接检测到断码后,熄灭LED,然后保持LED,再到下一次按下即检测到通码后点亮并保持这种可以用状态机实现,肯定是灭-亮-灭的循环。空闲状态LED保持熄灭。这里就要多一步检测通码,具体实现可以根据需求来改case(LED_STATE)
IDLE : begin
if(buffer=通码) begin
&= 1'b1;
LED_STATE &= LED_H
else begin
&= 1'b0;
LED_High : begin
//在此状态检测断码,如果没有检测到,LED则保持High
if(buffer=断码) begin
&= 1'b0;
else begin
&= 1'b1;
&= LED_STATE;
LED_Low : begin
if(buffer=通码) begin
&= 1'b1;
LED_STATE &= LED_H
else begin
//不检测到通码则保持熄灭
&= 1'b0;
&= LED_STATE;
default:;endcase
大神!能加您的QQ吗?一个键盘很多按键,也会有很多通码,如果把通码放进if的判定条件中是不是不太现实呢?
采纳率:34%
为您推荐:
其他类似问题
键盘驱动的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&>&基于FPGA的PS2接口键盘驱动
基于FPGA的PS2接口键盘驱动
上传大小:235KB
熟悉PS2接口,以及键盘的工作原理,学会用Verilog HDL设计键盘的PS2接口驱动。
详细参考博文:http://blog.csdn.net/jackinzhou/article/details/8076646
综合评分:5
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有7条
测试并通过,很好的一个源码,初学者非常适用
是有点乱,不过很值得学习
该资料很好 很值得学习
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
基于FPGA的PS2接口键盘驱动
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
jackinzhou
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
基于FPGA的PS2接口键盘驱动>> PS2_verilog基于ps2的接口,对于刚接触FPGA是个很好的选择
PS2_verilog基于ps2的接口,对于刚接触FPGA是个很好的选择
所属分类:
下载地址:
PS2_Verilog.zip文件大小:345.99 kB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
PS2_verilog基于ps2的接口,对于刚接触FPGA是个很好的选择,PS2_verilog基于ps2的接口,对于刚接触FPGA是个很好的选择
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
prev_cmp_ps2_key.asm.qmsg2.14 kB 10:33
prev_cmp_ps2_key.fit.qmsg31.17 kB 10:33
prev_cmp_ps2_key.map.qmsg14.40 kB 10:33
prev_cmp_ps2_key.tan.qmsg63.25 kB 10:33
ps2_key.(0).cnf.cdb1.39 kB 10:12
ps2_key.(0).cnf.hdb969.00 B 10:12
ps2_key.(1).cnf.cdb5.71 kB 10:12
ps2_key.(1).cnf.hdb1.89 kB 10:12
ps2_key.(2).cnf.cdb2.25 kB 10:12
ps2_key.(2).cnf.hdb846.00 B 10:12
ps2_key.(3).cnf.cdb2.97 kB 10:12
ps2_key.(3).cnf.hdb1.06 kB 10:12
ps2_key.asm.qmsg2.14 kB 10:12
ps2_key.asm_labs.ddb2.14 kB 10:12
89.00 B 10:12
ps2_key.cmp.cdb29.22 kB 10:12
ps2_key.cmp.hdb10.14 kB 10:12
ps2_key.cmp.kpt338.00 B 10:12
ps2_key.cmp.logdb4.00 B 10:12
ps2_key.cmp.rdb17.74 kB 10:12
ps2_key.cmp.tdb21.58 kB 10:12
ps2_key.cmp0.ddb55.75 kB 10:12
ps2_key.db_info137.00 B 10:12
ps2_key.eco.cdb161.00 B 14:06
ps2_key.fit.qmsg31.17 kB 10:12
ps2_key.hier_info4.16 kB 10:12
ps2_key.hif2.28 kB 10:12
1.56 kB 10:12
ps2_key.lpc.rdb485.00 B 10:12
1.89 kB 10:12
ps2_key.map.cdb10.03 kB 10:12
ps2_key.map.hdb9.78 kB 10:12
ps2_key.map.logdb4.00 B 10:12
ps2_key.map.qmsg14.40 kB 10:12
ps2_key.pre_map.cdb8.38 kB 10:12
ps2_key.pre_map.hdb9.59 kB 10:12
ps2_key.rpp.qmsg1.78 kB 10:33
ps2_key.rtlv.hdb9.56 kB 10:12
ps2_key.rtlv_sg.cdb9.08 kB 10:12
ps2_key.rtlv_sg_swap.cdb836.00 B 10:12
ps2_key.sgate.rvd9.44 kB 10:33
ps2_key.sgate_sm.rvd216.00 B 10:33
ps2_key.sgdiff.cdb8.43 kB 10:12
ps2_key.sgdiff.hdb9.84 kB 10:12
ps2_key.sld_design_entry.sci154.00 B 14:06
ps2_key.sld_design_entry_dsc.sci154.00 B 10:12
&ps2_key.syn_hier_info&0.00 B 10:12
ps2_key.tan.qmsg63.25 kB 10:12
ps2_key.tis_db_list.ddb174.00 B 10:12
ps2_key_global_asgn_op.abo166.23 kB 10:12
653.00 B 15:50
ps2_key.root_partition.map.kpt29.54 kB 10:12
3.02 kB 20:51
ps2_key.asm.rpt7.26 kB 10:12
ps2_key.cdf327.00 B 21:02
ps2_key.done26.00 B 10:33
ps2_key.dpf239.00 B 15:51
ps2_key.fit.rpt66.15 kB 10:12
ps2_key.fit.smsg334.00 B 10:12
ps2_key.fit.summary363.00 B 10:12
ps2_key.flow.rpt6.61 kB 10:12
ps2_key.jpg32.27 kB 10:33
ps2_key.map.rpt23.25 kB 10:12
ps2_key.map.summary303.00 B 10:12
ps2_key.pin15.01 kB 10:12
ps2_key.pof7.67 kB 10:12
ps2_key.qpf910.00 B 19:54
ps2_key.qsf2.53 kB 14:06
ps2_key.qws531.00 B 14:06
ps2_key.tan.rpt91.14 kB 10:12
ps2_key.tan.summary1.79 kB 10:12
1.55 kB 14:06
ps2_key.v.bak1.49 kB 16:11
ps2_key_assignment_defaults.qdf39.26 kB 15:49
4.36 kB 16:00
1.94 kB 21:00
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载PS2_Verilog.zip
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:ms - init:0.1;find:3.8;t:13.5;tags:47.7;related:442.9;comment:0.5; 5.8
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧FPGA笔记3:基于PS2键盘编解码实验
&基于USB协议的键盘即插即用,目前笔记本电脑基本使用的都是这种键盘。一帧包含8字节数据,2字节为状态标记位,6字节记录当前被按下或弹起的键盘扫描编码,所以USB一次最多只能描述6个按键的状态。而PS/2协议数据位并不受限,帧长度由操作系统本身决定,从理论上来说可以做到无限按键无冲。
PS/2协议是一种双向同步串行协议,即每一次发送数据,时钟脉冲有效即读取数据。主机与鼠标/键盘可以相互发送数据,不过主机在总线上有主控权,可以随时抑制来自设备的数据。
数据帧格式如图所示,键盘发送数据到主机时,总是在时钟下降沿被主机读取。帧起始位为低电平,停止位为高电平,应答位仅用在主机对设备的通讯中。PC通过PS/2接口与从设备通信时,总是在时钟下降沿读取数据。
&键盘扫描码有两种:通码和断码。当键被按下时,键盘处理器发送通码;当键被释放时,键盘处理器发送断码。每个按键具有唯一的通码和断码。本实验采用的是第二套扫描码集。通常通码只有一个字节(短码),也有少部分扩展按键的通码是两字节或是四字节(长码,长码的通码第一字节是8'he0)。多数断码有两字节,第一个字节是8'hf0,第二个字节是按键的通码。扩展按键的断码有三字节,前两个字节是8'he0,8'hf0,最后一字节是按键的通码。
&本模块的主要功能是将键盘的串行数据转换成并行数据。
module sp2(clk,rst_n,
ps2_clk,ps2_data,
&&ps2_byte,ps2_state,key_off
input rst_n;
input ps2_//PS/2设备时钟
input ps2_//键盘输出的串行数据
output[7:0] ps2_//串行数据转换成并行数据
output ps2_//按键按下标志位,1表示有键被按下,0表示没有键被摁下
output key_
reg ps2_0,ps2_1,ps2_2;
always @(posedge clk or negedge rst_n)
if (!rst_n)begin&
& &ps2_0&=1'b0;
ps2_1&=1'b0;
ps2_2&=1'b0;
else begin&
& & ps2_0&=ps2_
ps2_1&=ps2_0;
ps2_2&=ps2_1;
wire ps2_r;
assign ps2_r=ps2_2&~ps2_1;//检测PS/2设备时钟下降沿
reg[7:0]temp_
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
& & num&=4'b0;
& & temp_data&=8'b0;
else if (ps2_r)begin
4'd0:num&=num+1'b1;//去除起始位
4'd1:begin num&=num+1'b1;
&temp_data[0]&=ps2_ end
4'd2:begin num&=num+1'b1;
&temp_data[1]&=ps2_ end
4'd3:begin num&=num+1'b1;
&temp_data[2]&=ps2_ end
4'd4:begin num&=num+1'b1;
&temp_data[3]&=ps2_ end
4'd5:begin num&=num+1'b1;
&temp_data[4]&=ps2_ end
4'd6:begin num&=num+1'b1;
&temp_data[5]&=ps2_end
4'd7:begin num&=num+1'b1;
&temp_data[6]&=ps2_end
4'd8:begin num&=num+1'b1;
&temp_data[7]&=ps2_ end
4'd9:num&=num+1'b1;//本实验没有校验位&
4'd10: num&=4'b0;//串行数据转换成并行数据完成
default: ;
endcase &end
reg key_//按键松开标志位,1表示按键松开,0表示按键未松开
reg[7:0] temp_byte_r;&
reg ps2_state_r;
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
& &key_off&=1'b0;
temp_byte_r&=8'b0;
ps2_state_r&=1'b0;
else if (num==10)begin
(temp_data==8'hf0)begin&
key_off&=1'b1;//判断为断码,释放按键
& & ps2_state_r&=1'b0;
& & else if(!key_off) begin
//判断为通码,按键按下
&temp_byte_r&=temp_
&ps2_state_r&=1'b1;
&begin //若是长码按键,则无效
& key_off&=1'b0;
&ps2_state_r&=1'b0;end
assign ps2_state=ps2_state_r;
assign ps2_byte=temp_byte_r;
ps2设备的最大时钟频率为33Khz,大多数情况下工作在10-20Khz,推荐频率是15Khz。为测试上述程序是否正确,编写了testbench,仿真其正确性。其中键盘数据发送过程如下:
& 1) 等待Clock线为高电平,即等待主机释放Clock线;
  2) 延时50
判断Clock线是否为高电平? No—跳到第1步;
Data线是否为高电平?No—放弃(跳到从主机读取字节的程序中);
延迟20us,输出起始位(0),然后延迟20us,再拉低Clock线保持40us后释放Clock线,形成一个脉冲;
  6) 延时20us,测试Clock线是否为高电平?No—
跳到第1步;
输出第1个数据位,然后延时20us,再拉低Clock线保持40us后释放Clock线,形成一个脉冲;
  8) 重复6-7步发送剩下的7个数据位和校验位;
  9) 延时20us,测试Clock线是否为高电平? No—
跳到第1步;
从图中可以看出,改测试文件先后模拟了“Z”和“X”键按下与释放过程,键盘发送的串行数据ps2_data变成了并行数据ps2_byte。
`timescale 1 ns/ 1 ps
module sp2_vlg_tst();
reg rst_n;
wire key_ & &
wire [7:0] &ps2_
.clk(clk),
.ps2_byte(ps2_byte),
.ps2_clk(ps2_clk),
.ps2_data(ps2_data),
.ps2_state(ps2_state),
.rst_n(rst_n),
.key_off(key_off)
initial begin
forever #10 clk=~
initial begin
ps2_data=1;
ps2_clk=1;
rst_n=1;//撤销复位
key_event(8'h1A);//发送Z
key_event(8'h35);//发送X &
task press_
& & &input
&data_send(8'hf0);
&data_send(key_number);
task release_
& & &input
&begin data_send(key_number);
&task key_
& & &input
&begin press_key(key_number);
&release_key(key_number);
task data_
& & &input
&ps2_data=0;//发送起始位
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[0];//发送第0位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[1];//发送第1位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[2];//发送第2位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[3];//发送第3位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[4];//发送第4位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[5];//发送第5位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[6];//发送第6位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=data[7];//发送第7位数据
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=0;//发送校验位,目前没有考虑
丠ps2_clk=0;
鱀ps2_clk=1;
丠ps2_data=1;//发送停止位
丠ps2_clk=0;
鱀ps2_clk=1;
&$write("Simulation Successful");
endtask & &
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 ps2键盘接口定义 的文章

 

随机推荐