Xilinx FPGA设计与实践教程 教学课件 作者 赵吉成 第6 10章 第9章.ppt

Xilinx FPGA设计与实践教程 教学课件 作者 赵吉成 第6 10章 第9章.ppt

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9.1 PS/2基础 9.1.1 PS/2端口的物理接口   除了数据线和时钟线之外,PS/2端口还包括电源线(VCC)和地(GND)。电源由主系统提供,VCC是5 V供电,数据和时钟线是开漏极的。不过现在大部分的键盘和鼠标支持3.3 V供电,所以在S3开发板上针对PS/2接口有两个电源供电,一个是5 V,针对老的计算机,另外一个是3.3 V供电,针对新的计算机,可以通过跳线来选择。另外,大家不必担心电平匹配的问题,FPGA的引脚是支持PS/2端口的5 V电平的。 9.1.2 PS/2接口主从设备通信协议   PS/2设备与其主系统之间通过包的方式进行通信。基本的从设备到主系统的数据传输协议如图9-1所示,其中,数据与时钟信号分别标为ps2d和ps2c。   数据以串行比特流传输,其格式与UART的非常相似,传输从开始位开始,然后进行8位的数据和奇偶校验,最后是停止位。与UART不同的是时钟信息由单独的时钟信号线提供,每次ps2c的下降沿时刻数据线ps2d上的数据开始有效并可以存取。时钟信号ps2c的周期在60到100 μs之间(约10~16.7 kHz),而且要求ps2d信号在ps2c信号来临之前已经保持稳定的时间为5 μs,同时在ps2c下降沿结束之后同样保持有5μs的稳定时间。按照前面讲述的数字电路术语,就是建立时间和保持时间都是5 μs。 图9-1 PS2的端口时序图 9.1.3 PS/2接收模块设计   基于PS/2端口的接收系统设计与UART的接收模块很相似,只是在采样过程中不需要过采样。根据PS/2的协议,信号ps2c的下降沿为接收数据的参考点。子系统包含一个下降沿检测电路,其功能是当检测到ps2c信号下降沿来临时,生成一个时钟宽度的脉冲信号,同时接收器从串行线移位一位数据并存储下来。   在这里要注意,下降沿检测过程中需要考虑杂波的干扰,因而需要增加滤波电路来过滤毛刺,其代码如下: always @(posedge clk, posedge reset) filter-reg = filter-next ; ... //1-bit 移位寄存器 assign filter-next = {ps2c, filter-reg [7:11]}; //滤波器 assign f_ps2c_next = (filter_reg= =8 bllllllll) ? lbl: (filter_reg= =8 ? 1b0: f-ps2c-reg;   滤波电路主要包含一个8位的移位寄存器电路,另外还有判断部分。当8位数据全部为1或0时,对应返回值为1或0,因此小于8个时钟周期的信号变化都会当作毛刺被忽略,而通过滤波器的信号输出到下降沿检测电路中。   接收电路的ASMD流程图如图9-2所示,接收器一开始处于idle状态,系统包含了一个rx_en的控制寄存器,用来使能或停止接收操作,目的是为了双向传输操作的控制。在本系统中,由于键盘为单向操作,可以固定设置为1(仅用来做接收操作)。   当检测到下降沿并且rx_en信号为有效时,状态机将起始位移入并进入数据传输状态dps。由于接收数据模式固定,所以连续移入10 bit数据,而不是分数据、校验和停止三个状态移入数据。然后状态机进入置位状态,多余一个时钟用来完成停止位的移位操作,并置位psrx_done_tick信号一个时钟周期。具体滤波电路和ASMD状态机描述如程序9-1所示。 图9-2 PS/2 接收部分状态机流程图   【程序9-1】 PS/2接收程序。   module ps2_rx    (    input wire clk, reset,    input wire ps2d, ps2c, rx_en,    output reg rx_done_tick,    output wire [7:0] dout    );       //状态机信号声明    localparam [1:0]    idle = 2b00,    dps = 2b01,    load = 2b10;    //信号声明    reg [1:0] state_reg, state_next;    reg [7:0] filter_reg;    wire [7:0] filter_next;    reg f_ps2c_reg;    wire f_ps2c_next;    reg [3:0] n_reg, n_next;    reg [10:0] b_reg, b_next;   

您可能关注的文档

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档