FPGA控制的PS2接口电路设计文档格式.docx
- 文档编号:21755591
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:25
- 大小:249.11KB
FPGA控制的PS2接口电路设计文档格式.docx
《FPGA控制的PS2接口电路设计文档格式.docx》由会员分享,可在线阅读,更多相关《FPGA控制的PS2接口电路设计文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
奇校验
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码时需要先去除一帧数据的起始位、校验位和停止位,即进行串并转换的只是其中的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<
cnt<
10,则start为1,否则为0,并将start的值赋给en。
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:
--系统时钟
k_clk:
--键盘时钟
k_data:
--数据
PA:
bufferstd_logic_vector(7downto0);
--扫描码输出
ZHJS:
outstd_logic--扫描码转换结束信号转换结束时置低
);
end;
architectureoneofkbis
signaltmp:
std_logic_vector(11downto0):
=(others=>
'
0'
);
--记录每一帧的数据
signalp_kbclk,c_kbclk:
std_logic;
signalen:
--输出使能
begin
process(rst,s_clk,k_clk)--得到键盘发送的有效数据扫描码
variablecnt:
integerrange0to11:
=0;
variablestart:
std_logic:
='
;
begin
ifrst='
thencnt:
ZHJS<
elsifrising_edge(s_clk)then
p_kbclk<
=c_kbclk;
c_kbclk<
=k_clk;
ifp_kbclk>
c_kbclkthentmp(cnt)<
=k_data;
ifcnt=10thenZHJS<
elseZHJS<
1'
endif;
ifcnt=11then
cnt:
=1;
elsecnt:
=cnt+1;
endif;
ifcnt>
=1andcnt<
10then
start:
elsestart:
endif;
en<
=start;
endprocess;
PA<
)whenen='
else
tmp(8downto1);
二、扫描码转换成ASCII码
D触发器源程序代码:
entitymydis
port(clk,data:
q:
outstd_logic);
end;
architectureoneofmydis
process(clk)
if(rising_edge(clk))then
q<
=data;
endif;
endprocess;
扫描码转换成ASCII码程序代码:
entityconvertis
port(scan:
instd_logic_vector(7downto0);
prepared:
clr:
rd:
intr:
outstd_logic;
cs_2:
data:
outstd_logic_vector(7downto0));
architectureoneofconvertis
componentmydis
endcomponent;
signaltmp:
integerrange0to16#7F#;
--保存转换好的ASCII码的整数值
signalASCII:
std_logic_vector(7downto0);
--保存转换好的ASCII
signalkey_d:
signalshift_d:
signalcapslock_d:
signalkey:
signalshifted:
signalcapslocked:
key_d<
whenscan=x"
F0"
--断码信号
else'
shift_d<
whenclr='
notshiftedwhen(scan=x"
58"
andscan=x"
59"
)
--扫描码位58或59时shift键转换,进行大小写字母变换(0表小写,1表大写)
elseshifted;
capslock_d<
notcapslockedwhenscan=x"
andkey='
elsecapslocked;
--大小写字母控制键(0表小写,1表大写)
tmp<
=
16#09#whenscan="
00001101"
16#60#whenscan="
00001110"
andshifted='
16#7E#whenscan="
16#51#whenscan="
00010101"
16#31#whenscan="
00010110"
16#21#whenscan="
16#5A#whenscan="
00011010"
16#53#whenscan="
00011011"
16#41#whenscan="
00011100"
16#57#whenscan="
00011101"
16#32#whenscan="
00011110"
16#40#whenscan="
16#43#whenscan="
00100001"
16#58#whenscan="
00100010"
16#44#whenscan="
00100011"
16#45#whenscan="
00100100"
16#34#whenscan="
00100101"
16#24#whenscan="
16#33#whenscan="
00100110"
16#23#whenscan="
16#20#whenscan="
00101001"
16#56#whenscan="
00101010"
16#46#whenscan="
00101011"
16#54#whenscan="
00101100"
16#52#whenscan="
00101101"
16#35#whenscan="
00101110"
16#25#whenscan="
16#4E#whenscan="
00110001"
16#42#whenscan="
00110010"
16#48#whenscan="
00110011"
16#47#whenscan="
00110100"
16#59#whenscan="
00110101"
16#36#whenscan="
00110110"
16#5E#whenscan="
16#4D#whenscan="
00111010"
16#4A#whenscan="
00111011"
16#55#whenscan="
00111100"
16#37#whenscan="
00111101"
16#26#whenscan="
16#38#whenscan="
00111110"
16#2A#whenscan="
16#2C#whenscan="
010000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 控制 PS2 接口 电路设计
![提示](https://static.bdocx.com/images/bang_tan.gif)