FPGA控制的PS2接口电路设计.docx

上传人:b****6 文档编号:8619383 上传时间:2023-02-01 格式:DOCX 页数:25 大小:249.11KB
下载 相关 举报
FPGA控制的PS2接口电路设计.docx_第1页
第1页 / 共25页
FPGA控制的PS2接口电路设计.docx_第2页
第2页 / 共25页
FPGA控制的PS2接口电路设计.docx_第3页
第3页 / 共25页
FPGA控制的PS2接口电路设计.docx_第4页
第4页 / 共25页
FPGA控制的PS2接口电路设计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

FPGA控制的PS2接口电路设计.docx

《FPGA控制的PS2接口电路设计.docx》由会员分享,可在线阅读,更多相关《FPGA控制的PS2接口电路设计.docx(25页珍藏版)》请在冰豆网上搜索。

FPGA控制的PS2接口电路设计.docx

FPGA控制的PS2接口电路设计

FPGA控制的PS/2接口电路设计

***

(电信科071班***********)

摘要:

介绍了FPGA控制的PS/2接口电路的设计。

FPGA控制电路能够识别PS/2键盘按键,并将按键的扫描码与对应ASCII码显示在数码管上,且将上述所有内容按要求显示在1602液晶屏上。

关键字:

FPGA;键盘接口;键盘扫描;数码显示

DesignofPS/2portcircuitcontrolledbyFPGA

ZhangLijuan

Abstract:

thispaperintroducesthedesignofPS/2portcircuitcontroledbyFPGA.ThecircuitcontroledbyFPGAcanidentifyPS/2push-button,anddisplayit’sscancodecorrespondingASCIIonNixietube,andallabovewillbedisplayedintheLCDscreen1602asrequired.

Keywords:

FPGA;keyboardport;keyboardscan;Nixiedisplay

引言:

作为计算机最常用输入设备键盘,最早使用的是的PC/AT机的84键的键盘,现在使用的是增强型的,键盘是嵌入式系统的最重要的输入设备之一,是实现人机交互的重要途径。

键盘接口的主要电路是用Intel8042单片机作键盘控制,该芯片能够实现键盘接口的全部功能,可以将键盘扫描码转换成系统ASCII码,同时还实现了键盘和CPU之间的双向传输功能。

PS/2接口电路的工作原理:

PS/2协议和接口最初是IBM公司开发并推广使用的一种应用于键盘/鼠标的协议和接口,PS/2键盘按键接口是6芯的插头与PC机的键盘相连接,插头、插座定义如图1所示。

图1PS/2键盘(鼠标)接口

图2键盘收发数据时序图

实际上6芯中要使用的信号时4个管脚:

电源和地各占一个,除了电源线VCC和地线GND之外,另外两个是键盘和键盘接口之间的两条双向通信线:

时钟线CLK和数据线DATA。

PS/2键盘(或鼠标)都采取双向串行同步传输方式。

双向式指既可以发送数据到主机,主机也可以发送数据到设备。

串行指的是每次数据线上发送一位数据也要在时钟线上发一个脉冲数据才能被读入,在整个时钟脉冲作用下同步地收发数据,如图2所示。

数据格式:

从键盘/鼠标发送到主机的数据是在时钟的下降沿时被读取,而从主机发送到键盘/鼠标是在时钟的上升沿时被读取。

主机要传送的数据包含了11~12位,组成一帧数据,格式如下:

1个起始位

总是逻辑0

8个数据位

(LSB)低位在前

1个校奇偶验位

奇校验

1个停止位

总是逻辑1

1个应答位

仅用在主机对设备的通讯中

表1键盘收发数据格式

表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。

PS口的5V供电由是源的待机电压5V提供,通过保险电阻、电感L5至PS/2接口的供电脚,为其供电。

PS/2口的第一针与第七o针为数据脚,通过电容、电感至IO,第5脚与第11脚为时钟脚,同样通过电容电感至IO。

