电子信息工程专业综合设计报告_第1页
电子信息工程专业综合设计报告_第2页
电子信息工程专业综合设计报告_第3页
电子信息工程专业综合设计报告_第4页
电子信息工程专业综合设计报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子信息工程专业综合设计(报告)(课程设计)题目基于FPGA的VGA图像汉字显示及PS/2键盘控制设计与应用二级学院专业班级学生姓名学号指导教师时间基于FPGA的VGA图像汉字显示及PS/2键盘控制设计与应用摘要:现在社会,以计算机技术为核心的信息技术迅速发展,以及信息的爆炸式增长,人类获得视觉信息的很大一部分是从各种各样的电子显示器件上获得的,对这些电子显示器件的要求也越来越高,在这些诸多因素的驱动下,显示技术也取得了飞速的发展。VGA(VideoGraphicsArray)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。使用FPGA设计的VGA显示控制器具有很高的灵活性,可以根据其不同的类型、尺寸、适用场合特别是不同的工业产品,做一些特殊的设计,以最小的代价满足系统的要求,而且可以解决通用的显示控制器本身固有的一些缺点。VGA(视频图形阵列)作为一种标准的显示接口得到广泛的应用。本文依据VGA显示原理,介绍了利用FPGA实现对VGA图形控制器VHDL设计及PS/2键盘与按键对显示图象控制的方法。详细描述了各硬件模块的工作原理及实现途径,并给出了软件设计思路及部分代码。关键词:VGA;FPGA;VHDL;PS/20.引言随着可编程逻辑器件的不断发展及其价格的不断下降,EDA开发软件的不断完善,可编程逻辑设计的应用优势逐渐显示出来,特别是大规模可编程器件。而FPGA具有功能强大,开发过程投资小、周期短等特点,成为当今硬件设计的首选方式之一。VGA(视频图形阵列)作为一种标准的显示接口得到广泛地应用。利用FPGA芯片和EDA设计方法,可以灵活地根据用户需求,设计出针对性强的VGA显示控制器,不仅降低了生产成本也可以快速地对产品进行升级换代。本文设计采用QuartusII9.0软件工具,并以Altera公司的Cyclone系列FPGA的器件EP1C12F324C8为主实现硬件平台的设计。1.方案设计及工作原理1.1VGA模块方案设计采用模块化设计方法,我们对VGA图形控制器按功能进行层次划分。本设计的VGA控制器主要由以下模块组成:VGA时序控制模块、ROM内存地址控制模块、ROM内存模块、按键扫描控制模块。如图1所示。图1.方案模块框图1.2工作原理VGA时序控制模块ROM内存地址控制模块ROM按键扫描控制模块50MHz5Hzaddrdata首坐标xx、yyVGA接口RGBHS、VSD/ACRT根据VGA的显示协议,可以选择不同的显示分辨率。本设计选择的是800*600的分辨率。根据相应协议,在“VGA时序控制模块”对行扫描信号HS和场扫描信号VS进行相应的时序控制(具体控制详细信息见“VGA驱动原理”资料文档)。“ROM内存地址控制模块”根据“按键扫描控制模块”获得的图片显示首坐标xx、yy信息和“VGA时序控制模块”传送过来的hcnt(列计数器值)、vcnt(行计数器值)及相关控制信号计算出正确的内存地址,从rom中取出所需要的像素点的三基色数据。1.3PS/2接口电路的工作原理PS/2协议和接口最初是IBM公司开发并推广使用的一种应用于键盘/鼠标的协议和接口,PS/2键盘按键接口是6芯的插头与PC机的键盘相连接,插头、插座定义如图所示。键盘/鼠标接口的数据线和时钟线采用集电极开路结构,平时都是高电平当这些设备等待发送数据时,它首先检查clock是否为高。如果为低,则认为PC抑制了通讯,此时它缓冲数据直到获得总线的控制权。如果clock为高电平,设备则开始向PC发送数据。一般都是由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内存地址的控制,实现了图片显示功能。以下通过一段关键代码详细讲解其实现原理。romaddr_control的计算原理:romaddr_control<=(vcnt(6downto0)-count_tempv(6downto0))&(hcnt(6downto0)-count_temph(6downto0));注:romaddr_control为从rom中取数据时所需要的地址,它对应着图片的没一个像素点的三基色数据;vcnt(5downto0)和hcnt(7downto0)分别表示取vcnt(9downto0)、hcnt(10downto0)的后6、后8个二进制位来做运算。count_tempv(5downto0)和count_temph(7downto0)同理可以理解其含义。Vcnt、hcnt实际上可以分别理解为屏幕显示的行和列计数器,count_tempv和count_temph可以分别理解为图片在屏幕上显示的起始行和列坐标。抛开以上等式,按照正常思路,我们可以得到图片控制地址:addr_control=(vcnt-count_tempv)*256+(hcnt–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&codeiswhenx"01D"=>o:=o+1;j:=0;--wwhenx"01B"=>o:=d-1;j:=0;--swhenx"01C"=>o:=0;j:=j-1;--awhenx"023"=>o:=0;j:=j+1;--d(其中O为图片纵坐标控制变量,J为横坐标控制变量)即可完成WASD对图片移动的控制。对应操作为:W:图片上移。S:图片下移。A:图片右移。D:图片左移。2.4按键控制模块按键控制采用的电平触发机制,1Hz左右的扫描频率,适合于人们的使用习惯。其中按键的功能里包括了:a.上下、左右的移动;b.移动中的加速减速停止启动;c.屏保模式自由移动和停止选择按钮。具体语句为if(clkm'eventandclkm='1')thenif(key1='0')thend:=d+1;e:=e+1;endif;if(key2='0')thend:=d-1;e:=e-1;endif;if(key3='0')thend:=d+1;e:=0;endif;if(key4='0')thend:=0;e:=e+1;endif;(其中D为图片纵坐标控制变量,E为横坐标控制变量)即可完成由开发板上的S1~S4按键对图片的控制。对应操作为:KEY1(S1):图片自动移动开始与加速。KEY2(S2):图片自动移动减速与停止。KEY3(S3):图片左移与加速。KEY4(S4):图片右移与加速。2.5.汉字显示模块本模块实现方法为对特定区域进行黑白两色点阵显示汉字。显示区域为屏幕94*16。点阵数据程序直接编写,不额外添加ROM存储。本模块设置了两个变量对显示区域横纵轴进行函数运算。即line1,Pixel:integerrange0to15;3.结果分析和调试因为模块较多,调试过程中出现中出现了不少问题。按预想情况,图片在触及屏幕边沿是反弹,实际情况是直接消失,一段时间后重新出现在初始位置开始运动。在进行思考测试后,发现是原来的由HITCASE代表图片撞击屏幕位置,然后编写CASE语句对XY进行改变的运算有所欠缺且十分复杂,难以寻找错误。后改用对图片坐标判断,然后进行XY运算后功能正常,同时使得程序更加简单易读。在测试图片显示的过程中,由于对VGA显示原理没有完全理解。出现了图片显示紊乱的错误。在对行场时序扫描部分查阅资料后,对程序语句进行了重新编写后,图片即显示正常。编写程序时,出现过模块无效的错误。检查后发现为自己对模块调用方法的陌生。查阅资料后在程序中加入了中间量进行中转后,实现了模块间的调用连接。测试中,出现过键盘无法正常识别弹起状态的错误。后检查发现并没有编写弹起标志位,加入FLAG变量与通码一起进行运算后成功解决。经过多次调试以及同学、老师的帮助下,解决了上诉遇到的问题,由于时间有限,实现初步功能,没有达到完美效果,基本符合本次设计要求。4.体会与感受在为期三周的课程设计中,进一步巩固了曾经所学的EDA相关知识,并且第一次了解学习了VGA相关原理。经过本次课程设计,对VHDL语言有了更进一步了解,也丰富了一个电子信息工程学生的专业知识,锻炼了动手能力和思辨能力。此次课程设计师对我们理论的一次大检验也是理论运用与实际的完美展现。5.参考文献[1]侯伯亨.VHDL硬件描述语言与数字逻辑电路设计[M].西安:西安电子科技大学出版社,1999.[2]李国洪、沈明山。可编程器件EDA技术与实践机械工业出版社,2004[3]赵世霞、杨丰、刘揭生。VHDL与微机接口设计北京:清华大学出版社2004[4]林敏.VHDL数字系统设计与高层次综合[M].北京:电子工业出版社,2001.[5]卢毅.VHDL与数字电路设计[M].北京:科学出版社,2001.[6]张琴.向先波.徐国率PS/2键盘在基于PIC单片机的远程多温度点巡检系统中的应用[期刊论文]-机械与电子2006(08)[7]苗新法.王秀隼PS/2键盘在嵌入式系统中的应用研究[期刊论文]-兰州交通大学学报2007(01)[8]徐晓.汪道辉标准PS/2键盘与单片机的接口设计[期刊论文]-中国测试技术2005(01)[9]、郑炜.须文波.胡晋单片机系统中PS/2键盘驱动程序设计[期刊论文]-单片机与嵌入式系统2005[10]北京理工大学ASIC研究所,《VHDL语言100例详解》,清华大学出版社,北京,1999:302-310[11]altera公司,datasheetofep1k30,美国,1999:40-1006.附录(程序、元件清单和制作效果)1、顶层文件IMG.VHDLIBRARYieee;--图象显示顶层程序USEieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYimgISport(clk50MHz,clk1,clk2 ,data:INSTD_LOGIC;key1,key2,key3,key4 :instd_logic;hs,vs :OUTSTD_LOGIC;r,g :OUTSTD_LOGIC;b :outSTD_LOGIC);ENDimg;ARCHITECTUREmodelstruOFimgIScomponentvga640480--VGA显示控制模块PORT(clk:INSTD_LOGIC;rgbin,rgbin1:INSTD_LOGIC_VECTOR(2downto0);hs,vs :OUTSTD_LOGIC;r,g,b:OUTSTD_LOGIC;hcntout,vcntout:OUTSTD_LOGIC_VECTOR(9downto0));endcomponent;componentkeyboard--VGA显示控制模块port(clk:instd_logic;--系统时钟输入kb_clk:instd_logic;--ps/2键盘时钟输入kb_data:instd_logic;--ps/2键盘数据输入keycode:outstd_logic_vector(7downto0);--ps/键盘键值输出flag:outstd_logic);endcomponent;componentimgrom--图象数据ROM,数据线12位;地址线14位PORT(clock:INSTD_LOGIC;address:INSTD_LOGIC_VECTOR(13downto0);q:OUTSTD_LOGIC_VECTOR(2downto0));endcomponent;componentrom2--图象数据ROM,数据线12位;地址线14位PORT(clock:INSTD_LOGIC;address:INSTD_LOGIC_VECTOR(13downto0);q:OUTSTD_LOGIC_VECTOR(2downto0));endcomponent;componentmid1port(clk:instd_logic;qin1:instd_logic_vector(2downto0);xx:instd_logic_vector(8downto0);yy:instd_logic_vector(8downto0);hcntin:instd_logic_vector(9downto0);vcntin:instd_logic_vector(9downto0);qout:outstd_logic_vector(2downto0);romaddr_control:outstd_logic_vector(13downto0));endcomponent;componentmidport(clk:instd_logic;qin:instd_logic_vector(2downto0);key1,key2,key3,key4 :instd_logic;hcntin:instd_logic_vector(9downto0);vcntin:instd_logic_vector(9downto0);qout:outstd_logic_vector(2downto0);code:instd_logic_vector(7downto0);flag:instd_logic;romaddr_control:outstd_logic_vector(13downto0));endcomponent;signalrgb:STD_LOGIC_VECTOR(2downto0);signalrgb1:STD_LOGIC_VECTOR(2downto0);signalrgb2:STD_LOGIC_VECTOR(2downto0);signalrgb3:STD_LOGIC_VECTOR(2downto0);signalclk25MHz:std_logic;signalclk1Hz:std_logic;signalromaddr:STD_LOGIC_VECTOR(13downto0);signalromaddr1:STD_LOGIC_VECTOR(13downto0);signalromaddr2:STD_LOGIC_VECTOR(13downto0);signalhpos,vpos:std_logic_vector(9downto0);signaltxx: std_logic_vector(8downto0);signaltyy: std_logic_vector(8downto0);signalcode1:std_logic_vector(7downto0);signalflag1:std_logic;BEGIN process(clk50MHz)beginifclk50MHz'eventandclk50MHz='1'thenclk25MHz<=notclk25MHz;endif;endprocess;i_vga640480:vga640480PORTMAP(clk=>clk25MHz,rgbin=>rgb1,rgbin1=>rgb3,hs=>hs,vs=>vs,r=>r,g=>g,b=>b,hcntout=>hpos,vcntout=>vpos);i_rom2:rom2PORTMAP(clock=>clk25MHz,address=>romaddr1,q=>rgb2);i_rom:imgromPORTMAP(clock=>clk25MHz,address=>romaddr,q=>rgb);i_mid:midPORTMAP(clk=>clk25MHz,qin=>rgb,hcntin=>hpos,vcntin=>vpos,qout=>rgb1,romaddr_control=>romaddr,code=>code1,flag=>flag1,key1=>key1,key2=>key2,key3=>key3,key4=>key4);i_mid1:mid1PORTMAP(clk=>clk25MHz,xx=>txx,yy=>tyy,qin1=>rgb2,hcntin=>hpos,vcntin=>vpos,qout=>rgb3,romaddr_control=>romaddr1);i_keyboard:keyboardportmap(clk=>clk50MHz,kb_clk=>clk2,kb_data=>data,keycode=>code1,flag=>flag1);end;2、VGA显示模块libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityvga640480isport(clk:inSTD_LOGIC;hs:outSTD_LOGIc;vs:outSTD_LOGIc;r:outSTD_LOGIC;g:outSTD_LOGIC;b:outSTD_LOGIC;rgbin,rgbin1:instd_logic_vector(2downto0);hcntout:outstd_logic_vector(9downto0);vcntout:outstd_logic_vector(9downto0));endvga640480;architectureONEofvga640480issignalhcnt:std_logic_vector(9downto0);signalvcnt:std_logic_vector(9downto0);begin--Assignpinhcntout<=hcnt;vcntout<=vcnt;--thisisHorizonalcounterprocess(clk)beginif(rising_edge(clk))thenif(hcnt<800)thenhcnt<=hcnt+1;elsehcnt<=(others=>'0');endif;endif;endprocess;--thisisVerticalcounterprocess(clk)beginif(rising_edge(clk))thenif(hcnt=640+8)thenif(vcnt<525)thenvcnt<=vcnt+1;elsevcnt<=(others=>'0');endif;endif;endif;endprocess;--thisishspulseprocess(clk)beginif(rising_edge(clk))thenif((hcnt>=640+8+8)and(hcnt<640+8+8+96))thenhs<='0';elsehs<='1';endif;endif;endprocess;--thisisvspulseprocess(vcnt)beginif((vcnt>=480+8+2)and(vcnt<480+8+2+2))thenvs<='0';elsevs<='1';endif;endprocess;process(clk)beginif(rising_edge(clk))thenif(hcnt<=640andvcnt<=480)thenr<=rgbin(2)orrgbin1(2);g<=rgbin(1)orrgbin1(1);b<=rgbin(0)orrgbin1(0);elser<='0';g<='0';b<='0';endif;endif;endprocess;endONE;3、ROM地址及图片运动控制模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitymidisport(clk:instd_logic;key1,key2,key3,key4 :instd_logic;qin:instd_logic_vector(2downto0);--xx:instd_logic_vector(9downto0);--yy:instd_logic_vector(8downto0);hcntin:instd_logic_vector(9downto0);vcntin:instd_logic_vector(9downto0);qout:outstd_logic_vector(2downto0);code:instd_logic_vector(7downto0);flag:instd_logic;romaddr_control:outstd_logic_vector(13downto0));endmid;architectureoneofmidissignalhcnt:std_logic_vector(9downto0);signalvcnt:std_logic_vector(9downto0);signalqout_temp:std_logic_vector(2downto0);--signalromaddr_temp:std_logic_vector(13downto0);signalcount_temph:std_logic_vector(9downto0);signalcount_tempv:std_logic_vector(9downto0);signal clk_count:std_logic_vector(24downto0);signaltx:std_logic_vector(9downto0);signalty:std_logic_vector(8downto0);signalm,t:std_logic;signal clkm: std_logic;--signaltempxx:integerrange0to640;--signaltempyy:integerrange0to480;constantwide:integer:=128;constantlong:integer:=128;begin--Assignpinhcnt<=hcntin;vcnt<=vcntin;qout<=qout_temp;romaddr_control<=(vcnt(6downto0)-count_tempv(6downto0)) &(hcnt(6downto0)-count_temph(6downto0)); process(clk)beginif(rising_edge(clk))then if((vcnt=ty)and(hcnt=tx))then count_temph<=hcnt; count_tempv<=vcnt;endif; if((vcnt<ty)or(vcnt>ty+long))thenqout_temp<="000"; elsif((hcnt>tx)and(hcnt<tx+wide))then-- qout_temp<=qin;---------inputlogo.hex else qout_temp<="000"; endif; ---------------- if((hcnt>tx)and(hcnt<tx+wide))then if((vcnt>ty-1)and(vcnt<ty+2))or((vcnt>ty+long-1)and(vcnt<ty+long+2)) thenqout_temp<="100"; endif; endif; if((vcnt>ty)and(vcnt<ty+long))then if((hcnt>tx-1)and(hcnt<tx+2))or((hcnt>tx+wide-2)and(hcnt<tx+wide+1)) thenqout_temp<="100"; endif; endif;--------------------------- endif; endprocess;div:process(clk) begin if(clk'eventandclk='1')then if(clk_count<"0")then clk_count<=clk_count+1; clkm<='0'; else clk_count<="1"; clkm<='1'; endif; endif; endprocess;------------------------move-------------process(clk)variabley:std_logic_vector(8downto0);variablez,d,e:integer;variableo,j:integerrange0to1:=0;variablex:std_logic_vector(9downto0);beginif(clkm'eventandclkm='1')thencase"000"&flag&codeiswhenx"01D"=>o:=o+1;j:=0;--w119whenx"01B"=>o:=d-1;j:=0;--s115whenx"01C"=>o:=0;j:=j-1;--a973whenx"023"=>o:=0;j:=j+1;--d100whenothers=>null;endcase;endif;if(clkm'eventandclkm='1')thenif(key1='0')thend:=d+1;e:=e+1;endif;if(key2='0')thend:=d-1;e:=e-1;endif;if(key3='0')thend:=d+1;e:=0;endif;if(key4='0')thend:=0;e:=e+1;endif;endif; if(rising_edge(clk))then z:=z+1; if(z>=111110)thenz:=0;if(m<='0')theny:=y+d;elsey:=y-d;endif;if(t<='0')thenx:=x+e;elsex:=x-e;endif;if(x>=640-wide)thent<='1';endif; if(x<=1)thent<='0';endif;if(y>=480-long)thenm<='1';endif;if(y<=1)thenm<='0';endif;endif; endif;tx<=x;ty<=y;endprocess;endone;4、键盘控制模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;----------------------------------------entitykeyboardisport(clk:instd_logic;--系统时钟输入kb_clk:instd_logic;--ps/2键盘时钟输入kb_data:instd_logic;--ps/2键盘数据输入keycode:outstd_logic_vector(7downto0);--ps/键盘键值输出flag:outstd_logic);endkeyboard;----------------------------------------architecturebehaveofkeyboardissignaldataerror:std_logic;--数据帧出错信号signalshiftdata:std_logic_vector(7downto0);signalkbcodereg:std_logic_vector(7downto0);signaldatacoming:std_logic;signalkbclkfall:std_logic;signalkbclkreg:std_logic;signalcnt:std_logic_vector(3downto0);signalparity:std_logic;signalflag1:std_logic;begin----------------------ps/2键盘时钟下降沿捕获进程---------------process(clk)beginif(clk'eventandclk='1')thenkbclkreg<=kb_clk;kbclkfal

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论