- 1、本文档共31页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北邮数电实验——PS2键盘
数字电路与逻辑设计实验报告
实验名称:PS2键盘接口设计
姓名:金小敏
学号:
班级:
2011年1月12日
一、实验任务
设计制作一个PS/2 键盘接口控制器。
(a)基本功能
按照PS/2 键盘接口标准设计一个控制器,接收PS/2 键盘发送的数据,用数码
管和8×8 点阵显示接收到的键值。
其中0~9 用数码管显示,A~Z用8×8 点阵显示,接收到其他键值则不显示。
(b)拓展功能
(i)实现显示汉字、符号:按F3显示汉字“中”、按F4显示汉字“国”、按F5显示心型符号;
(ii)实现音乐播放控制:按F1开始播放音乐、按F2停止播放音乐。
二、系统设计
(a)设计思路
系统总的分为输入输出两大部分。输入即为PS2键盘,输出有显示输出:8×8点阵、数码管,声音输出。
根据PS2的协议,PS2按键的输出包含扫描码和断码,本次实验只使用扫描码。将扫描码解码出来后,即可作为不同的判断条件来控制输出。
输出包括数码管显示、点阵显示和声音输出。将其设计为:0~9按键时只有数码管显示对应数字,点阵熄灭;A~Z时只有点阵显示,数码管熄灭;按F1时,开始播放音乐并且点阵显示音乐符号“?”;按F2时,停止播放音乐并且点阵熄灭;按F3时显示汉字“中”;按F4显示汉字“国”;按F5显示“?”。
程序设计为四大模块:解码模块、显示模块、分频模块、音乐模块。
(b)总体框图
(i)系统模块
键盘输入
(ii)状态转移图
(c)分块设计:
(1)PS2解码模块
①输入输出框图:
ret SCANCODE(8位)
p_clk
p_dat
ret:选择信号
p_clk:PS2键盘时钟信号
p_dat:PS2键盘数据信号
②原理及算法:
从键盘/鼠标发送到主机的数据在时钟信号的下降沿当时钟从高变到低的时候被读取从主机发送到键盘/鼠标的数据在上升沿当时钟从低变到高的时候被读取不管通讯的方向怎样键盘/鼠标总是产生时钟信号。一次数据组成为:1位起始位(总为0),8位数据位(低位在前),1位奇校验位,1位停止位(总为1)。
键盘接收数据的格式
1个起始位 总是逻辑0 8个数据位 (LSB)低位在前 1个奇偶校验位 奇校验 1个停止位 总是逻辑1 1个应答位 仅用在主机对设备的通讯中 col row a_to_g cat
ret
datain
clkshow
ret:选择信号
datain:数据输入(即解码后的数据)
clkshow:点阵扫描时钟
col:点阵行控制
row:点阵列控制
a_to_g:数码管段控制
cat: 数码管片选
②原理及算法简介:
由解码模块解码输出的8位数据及时PS2键盘的各个按键的扫描码,按照PS2协议中的关于各个按键的编码即可以对不同的按键进行区分,PS2有3套编码,但是第二套扫编码码最为常用,本次实验所用键盘是按第二套编码。
例如在第二套编码中,“A”的扫描码编码为1CH、“1”的扫描码编码为16H,所以在使用数码管显示0~9时,使用case-when语句即可。在使用点阵显示26个字母是,使用点阵进行扫描,设计原理如下图结构。
扫描显示26个字母与2个汉字以及2个符号,将他们的扫面数据存放在一个3维数组中,由于编码的量比较大,所以采用软件编码的办法,找了一款“字模”软件,来进行编码,其中的一些需要人工的修改一下。软件截图如下:
(3)分频模块
①输入输出框图:
showclk
clk
clk:时钟输出(50MHz)
showclk:分频输出(为8*8点阵扫描分频,音乐模块的多个分频在音乐模块内完成)
②原理及算法简介:
由于点阵显示不需要十分精确的分频,只要满足人的视觉暂留即可,所以采用如下的算法,相对来说比较高效,不需要通过一般地以计数来分频的算法,变该算法的分频为2的幂数分频。程序如下
process(clk)
variable count : std_logic_vector(19 downto 0):=X00000;
begin
if(rising_edge(clk))then
count:=count+1;
end if;
clkshow=count(10);
end process;
(4)音乐模块
①输入输出框图:
clk
beep
cs
clk:时钟输入(50M
文档评论(0)