通信过程:

设备到主机的通信过程:

键盘/鼠标接口的数据线和时钟线采用集电极开路结构,平时都是高电平当这些设备等待发送数据时,它首先检查clock是否为高。

如果为低,则认为PC抑制了通讯,此时它缓冲数据直到获得总线的控制权。

如果clock为高电平,设备则开始向PC发送数据。

一般都是由ps2设备产生时钟信号。

发送按帧格式。

数据位在clock为高电平时准备好,在clock下降沿被PC读入。

图3所示是按下Q键的时序图“Q”键的扫描码从键盘发送到计算机(通道A是时钟信号,通道B是数据信号)。

常用时钟频率为10~16.7时,由于主机在clock的下降沿读取数据,因此数据必须在半个时钟周期内转换完毕,并在锁存数据的下降沿前至少要5μs的保持时间,如果按最高20KHZ的时钟功率来算,数据变化到稳定的时间应该时钟clock下降沿出现前至少5μs,但不能大于25μs,这是由PS/2通讯协议的时序规定的。

图3按下Q键产生的扫描码时序

1.主机到设备的通信过程

主机到设备的通信过程与设备到主机的通信过程有的不同。

由于PS/2设备能提供串行同步时钟,如果主机要发送数据,就要先把时钟线和数据线置为请求发送的状态:

●PC机通过下拉时钟线大于100μs来抑制通讯;

●通过下拉数据线发出请求发送数据的信号,然后释放时钟。

当PS/2设备检测到需要接收的数据时,它会产生时钟信号并记录下面8数据位和一个停止位。

主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。

主机可以再第11个时钟脉冲应答位前只要下拉时钟脉冲应答位前只要下拉时钟线至少100μs就可以终止一次传送。

而PS/2设备则要配合PC机才能读到准确的数据。

如果主机在第11个时钟后部释放数据线,设备将继续产生时钟脉冲直到数据被释放,然后设备将产生一个错误信息。

程序设计流程

一、键盘扫描过程

键盘的处理器如果发现有键被按下或释放将发送扫描码的信息包到计算机。

扫描码有两种不同的类型:

通码和断码。

当一个键被按下就发送通码,当一个键被释放就发送断码。

每个按键被分配了唯一的通码和断码。

这样主机通过查找唯一的扫描码就可以测定是哪个按键。

每个键一整套的通断码组成了扫描码集。

有三套标准的扫描码集。

现代所有的键盘默认使用第二套扫描码。

    传输和转换的实现方法如下:

第一部分是串并转换。

由于键盘的有效端口为一个数据和一个时钟,芯片要接受键盘的时钟和数据,并进行串并转换把它转换成键盘要发送的扫描码,最后将扫描码转换成ASCII码,转换后的结果通过中断方式送给数据总线。

串并转换部分在电路实现上用移位寄存器,并在数据转换部分采用一个随着时钟变化的计数器,在时钟的下降沿,首先把采样的数据值赋给相应的并行数据的某一位,然后计数器自增。

使用计数器是由于转换成ASCII码时需要先去除一帧数据的起始位、校验位和停止位,需要进行串并转换的只是其中的8位数据。

第二部分是将扫描码转换成ASCII码。

首先要做到的是建立一个大的对照表。

由于扫描码与ASCII码之间没有现成的对应公式。

在此过程中的难点是键的按下与放开时的检测以及Shift键和Capslock键在不同的状态下的控制逻辑。

下面的设计实例采用的是D触发器实现时需要记忆元件来保存这些特殊的键的状态。

PS/2接口的设计中整合了并行接口数据的输入功能,主要包括:

数据准备好后发出中断,读信号来后将中断置位,无读信号时数据线置高阻等。

设计时没有使用非STB信号,而是根据PS/2接口传输数据的要求让逻辑来监测数据有没有准备好,是否需要发出中断信号。

分解设计:

1、接收键盘数据并转换位扫描码

