4595|5

35

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【Altera SOC体验之旅】(二)PS2键盘 [复制链接]

本帖最后由 Jackzhang1992 于 2015-4-17 11:04 编辑

(二)PS2键盘
一、老式的电脑都采用PS/2接口协议的键盘。

(该图转自http://www.cnblogs.com/jianyungsun/archive/2011/03/18/1988347.html


PS键盘使用的时序格式和串口UART的格式非常相似,不过它多了一个CLOCK信号,是由键盘给出的,用于定位数据。
(该图转自http://www.cnblogs.com/jianyungsun/archive/2011/03/18/1988347.html


(二)为了正确采集PS/2键盘的数据,首先检测CLOCK的下降沿,并且在每次下降沿把data的数据采集到一个寄存器中,当第11个数据采集到后,比较第一位是否是0(起始位),8位数据位是否校验位和校验位相同。如果满足,则把这一组Data存下来。
具体实现可以使用代码(摘自李亚民老师的<计算机原理与设计:VerilogHDL>一书),我做了详尽的中文代码注释


`timescale 1ns/1ns
module ps2_keyboard (clk,clrn,ps2_clk,ps2_data,rdn,data,ready,overflow,ps2_clk_sync,sampling,buffer,count,w_ptr,r_ptr);
    input        clk, clrn;                    // 50 MHZ 系统时钟
    input        ps2_clk;                      // ps2 时钟信号
    input        ps2_data;                     // ps2 数据信号
    input        rdn;                          // 外部读信号,有数据时,置低一个周期,便可读一组数据。
    output [7:0] data;                         // 输出数据
    output       ready;                        // 如果controller中有数据则Ready为1,表示用户可以置低rdn读数据了
    output reg   overflow=1'b0;                     // 如果controller中数据太多没被读,内部fifo满了,overflow=1
    output reg    [9:0] buffer=10'd0;                       // 数据buffer,用于暂存ps2_data移位得到的数据。
    reg    [7:0] fifo[7:0];                    // 循环fifo
    output reg    [3:0] count=4'd0;                        // ps2_data移位次数计数器
    output reg    [2:0] w_ptr=3'd0;
        output reg [2:0]r_ptr=3'd0;                  // fifo 的读写指针
    output sampling;
   
        output reg [1:0]ps2_clk_sync=2'd00;
        //下降沿检测,当ps2_clk满足“10”,下降沿时,则sample产生一个脉冲。
        always @ (posedge clk)
        ps2_clk_sync <= {ps2_clk_sync[0],ps2_clk};
    assign sampling = ps2_clk_sync[1] &
                   ~ps2_clk_sync[0];         
                                   
        //这个always块主要做的是ps2_data的采集,以及写入fifo和fifo的读操作。                           
    always @ (posedge clk) begin
        if (!clrn) begin                       // 同步复位信号
            count    <= 0;                     // 清空计数器
            w_ptr    <= 0;                     // 清空写指针
            r_ptr    <= 0;                     // 清空读指针
            overflow <= 0;                     // 清空溢出信号。
        end else if (sampling) begin           // 如果进行一次采样,
            if (count == 4'd10) begin          // 如果采集到11个数据了,一帧结束
                if ((buffer[0] == 0) && (ps2_data) && (^buffer[9:1])) begin //一帧结束后,判断起始位0,以及结束位为1,奇校验是否正确
                    if ((w_ptr + 3'b1) != r_ptr) begin//如果这帧数据有效,判断读指针是否碰到写指针,写满
                        fifo[w_ptr] <= buffer[8:1];//如果没有写满,将数据写入fifo
                        w_ptr <= w_ptr + 3'b1; // 写指针+1
                    end else begin
                        overflow <= 1;         // 若写满,则溢出信号置1
                    end
                end
                count <= 0;                    // 如果一帧结束,count清0,准备采集下一帧数据
            end else begin                     //
                buffer[count] <= ps2_data;     // 把串行的数据存到buffer的对应位里面
                count <= count + 4'b1;         // count加1
            end
        end
        if ((~rdn) && ready) begin               //若rdn=0,ready等于1,即在有数据的情况下主机置低rdn
            r_ptr <= r_ptr + 3'b1;             // 读指针加+1,是在下一个时钟的时候才能被采样。故这一拍就可以立即得到fifo[r_ptr]数据了
            overflow <= 0;                     // 清空overflow
        end
    end
        
               
    assign ready = (w_ptr != r_ptr);           // 如果写指针不等于读指针,则ready置1,表明有数据
    assign data  = fifo[r_ptr];                // 异步读取。
        
        

endmodule


(三)仿真波形
testbench部分完全由自己编写,生成类似ps2/键盘产生的时序波形,接入ps2 controller模块,观察写与读的现象。




ps2kbd_testbench.rar (143.23 KB, 下载次数: 40)


此帖出自FPGA/CPLD论坛

最新回复

在哪个板子上实现的?  详情 回复 发表于 2015-4-17 11:27
点赞 关注(1)
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
学习一下。
此帖出自FPGA/CPLD论坛

点评

谢谢支持,有操作上的什么问题欢迎交流。  详情 回复 发表于 2015-4-17 11:06
 
 

回复

35

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

谢谢支持,有操作上的什么问题欢迎交流。
此帖出自FPGA/CPLD论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
Jackzhang1992 发表于 2015-4-17 11:06
谢谢支持,有操作上的什么问题欢迎交流。

其实我是小白
此帖出自FPGA/CPLD论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

5
 
在哪个板子上实现的?
此帖出自FPGA/CPLD论坛

点评

在De1-soc上做的  详情 回复 发表于 2015-4-17 12:53
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

35

帖子

0

TA的资源

一粒金砂(中级)

6
 
chenzhufly 发表于 2015-4-17 11:27
在哪个板子上实现的?

在De1-soc上做的
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表