HDLPS2接口键盘课程设计.docx
- 文档编号:9834923
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:23
- 大小:510.24KB
HDLPS2接口键盘课程设计.docx
《HDLPS2接口键盘课程设计.docx》由会员分享,可在线阅读,更多相关《HDLPS2接口键盘课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
HDLPS2接口键盘课程设计
课程设计报告
题目HDL项目设计
摘要:
键盘是最常用人机接口设备之一,在嵌入式系统中有着相当广泛的应用。
一般自行设计的简易矩阵键盘仅仅是按行、列排列起来的矩阵开关。
当需要较多的按键时,则会占用较多的I/O端口,在软件上则要进行上电复位按键扫描及通信处理,而且还要加上按键的去抖动处理,增大了软硬件开销。
而PS/2键盘,内嵌自动去除按键抖动设计,自动地识别键的按下与释放,软硬件开发简便,价格便宜,稳定可靠,将PS/2键盘作为嵌入式系统的输入设备已经成为可行的方案。
本设计是以现场可编程逻辑器件(FPGA)为核心的PS/2接口键盘的输入识别电路。
利用QuartusⅡ软件编写verilogHDL硬件描述语言程序以实现键盘部分简单键值的识别与输出。
本设计主要以程序为核心,硬件电路的搭建使用FPGA实验箱,将程序顶层文件里定义的输入输出端口与实验箱管脚进行相应的配置,除实验箱上的reset键以外,外设是一个与实验箱通过PS/2接口相连的键盘。
当系统上电后,实验箱上的数码管可以依次显示从键盘上输入的键值,并具有数码管清零功能。
关键词:
Ps/2接口键盘、输入识别、FPGA、Quartus Ⅱ、VerilogHDL
Abstract
Thekeyboard,asoneofthemostcommonlyusedman-machineinterfaceequipment,hasawideapplicationinembeddedsystems.Generaltodesignsimplematrixkeyboardisonlyperrow,columnarrangementupmatrixswitch.Whenneedmorebutton,willoccupymoreI/Oport,insoftware,mustcarryonthepowerontheresetbuttonscanningandcommunicationprocessing,butalsoaddbuttonstojitterprocessing,increasesthesoftwareandhardwarecost.AndPS/2keyboard,inlineautomaticremovekeyjitterdesign,automaticallyidentifykeypressandrelease,softwareandhardwaredevelopmentissimple,cheap,stableandreliable,thePS/2keyboardasembeddedsysteminputdevicehasbecomefeasiblescheme.
Thisdesignbasedonfieldprogrammablelogicdevices(FPGA)isthecoreofthePS/2interfacekeyboardinputidentificationcircuit.UseverilogHDLQuartusⅡwritingsoftwarehardwaredescriptionlanguageprogramtorealizethekeyboardpartsimplekeyvalueoftherecognitionandoutput.Thisdesignmainlyprogramasthecore,theconstructionofthehardwarecircuitusingFPGAexperimentalbox,willbethetopproceduredefinedinthefileinput/outputportandexperimentalXiangGuanfootcarriesonthecorrespondingconfiguration,inadditiontotheexperimentboxontheresetbuttonbeyond,peripheralisaandexperimentalboxthroughthePS/2interfaceconnectedkeyboard.Whenthesystemispoweredon,experimentboxonthedigitaltubedisplaycaninturnfromthekeyboardinputkeyvalue,andhasthedigitaltuberesetfunction.
Keywords:
Ps/2interfacekeyboardinputidentificationFPGA,
QuartusⅡVerilogHDL
摘要2
一.系统设计5
1.1设计目标5
1.2方案对比与确定5
1.3总体设计框图及说明6
1.3.1总体设计框图6
1.3.2总体设计端口说明6
1.4模块电路设计及说明7
1.4.1键盘数据接收部分7
1.4.2数码管显示部分8
二.结果与讨论9
2.1调试步骤9
2.2调试现象9
2.3问题与分析9
三.软件设计10
3.1程序流程图10
3.2程序设计11
四.心得体会17
五.参考文献17
六.附录18
第一章 系统设计
1.1 系统设计目标
(1)以通用的PS2键盘为输入,设计一个能够识别PS2键盘输入编码的电路,并把键值通过数码管显示;
(2)至少能够识别0~9的数字键。
1.2方案对比分析与确定
方案一:
使用现场可编程逻辑器件(FPGA)制作,利用VerilogHDL硬件描述语言编程进行控制,然后下载至实验箱实现。
利用QuartusⅡ软件编写verilogHDL硬件描述语言程序以实现键盘部分简单键值的识别与输出。
硬件电路的搭建使用FPGA实验箱,将程序顶层文件里定义的输入输出端口与实验箱管脚进行相应的配置,除实验箱上的reset键以外,外设是一个与实验箱通过PS/2接口相连的键盘。
方案二:
采用单片机来实现键盘识别,它的原理方框图与用FPGA来实现的原理方框图类似,它由控制输入电路(及键盘)、C51单片机、数码管组成。
两者基本原理都相同,唯一不同的是一个是用单片机来实现,一个是用FPGA来制作。
采用单片机来实现PS/2接口键盘的输入识别电路,主要的核心是单片机程序的设计。
方案比较:
两个方案均可以实现PS/2接口键盘的输入识别电路的设计。
第一个方案采用的是现场可编程逻辑器件来实现, 它的优点是所有电路集成在一块板子上,无需外围连线,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度。
还可以用软件QuartusⅡ软件进行仿真和调试等。
可以充分利用HDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易.第二个方案有它的优点,但同时也存在缺点。
第二个方案中采用的是单片机来制作,对设计者的要求比较高,设计者对软硬件必须十分熟悉。
和方案一来比它的实验仿真没有方案一简单直观,调试也有一定的难度。
在外界环境相同的条件下,方案二设计出来的产品精度和稳定度要比方案一稍微差一些。
因此,PS/2接口键盘的输入识别电路的设计我们选择方案一来实现。
1.3 总体设计框图及说明
1.31总体设计框图:
1.31总体设计的端口说明:
设计分为两部分。
分别为键盘数据接收部分、数码管显示部分。
输入端:
时钟clk为系统时钟。
rst为复位按键低电平有效,clock和data_ps2为键盘的时钟端和数据端。
中间连线:
data[3:
0]为四位数据输出(已转化为十六进制),change为按键放开信号,back为Backspace按键信号。
输出端:
dataout[7:
0]为数码管数据端,led_com[3:
0]为数码管位选。
1.4模块电路设计及说明
1.41键盘数据接收部分
键盘PS/2的接口简介:
接口的六个脚中,只有四个脚有意义,分别是:
时钟脚、数据脚、电源脚、电源地。
其余为保留脚。
PS/2靠系统的PS/2端口提供+5V电源。
这里需要用到的即是:
时钟脚和数据脚。
这两个脚都是集电极开路,所以必须接大阻值的上拉电阻。
他们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。
PS/2设备的clock和data平时都是高电平。
当设备等待发送数据时,它首先检查clock是否为高。
如果为低,则认为PC抑制了通讯,此时它缓冲数据知道获得总线的控制权。
如果clock为高电平,PS/2设备则开始向PC发送数据。
一般都是PS/2设备产生市中心阿红。
发送按帧格式。
数据位在clock为高电平时准备好,在clock下降沿被PC读入。
数据从键盘/鼠标发送到主机或从主机发送到键盘/鼠标,时钟都是PS/2设备产生,主机对时钟控制有优先权,即主机想发送控制指令给PS/2设备时,可以拉低时钟线至少100us。
然后再下拉数据线,最后释放时钟线为高。
PS/2设备的时钟线和数据线都是集电极开路的,容易实现拉低电平。
其数据发送时序如下:
键盘发送时序
键盘接收时序
因为我们的功能只涉及到键盘的数据发送,所以对接收不做具体说明。
现在的PC机使用的PS/2键盘都默认采用第二套扫描码集,扫描码有两种不同的类型:
通码和断码。
当一个键被按下或持续按住时,键盘会将改键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机。
我们做的比较简单,因此只用到了第一类按键。
(返回值见附录)
第一类按键:
通码为1字节,断码为0xF0+通码形式。
如1键,其通码为0x16,断码为0xF00x1C.
在具体的实验过程中,PS/2键盘通过Clock管脚来控制通信方向并且充当本次实验的一个时钟管脚,在键盘时钟下,数据段进行收发数据,本次实验只是使用它来发送数据,未设计键盘接收数据。
每按下一个键,data管脚发送一个数据帧,具体格式如下:
PS/2键盘扫描码
1个起始位
总是逻辑0
8个数据位
(LSB)低位在前
1个奇偶校验位
奇检验
1个停止位
总是逻辑1
1个应答位
仅用在主机对设备的通讯中
此模块的功能说明:
当按下一个键时,FPGA在时钟信号下接受来自PS/2键盘的数据(8个数据位),接收完毕后锁存并转化为十六进制数据,例如4’ha。
当按键放开时,发出信号change。
这时开始识别按键,如果接收到8’d102,则表示接收到按键Backspace,则清空显示数据。
否则,数码管进行译码后则显示键盘的键值。
总体来说,此部分分为接收数据模块、数据判断与锁存模块、键值转化模块。
1.4.2数码管显示部分
此模块的功能说明:
这部分内容较简单,由于已经得到了键盘信息,在接收到change信号后,且十六进制数据不是8’d102时(即不是Backspace清零信号),则根据数字对应的通码反过来找数字,经过8段数码管的译码后显示键盘键值。
可显示的键值有:
0~9,a~f。
此部分总体分为数据接收模块、分频模块、位选信号模块、译码模块。
之所以有分频主要是为了提供数码管动态扫描的扫描频率,频率要适中。
否则数码管不能正常工作。
第二章 实验结果与讨论
2.1调试步骤
1、运行Quartus II软件,新建工程和命名顶层文件。
2、建立3个文本文件VerilogHDLFile。
分别为ps2_data_takein.v,Nixietube_display.v,top.v。
在文件中写入程序。
保存,编译。
3、分配管脚。
保存,编译。
4、先下载简单的程序,已确定实验箱可用。
5、之后将生成的.sof文件下载至FPGA实验箱中。
6、在键盘上一次输入0~9,a~f。
观察数码管显示的数据是否与键盘的输入键值相同。
7、若不相同或不完全相同,则分模块调试。
2.2调试现象
1、分别输入0~9和a~f,数码管上均能正确显示
2、输入Backspace,则清空数码管上的数据。
3、输入其他的键值,数码管不显示。
2.3问题分析
调试过程中出现的问题分析:
1.生成不了.sof文件,编译错误。
分析:
工程名、顶层文件名、模块名的关系未理清。
当初建工程时所写的顶层文件必须与后面的建立的顶层文件同名。
2.数码管显示不稳定;分析:
扫描频率没选定正确。
3. 数码管显示不正确;分析:
管脚配置不正确导致数码管显示异常。
4. 重新分配管脚后,结果未变;分析:
重新配置管脚后,未运行程序,使得下载进去的仍为原先的程序。
第三章软件设计
3.1程序流程图:
3.2程序设计
键盘数据接收模块:
moduleps2_data_takein(rst,clk,ps2_clk,data_ps2,data,change,back);
inputrst;
inputclk;
inputps2_clk;
inputdata_ps2;
output[3:
0]data;
outputchange;
outputback;
regps2_clk0,ps2_clk1,ps2_clk2;
wireneg_ps2_clk;
reg[3:
0]data;
wirechange;//读数信号
reg[3:
0]num;
reg[7:
0]temp_data;
reg[7:
0]temp;//锁存
regback;
regkey_f0;//松键标志,置1表示接收到8‘hf0,再接收到下一个数据后清零
always@(posedgeclkornegedgerst)
if(!
rst)
begin
ps2_clk0<=1'b0;
ps2_clk1<=1'b0;
ps2_clk2<=1'b0;
end
else
begin
ps2_clk0<=ps2_clk;
ps2_clk1<=ps2_clk0;
ps2_clk2<=ps2_clk1;
end
assignneg_ps2_clk=ps2_clk2&~ps2_clk1;
always@(negedgeclkornegedgerst)begin//接收数据模块
if(!
rst)begin
num<=4'd0;
temp_data<=8'd0;
end
elseif(neg_ps2_clk)begin//检测到clk为低
case(num)
4'd0:
begin
if(data_ps2==0)num<=num+1'b1;
elsenum<=4'd0;//起始位检测
end
4'd1:
begin
num<=num+1'b1;
temp_data[0]<=data_ps2;//bit0
end
4'd2:
begin
num<=num+1'b1;
temp_data[1]<=data_ps2;//bit1
end
4'd3:
begin
num<=num+1'b1;
temp_data[2]<=data_ps2;//bit2
end
4'd4:
begin
num<=num+1'b1;
temp_data[3]<=data_ps2;//bit3
end
4'd5:
begin
num<=num+1'b1;
temp_data[4]<=data_ps2;//bit4
end
4'd6:
begin
num<=num+1'b1;
temp_data[5]<=data_ps2;//bit5
end
4'd7:
begin
num<=num+1'b1;
temp_data[6]<=data_ps2;//bit6
end
4'd8:
begin
num<=num+1'b1;
temp_data[7]<=data_ps2;//bit7
end
4'd9:
begin
num<=num+1'b1;//奇偶校验位,不作处理
end
4'd10:
begin
num<=4'd0;//num清零
end
default;
endcase
end
end
always@(posedgeclkornegedgerst)begin//数据判断与锁存
if(!
rst)begin
key_f0<=1'b0;
temp<=8'd0;
end
elseif(num==4'd10)begin//刚传送完一个字节数据
if(temp_data==8'hf0)begin//有键放开,断码出现
key_f0<=1'b1;
back<=1'b0;//清空位置低
end
else
begin
if(temp_data==8'd102)begin//返回
back<=1'b1;//清空位置高
end
elsebegin
key_f0<=1'b0;
temp<=temp_data;//锁存当前键值
end
end
end
end
always@(posedgekey_f0ornegedgerst)begin
if(!
rst)begin
data<=4'd0;
end
elsebegin
case(temp)//键值转换为BCD码
8'd69:
data<=4'h0;
8'd22:
data<=4'h1;
8'd30:
data<=4'h2;
8'd38:
data<=4'h3;
8'd37:
data<=4'h4;
8'd46:
data<=4'h5;
8'd54:
data<=4'h6;
8'd61:
data<=4'h7;
8'd62:
data<=4'h8;
8'd70:
data<=4'h9;
8'd28:
data<=4'ha;
8'd50:
data<=4'hb;
8'd33:
data<=4'hc;
8'd35:
data<=4'hd;
8'd36:
data<=4'he;
8'd43:
data<=4'hf;
default:
;
endcase
end
end
assignchange=~key_f0;//取反确保正确赋值时钟
endmodule
数码管显示模块:
moduleNixietube_display
(clk,rst,data,dataout,ledcom,change,back);
inputclk;
inputrst;
inputchange;
input[3:
0]data;
inputback;
output[7:
0]dataout;
output[3:
0]ledcom;
reg[3:
0]ledcom;
reg[1:
0]comclk;
reg[3:
0]bcd_led;
reg[7:
0]dataout;
reg[15:
0]datareg;
reg[10:
0]c;
regclkin;
always@(posedgechangeornegedgerstorposedgeback)begin//数据接收
if(!
rst)
datareg<=16'b0;
elseif(back)
datareg<={16'b0};
else
datareg<={datareg[11:
0],data};//{datareg[11:
8],datareg[7:
4],datareg[3:
0],data};
end
always@(posedgeclk)begin//分频
if(c<11'd2000)
c<=c+11'd1;
elsebegin
c<=11'd0;
clkin=~clkin;
end
end
always@(posedgeclkinornegedgerst)begin//位选信号
if(!
rst)
comclk<=2'b0;
elsebegin
if(comclk==2'b11)begin
comclk<=2'b0;
end
elsebegin
comclk<=comclk+2'b01;
end
end
end
always@(comclk)begin//位选
if(comclk==2'b00)ledcom<=4'b1110;
elseif(comclk==2'b01)ledcom<=4'b1101;
elseif(comclk==2'b10)ledcom<=4'b1011;
elseledcom<=4'b0111;
end
always@(comclk)begin//数据选择
if(comclk==2'b00)bcd_led<=datareg[3:
0];
elseif(comclk==2'b01)bcd_led<=datareg[7:
4];
elseif(comclk==2'b10)bcd_led<=datareg[11:
8];
elsebcd_led<=datareg[15:
12];
end
always@(bcd_ledorrst)begin//译码
if(!
rst)begin
dataout<=8'hff;
end
elsebegin
case(bcd_led)
4'b0000:
dataout<=8'b11000000;//0
4'b0001:
dataout<=8'b11111001;//1
4'b0010:
dataout<=8'b10100100;//2
4'b0011:
dataout<=8'b10110000;//3
4'b0100:
dataout<=8'b10011001;//4
4'b0101:
dataout<=8'b10010010;//5
4'b0110:
dataout<=8'b10000011;//6
4'b0111:
dataout<=8'b11111000;//7
4'b1000:
dataout<=8'b10000000;//8
4'b1001:
dataout<=8'b10011000;//9
4'b1010:
dataout<=8'b10001000;//a
4'b1011:
dataout<=8'b10000011;//b
4'b1100:
dataout<=8'b10100111;//c
4'b1101:
dataout<=8'b1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HDLPS2 接口 键盘 课程设计