由于键盘的有效端口为一个数据和一个时钟,芯片要接受键盘的时钟和数据,并进行串并转换把它转换成键盘要发送的扫描码,最后将扫描码转换成ASCII码,转换后的结果通过中断方式送给数据总线。

在数据转换部分采用一个随着时钟变化的计数器,在时钟的下降沿,首先把采样的数据值赋给相应的并行数据的某一位,然后计数器自增。

使用计数器是由于转换成ASCII码时需要先去除一帧数据的起始位、校验位和停止位,即进行串并转换的只是其中的8位数据。

具体在程序中的实现为:

(1)在实体中包括一个复位键rst即高电平有效,一个系统时钟s_clk,键盘时钟k_clk,键盘发送的每一位数据k_data,输出端口则为:

data键盘发送的有效数据,ZHJS扫描码转换结束信号即转换结束置为0,PA扫描码输出

(2)结构体中,定义tmp用来记录一帧串行数据;定义en为0,即为辅助信号,表示什么时候可以把串行数据输出到PA端

(3)进程中,定义变量start,用来把en信号赋值;变量cnt,范围为0—11,是一个随着时钟信号变化的计数器。

进程中k_clk为敏感信号量,在其下降沿进行数据操作,采样数据赋值到tmp的cnt位。

如果cnt为10,则ZHJS为0,表示扫描码转换结束,否则相反。

若cnt为11,则下一个为1,否则自增;若1

en为1时.置PA为“00000000”,en为0时,将tmp的相应位赋给输出端PA作为串并转换的结果。

程序见附录,波形仿真图如下:

2、扫描码转换成ASCII码

根据对照表将扫描码的数据转换成相对应的ASCII码,并判断是否有按键按下,且注意shift键和capslock键的状态对转换成ASCII码的不同结果的影响。

即首先判断通码和断码信号的到来与否,当信号为断码时无键按下无需进行转换;通码信号到来后根据所按下的键将扫描码转换成ASCII码;在此转换过程中同时对大小写字母的判断,条件为:

从A到Z之间满足shifted键和capslocked键都不按下时,或shifted键和capslocked键都按下时,并同时满足断码信号,此时将大写转换成小写即加0x20。

程序见附录,波形仿真图如下:

3、合并设计

将接收键盘数据产生扫描码的程序与把扫描码转换成ASCII码的程序合并在一起完成整个数据的转换及输出。

具体内容为:

将1中的PA接到2中的scan端,1中的ZHJS输出接到2中的prepared输入端。

使用component语句完成二者的连接。

器件连接如下:

二、扫描码显示过程

1、将产生的扫描码与ASCII码显示在数码管上

我们知道数码管显示数据的方式有静态显示和动态显示之分。

静态显示是将被显示的数据的BCD码通过各自的4-7/8显示译码器译码后,分别显示译码器的显示驱动段a-g(h)。

而动态显示则是将被显示的数据的BCD码,按照一定的变化频率,在不同的时刻周期性的分别送到一个数据总线上,再通过一个公共的4-7/8显示译码器后,接到多个显示译码器的公共显示驱动段a-g(h)上,同时,在不同的时刻周期性地选通对应的数码管的公共端。

在此使用动态显示,将输出扫描码和ASCII码的数据显示在数码管上。

程序见附录。

2、液晶显示扫描码及其所对应的ASCII码值

液晶显示是一种将液晶显示器件、连接件、集成电路、PCB线路板、背光源、结构件装配在一起的组件。

可组合成各种输入、显示、移位方式以满足不同要求。

其字符模块的电路框图如下图:

其字符模块功能主要有:

a)显示模式:

0x38:

16个字符x2行显示,5x7点阵,8位数据接口

b)显示开关及光标设置:

1.0x08~0x0b:

关显示

2.0x0c,0x0d:

开显示,但并不显示光标

3.0x0e:

开显示,显示光标,但不闪烁

4.0x0f:

