课程设计基于FPGA的VGA图像汉字显示及PS2键盘控制设Word下载.docx
《课程设计基于FPGA的VGA图像汉字显示及PS2键盘控制设Word下载.docx》由会员分享,可在线阅读,更多相关《课程设计基于FPGA的VGA图像汉字显示及PS2键盘控制设Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
一般都是由ps2设备产生时钟信号。
发送按帧格式。
数据位在clock为高电平时准备好,在clock下降沿被PC读入。
图3所示是按下Q键的时序图“Q”键的扫描码从键盘发送到计算机(通道A是时钟信号,通道B是数据信号)。
因本设计只需进行控制,所以PS/2模块并未设计转码功能。
2.模块设计及仿真
2.1VGA显示模块
图片想要在显示器上显示出来,它主要需要5个信号,行同步信号(HS)、场同步信号(VS)和RGB三基色信号。
VGA时序控制模块是须严格按照VGA时序标准产生相应的脉冲信号。
对这5个信号的时序驱动,VGA显示器要严格遵守“VGA工业标准”,即640*480*60Hz模式,否则会损坏VGA显示器。
VGA工业标准要求的频率是:
时钟频率为25.175MHz,行频为31469Hz,场频为59.94Hz。
图为行HS、场VS时序图
图行HS、场VS时序图
显示模块是整个显示控制器的重要组成部分,各个模块的输出数据都要经过模块处理后送到显示器。
显示模块在VGA显示控制器中起至关重要的作用。
显示模块的输出信号通过D/A转换器的转换连到VGA接口,它是控制器和显示器进行通信的桥梁。
该模块以可以VHDL语言实现。
2.2ROM内存地址控制模块
整个显示思路是在640*480分辨率的显示器上开辟一128*128的显示区域来显示图片,因为显示的图片的大小为128*128。
在此区域以外显示指定颜色,例如黑色、蓝色等,作为一个背景色显示。
在本模块中,通过在对ROM内存地址的控制,实现了图片显示功能。
以下通过一段关键代码详细讲解其实现原理。
2.2.1romaddr_control的计算原理:
romaddr_control<
=(vt(6downto0)-count_tempv(6downto0))&
(ht(6downto0)-count_temph(6downto0));
注:
romaddr_control为从rom中取数据时所需要的地址,它对应着图片的没一个像素点的三基色数据;
vt(5downto0)和ht(7downto0)分别表示取vt(9downto0)、ht(10downto0)的后6、后8个二进制位来做运算。
count_tempv(5downto0)和count_temph(7downto0)同理可以理解其含义。
Vt、ht实际上可以分别理解为屏幕显示的行和列计数器,count_tempv和count_temph可以分别理解为图片在屏幕上显示的起始行和列坐标。
抛开以上等式,按照正常思路,我们可以得到图片控制地址:
addr_control=(vt-count_tempv)*256+(ht–count_temph)通过分析整个mid.vhdl文件,会发现其实上面代码是该等式的高效等效实现。
2.2.2ROM内存模块
ROM内存中存储的是图片的依次行扫描三基色数据,作为显示时送给VGA显示器的RGB数据。
本设计存储的是一幅128*128的图片,所以定义了一输出为3位,大小为128*128=16384byte的rom内存。
2.3键盘控制模块
本模块主要实现由键盘上的WASD控制图片上下左右移动以及速度调节的功能。
因此仅仅只需要对键盘的按键进行通码读取并进行相应操作即可。
即由ROM内存地址控制模块读取键盘DATA端口数据。
然后由ROM内存地址控制模块产生相应操作。
在实际操作中,我加入了两个中间变量对数据进行处理。
即
code:
instd_logic_vector(7downto0);
flag:
instd_logic;
flag用于对键盘按下弹起进行判断以避免误操作。
Code用与对键盘DATA口数据进行传输以及函数运算。
(FLAG按下为0,弹起为1。
加入与运算实现功能)
具体语句为
case"
000"
&
flag&
codeis
whenx"
01D"
=>
o:
=o+1;
j:
=0;
--w
01B"
=d-1;
--s
01C"
=j-1;
--a
023"
=j+1;
--d
(其中O为图片纵坐标控制变量,J为横坐标控制变量)
即可完成WASD对图片移动的控制。
对应操作为:
W:
图片上移。
S:
图片下移。
A:
图片右移。
D:
图片左移。
2.4按键控制模块
按键控制采用的电平触发机制,1Hz左右的扫描频率,适合于人们的使用习惯。
其中按键的功能里包括了:
a.上下、左右的移动;
b.移动中的加速减速停止启动;
c.屏保模式自由移动和停止选择按钮。
具体语句为
if(clkm'
eventandclkm='
1'
)then
if(key1='
0'
)thend:
=d+1;
e:
=e+1;
endif;
if(key2='
=e-1;
if(key3='
if(key4='
(其中D为图片纵坐标控制变量,E为横坐标控制变量)
即可完成由开发板上的S1~S4按键对图片的控制。
KEY1(S1):
图片自动移动开始与加速。
KEY2(S2):
图片自动移动减速与停止。
KEY3(S3):
图片左移与加速。
KEY4(S4):
图片右移与加速。
2.5.汉字显示模块
本模块实现方法为对特定区域进行黑白两色点阵显示汉字。
显示区域为屏幕94*16。
点阵数据程序直接编写,不额外添加ROM存储。
本模块设置了两个变量对显示区域横纵轴进行函数运算。
即line1,Pixel:
integerrange0to15;
3.结果分析和调试
因为模块较多,调试过程中出现中出现了不少问题。
1、按预想情况,图片在触及屏幕边沿是反弹,实际情况是直接消失,一段时间后重新出现在初始位置开始运动。
在进行思考测试后,发现是原来的由HITCASE代表图片撞击屏幕位置,然后编写CASE语句对XY进行改变的运算有所欠缺且十分复杂,难以寻找错误。
后改用对图片坐标判断,然后进行XY运算后功能正常,同时使得程序更加简单易读。
2、在测试图片显示的过程中,由于对VGA显示原理没有完全理解。
出现了图片显示紊乱的错误。
在对行场时序扫描部分查阅资料后,对程序语句进行了重新编写后,图片即显示正常。
3、编写程序时,出现过模块无效的错误。
检查后发现为自己对模块调用方法的陌生。
查阅资料后在程序中加入了中间量进行中转后,实现了模块间的调用连接。
4、测试中,出现过键盘无法正常识别弹起状态的错误。
后检查发现并没有编写弹起标志位,加入FLAG变量与通码一起进行运算后成功解决。
经过多次调试以及同学、老师的帮助下,解决了上诉遇到的问题,由于时间有限,实现初步功能,没有达到完美效果,基本符合本次设计要求。
4.体会与感受
在为期三周的课程设计中,进一步巩固了曾经所学的EDA相关知识,并且第一次了解学习了VGA相关原理。
经过本次课程设计,对VHDL语言有了更进一步了解,也丰富了一个电子信息工程学生的专业知识,锻炼了动手能力和思辨能力。
此次课程设计师对我们理论的一次大检验也是理论运用与实际的完美展现。
6.附录(程序、元件清单和制作效果)
1、顶层文件IMG.VHD
LIBRARYieee;
--图象显示顶层程序
USEieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYimgIS
port
(clk50MHz,clk1,clk2,data:
INSTD_LOGIC;
key1,key2,key3,key4:
instd_logic;
hs,vs:
OUTSTD_LOGIC;
r,g:
b:
outSTD_LOGIC);
ENDimg;
ARCHITECTUREmodelstruOFimgIS
ponentvga640480--VGA显示控制模块
PORT(clk:
rgbin,rgbin1:
INSTD_LOGIC_VECTOR(2downto0);
hs,vs:
r,g,b:
htout,vtout:
OUTSTD_LOGIC_VECTOR(9downto0));
endponent;
ponentkeyboard--VGA显示控制模块
port(clk:
--系统时钟输入
kb_clk:
--ps/2键盘时钟输入
kb_data:
--ps/2键盘数据输入
keycode:
outstd_logic_vector(7downto0);
--ps/键盘键值输出
flag:
outstd_logic
);
ponentimgrom--图象数据ROM,数据线12位;
地址线14位
PORT(clock:
address:
INSTD_LOGIC_VECTOR(13downto0);
q:
OUTSTD_LOGIC_VECTOR(2downto0));
ponentrom2--图象数据ROM,数据线12位;
INSTD_LOGIC_VE