开显示,显示光标,并闪烁

c)屏移设置:

1.0x04:

指针减1,整屏不移动

2.0x05:

指针减1,整屏左移

3.0x06:

指针加1,整屏不移动

4.0x07:

指针加1,整屏右移

d)数据指针设置(显示屏地址设置):

1.第一行地址码:

0x80+**

2.第二行地址码:

0x80+0x40+**

3.范围(00~27)

e)清零:

0x01:

数据指针清零,所有显示清零

f)回车:

0x02:

数据指针清零

g)读写操作:

写操作:

rs低电平r/w低电平en高电平

读操作:

rs高电平r/w高电平en高电平

h)显示数据:

rs高电平r/w低电平

将扫描码和ASCII码按上述功能显示在液晶屏上。

将十六进制的扫描码和ASCII码变换为两位十进制数,并在液晶显示中将其分别表示出来。

设计流程为:

初始化:

设置显示方式→开显示→AC自动加1→清屏→显示→送line1显示地址→显示数据→送line2显示地址→显示数据。

程序见附录。

结语:

上述用FPGA控制PS/2接口电路,PS/2接口协议是现在大多数键盘、鼠标与PC机通讯的标准协议。

其中鼠标对PC机的通讯更为简单,只是传输数据的内容不一样而已。

充分理解PS/2接口协议,巩固了对VHDL语言的运用,加深了对电子设计自动化这门课的理解,为以后更高层次的设计打下了坚实的基础。

可以帮助设计者自主开发一些工控机上的专用键盘等外设,并能够按照要求开发出专用的多功能键盘。

参考文献

1、侯伯亨.VHDL硬件描述语言与数字逻辑电路设计[M].西安:

西安电子科技大学出版社,1999.

2、赵世霞、杨丰、刘揭生。

VHDL与微机接口设计北京:

清华大学出版社2004

3、林敏.VHDL数字系统设计与高层次综合[M].北京:

电子工业出版社,2001.

4、卢毅.VHDL与数字电路设计[M].北京:

科学出版社,2001.

5、张琴.向先波.徐国率PS/2键盘在基于PIC单片机的远程多温度点巡检系统中的应用[期刊论文]-机械与电子2006(08)

6、苗新法.王秀隼PS/2键盘在嵌入式系统中的应用研究[期刊论文]-兰州交通大学学报2007(01)

7、徐晓.汪道辉标准PS/2键盘与单片机的接口设计[期刊论文]-中国测试技术2005(01)

8、郑炜.须文波.胡晋单片机系统中PS/2键盘驱动程序设计[期刊论文]-单片机与嵌入式系统2005

 

顶层文件:

一、键盘扫描过程

1接收键盘数据并转换为扫描码程序代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entitykbis

port(rst:

instd_logic;--复位键,低电平有效

s_clk:

instd_logic;--系统时钟

k_clk:

instd_logic;--键盘时钟

k_data:

instd_logic;--数据

PA:

bufferstd_logic_vector(7downto0);--扫描码输出

ZHJS:

outstd_logic--扫描码转换结束信号转换结束时置低

);

end;

architectureoneofkbis

signaltmp:

std_logic_vector(11downto0):

=(others=>'0');--记录每一帧的数据

signalp_kbclk,c_kbclk:

std_logic;

signalen:

std_logic;--输出使能

begin

process(rst,s_clk,k_clk)--得到键盘发送的有效数据扫描码

variablecnt:

integerrange0to11:

=0;

variablestart:

std_logic:

='0';

begin

ifrst='0'thencnt:

=0;ZHJS<='0';

elsifrising_edge(s_clk)then

p_kbclk<=c_kbclk;

c_kbclk<=k_clk;

ifp_kbclk>c_kbclkthentmp(cnt)<=k_data;

ifcnt=10thenZHJS<='0';

elseZHJS<='1';

endif;

ifcnt=11then

cnt:

=1;

elsecnt:

=cnt+1;

endif;

endif;

ifcnt>=1andcnt<10then

start:

='1';

elsestart:

='0';

endif;

endif;

en<=start;

endprocess;

PA<=(others=>'0')whenen='1'else

tmp(8downto1);

end;

二、扫描码转换成ASCII码

D触发器源程序代码:

libraryieee;

useieee.std_logic_1164.all;

entitymydis

port(clk,data:

instd_logic;

q:

outstd_logic);

end;

architectureoneofmydis

begin

process(clk)

begin

if(rising_edge(clk))then

q<=data;

endif;

endprocess;

end;

扫描码转换成ASCII码程序代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entityconvertis

port(scan:

instd_logic_vector(7downto0);

prepared:

instd_logic;

clr:

instd_logic;

rd:

instd_logic;

intr:

outstd_logic;

cs_2:

instd_logic;

data:

outstd_logic_vector(7downto0));

end;

architectureoneofconvertis

componentmydis

port(clk,data:

instd_logic;

q:

outstd_logic);

endcomponent;

signaltmp:

integerrange0to16#7F#;

--保存转换好的ASCII码的整数值

signalASCII:

std_logic_vector(7downto0);

--保存转换好的ASCII

signalkey_d:

std_logic:

='0';

signalshift_d:

std_logic:

='0';

signalcapslock_d:

std_logic:

='0';

signalkey:

std_logic:

='0';

signalshifted:

std_logic:

='0';

signalcapslocked:

std_logic:

='0';

begin

key_d<='1'whenscan=x"F0"--断码信号

else'0';

shift_d<='0'whenclr='0'

else

notshiftedwhen(scan=x"58"andscan=x"59")

--扫描码位58或59时shift键转换,进行大小写字母变换(0表小写,1表大写)

elseshifted;

capslock_d<='0'whenclr='0'

else

notcapslockedwhenscan=x"58"andkey='1'

elsecapslocked;--大小写字母控制键(0表小写,1表大写)

tmp<=

16#09#whenscan="00001101"else

16#60#whenscan="00001110"andshifted='0'else

16#7E#whenscan="00001110"andshifted='1'else

16#51#whenscan="00010101"else

16#31#whenscan="00010110"andshifted='0'else

16#21#whenscan="00010110"andshifted='1'else

16#5A#whenscan="00011010"else

16#53#whenscan="00011011"else

16#41#whenscan="00011100"else

16#57#whenscan="00011101"else

16#32#whenscan="00011110"andshifted='0'else

16#40#whenscan="00011110"andshifted='1'else

16#43#whenscan="00100001"else

16#58#whenscan="00100010"else

16#44#whenscan="00100011"else

16#45#whenscan="00100100"else

16#34#whenscan="00100101"andshifted='0'else

16#24#whenscan="00100101"andshifted='1'else

16#33#whenscan="00100110"andshifted='0'else

16#23#whenscan="00100110"andshifted='1'else

16#20#whenscan="00101001"else

16#56#whenscan="00101010"else

16#46#whenscan="00101011"else

16#54#whenscan="00101100"else

16#52#whenscan="00101101"else

16#35#whenscan="00101110"andshifted='0'else

16#25#whenscan="00101110"andshifted='1'else

16#4E#whenscan="00110001"else

16#42#whenscan="00110010"else

16#48#whenscan="00110011"else

16#47#whenscan="00110100"else

16#59#whenscan="00110101"else

16#36#whenscan="00110110"andshifted='0'else

16#5E#whenscan="00110110"andshifted='1'else

16#4D#whenscan="00111010"else

16#4A#whenscan="00111011"else

16#55#whenscan="00111100"else

16#37#whenscan="00111101"andshifted='0'else

16#26#whenscan="00111101"andshifted='1'else

16#38#whenscan="00111110"andshifted='0'else

16#2A#whenscan="00111110"andshifted='1'else

16#2C#whenscan="010000

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1