课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc

上传人:夺命阿水 文档编号:17883 上传时间:2022-07-01 格式:DOC 页数:12 大小:130.24KB
返回 下载 相关 举报
课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc_第1页
第1页 / 共12页
课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc_第2页
第2页 / 共12页
课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc_第3页
第3页 / 共12页
课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc_第4页
第4页 / 共12页
课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc》由会员分享,可在线阅读,更多相关《课程设计报告-基于FPGA的VGA图像显示设计图像旋转放大单步步进移动及屏保移动.doc(12页珍藏版)》请在课桌文档上搜索。

1、.基于FPGA的VGA图像显示设计及应用摘 要:VGA作为一种标准的显示接口得到广泛的应用。本文依据VGA显示原理,介绍了利用 FPGA 实现对VGA图形控制器VHDL设计方法。详细描述了各硬件模块的工作原理及实现途径,并给出了软件设计思路及部分代码。关键词:VGA;FPGA;VHDL0. 引言随着可编程逻辑器件的不断发展及其价格的不断下降,EDA 开发软件的不断完善,可编程逻辑设计的应用优势逐渐显示出来, 特别是大规模可编程器件。 而 FPGA 具有功能强大,开发过程投资小、周期短等特点,成为当今硬件设计的首选方式之一。VGA视频图形阵列作为一种标准的显示接口得到广泛地应用。利用 FPGA

2、芯片和 EDA设计方法,可以灵活地根据用户需求,设计出针对性强的 VGA 显示控制器,不仅降低了生产成本也可以快速地对产品进行升级换代。 本文设计采用 Quartus II 9.0软件工具,并以 Altera公司的 Cyclone 系列 FPGA 的器件EP1C12F324C8为主实现硬件平台的设计。1 方案设计及工作原理1.1方案设计VGA时序控制模块ROM内存地址控制模块ROM按键扫描控制模块50MHz5Hzaddrdata首坐标xx、yyVGA接口RGBHS、VSD/ACRT采用模块化设计方法,我们对 VGA 图形控制器按功能进行层次划分。本设计的VGA控制器主要由以下模块组成:VGA

3、时序控制模块、ROM内存地址控制模块、RO内存模块、按键扫描控制模块。如图 1 所示。图1.方案模块框图1.2工作原理根据VGA的显示协议,可以选择不同的显示分辨率。本设计选择的是800*600的分辨率。根据相应协议,在VGA时序控制模块对行扫描信号HS和场扫描信号VS进行相应的时序控制具体控制详细信息见VGA驱动原理资料文档。ROM内存地址控制模块根据按键扫描控制模块获得的图片显示首坐标xx、yy信息和VGA时序控制模块传送过来的hcnt、vcnt及相关控制信号计算出正确的内存地址,从rom中取出所需要的像素点的三基色数据。本设计的功能实现包括:图像旋转、放大、单步步进移动和屏保移动功能。其

4、中图像的旋转运用了矩阵的转置原理,通过对图像的内存存储地址矩阵进行转置运算获得图像90旋转的效果。图像的放大是通过将包括原像素点在内,相邻的4个点填写相同的颜色来实现的。2 模块设计及仿真2.1VGA时序控制模块VGA 时序控制模块是整个显示控制器的关键部分,其实质就是完成 VGA 显示卡的功能。主要作用就是在一定的工作频率下,产生准确的时序关系VS垂直同步信号,HS水平同步信号,消隐信号之间的关系。及其在准确的时序下对ROM存储器数据进行读取。 其中产生准确的时序关系为此模块重点,在 VGA显示过程中,完成一行扫描所需要的时间称为水平扫描时间,完成一帧一屏扫描所需要的时间称为垂直扫描时间。每

5、扫描完一行用行同步信号进行同步;扫描完所有行后用场同步信号进行同步。本文设计采用的是80060075Hz 模式。依据时序标准,每显示行包含 1056 点,其中 800 点为有效显示区,256 点为消隐区,每行的行同步脉冲低电平宽度为 80个像素点;同理每场有 625 行,有效行为 600 行,其中场同步脉冲低电平宽度为 3 行。其行、场时序如表 1 ,时序图见图2。表1 行扫描、场扫描时序FormatPixel Clock MHzHorizontalVerticalin linesActiveVideoFront PorchSync PulseBack PorchActive VideoFro

6、nt PorchSync PulseBack Porch800,600,75Hz49.5080016801606001321依照这个标准,正好与开发板EP1C12外部晶振频率50MHz相近,可以直接引用外部晶振时钟作为其驱动时钟只要所用时钟和协议要求的时钟相差不大,不会影响显示效果,最多就是显示的刷新频率不是真正等于75Hz而已。图2 行HS、场VS时序图2.2 ROM内存地址控制模块整个显示思路是在800*600分辨率的显示器上开辟一256*64的显示区域来显示图片,因为显示的图片的大小为256*64。在此区域以外显示指定颜色,例如黑色、蓝色等,作为一个背景色显示。在本模块中,通过在对ROM

7、内存地址的控制,实现了图片的旋转和一倍放大功能。以下通过一段关键代码详细讲解其实现原理。(1) 首先分析无旋转状态下的romaddr_control的计算原理:romaddr_control = vcnt-count_tempv &hcnt-count_temph;注:romaddr_control为从rom中取数据时所需要的地址,它对应着图片的没一个像素点的三基色数据;vcnt和hcnt分别表示取vcnt、hcnt的后6、后8 个二进制位来做运算。count_tempv和count_temph同理可以理解其含义。Vcnt、hcnt实际上可以分别理解为屏幕显示的行和列计数器,count_tem

8、pv和count_temph可以分别理解为图片在屏幕上显示的起始行和列坐标。抛开以上等式,按照正常思路,我们可以得到图片控制地址:addr_control= * 256 + 通过分析整个mid.vhdl文件,会发现其实上面代码是该等式的高效等效实现。(2) 从矩阵的角度分析90旋转的实现旋转的控制,将图片的显示分为4种状态,00表示0旋转,01表示90旋转,10表示180旋转,11表示270旋转。首先对比0旋转和90旋转图片在屏幕上显示所对应的内存地址矩阵图:0度显示对应内存地址矩阵:0*256+00*256+10*256+2540*256+2551*256+01*256+11*256+254

9、1*256+255.62*256+062*256+162*256+25462*256+25563*256+063*256+163*256+25463*256+25590度显示对应内存地址矩阵:63*256+062*256+01*256+00*256+063*256+162*256+11*256+10*256+1.63*256+25462*256+2541*256+2540*256+25463*256+25562*256+2551*256+2550*256+255观察前后变化规律,可以看成是进行了矩阵的转置运算。根据矩阵的转制原理,我们可以根据0状态下romaddr_control的算法获得90

10、状态下romaddr_control的算法。romaddr_control = 64-hcnt-count_temph &vcnt-count_tempv;同理可以计算出10、11状态下的地址控制表达式,即旋转到180和270状态的地址控制表达式。(3) 实现一倍放大实现一倍放大的基本思路为将原来的像素点相邻的另外三个点填上同样的颜色,也就是一个地址对应屏幕上的四个像素位,从而实现放大的效果。这个比较容易实现,也比较容易想到,将原来的算法改为:romaddr_control = hcnt-count_temph&vcnt-count_tempv;2.3 按键扫描控制模块按键扫描控制采用的电平触

11、发机制,5Hz左右的扫描频率,适合于人们的使用习惯。其中按键的功能里包括了:a.单步上下、左右的移动;b.放大和不放大两种模式的选择;c.顺时针90旋转按钮;d.屏保模式自由移动和停止选择按钮。2.4 ROM内存模块ROM内存中存储的是图片的依次行扫描三基色数据,作为显示时送给VGA显示器的RGB数据。本设计存储的是一幅256*64的图片,所以定义了一256*64=16384 byte的rom内存。3 结果分析和调试在调试过程中,我们遇到图片在靠近行和列的零边界线时,会出现整个图片突然消失的问题,而不是想象中的逐渐步入,逐渐消失。经过查阅资料,发现VHDL中没有能表示负数的数据类型,而在程序的

12、运算过程中,有会出现负数的可能性,即在对图片初始坐标的减运算过程中,可能会将图片的起始坐标减成负数,使图片初始坐标变量进入未知状态,致使图片在屏幕上立即消失的。经过对程序的修改,排除了大部分的漏洞,让图片显示基本能按设想显示,不排除还存在部分Bug的可能性。4 体会和感受经过本次课程设计,学到了很多VHDL的知识,比纯粹的理论教学课堂上学到的知识更多,更加深刻。实践教学方式对于我们工程运用专业是一个非常适合的教学方式,不仅锻炼了个人的动手能力,而且调动了学习的积极性,改变了我们的学习状态,是一种非常值得重视和推广的教学方式。5 参考文献123456789106 附录程序和元件清单1800*60

13、0VGA时序控制模块代码:-12 / 12.library IEEE; use IEEE.std_logic_1164.all; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity vga800600 is port clk : in STD_LOGIC; hs : out STD_LOGIc; vs : out STD_LOGIc; r : out STD_LOGIC_VECTOR; g : out STD_LOGIC_VECTOR; b : out STD_LOGIC_VECTOR; rgbin : in std_logic_vector; hcntout :

14、out std_logic_vector; vcntout : out std_logic_vector; end vga800600; architecture ONE of vga800600 is signal hcnt : std_logic_vector; signal vcnt : std_logic_vector; begin hcntout = hcnt; vcntout = vcnt; process begin if rising_edge then ifhcnt then hcnt = hcnt + 1; else hcnt = 0; end if; end if; en

15、d process; -this is Vertical counter process begin if rising_edge then if then ifvcnt then vcnt = vcnt + 1; else vcnt = 0; end if; end if; end if; end process; -this is hs pulse process begin if rising_edge then if=800+8+8and hcnt then hs = 0; else hs = 1; end if; end if; end process; -this is vs pu

16、lse process begin if = 600+0+1 and vcnt then vs = 0; else vs = 1; end if; end process; process begin if rising_edge then if hcnt800 and vcnt then r=rgbin; g=rgbin; b=rgbin; else r=000; g=000; b=00; end if; end if; end process; end ONE;.2rom内存地址控制模块代码:-.library ieee; use ieee.std_logic_1164.all; use

17、; entity mid is port clk : in std_logic;fangda_temp : in std_logic;mode : in std_logic_vector;-key按键输入旋转90度信号,下降沿有效qin : in std_logic_vector; xx: in std_logic_vector;yy: in std_logic_vector;hcntin : in std_logic_vector; vcntin : in std_logic_vector;qout : out std_logic_vector;romaddr_control : out s

18、td_logic_vector; end mid;architecture one of mid issignal xuanzhuanjiaodu: std_logic_vector;signal hcnt : std_logic_vector; signal vcnt : std_logic_vector; signal qout_temp : std_logic_vector;signal count_temph : std_logic_vector;signal count_tempv : std_logic_vector;signal wide : integer range 0 to

19、 1024;signal long : integer range 0 to 1024;begin- Assign pin hcnt = hcntin; vcnt = vcntin;qout = qout_temp;xuanzhuanjiaodu =mode;processbeginif then wide =256; long =64;else wide =512; long =128;end if;end process;processBEGINcase xuanzhuanjiaodu ISWHEN 00 = if thenromaddr_control = vcnt-count_temp

20、v-0 du &hcnt-count_temph; elseromaddr_control = vcnt-count_tempv-0 du &hcnt-count_temph; end if;WHEN 01 = if thenromaddr_control = 64-hcnt-count_temph-90 du &vcnt-count_tempv;elseromaddr_control = 64-hcnt-count_temph-90 du &vcnt-count_tempv;end if;WHEN 10 = if thenromaddr_control = 64-vcnt-count_tem

21、pv-180 du &256-hcnt-count_temph;elseromaddr_control = 64-vcnt-count_tempv-180 du &256-hcnt-count_temph;end if;WHEN OTHERS = if thenromaddr_control = hcnt-count_temph -270 du &256-vcnt-count_tempv;elseromaddr_control = hcnt-count_temph -270 du &256-vcnt-count_tempv;end if;end case;end process;process

22、 begin if and then count_temph=xx;count_tempv=yy;end if;if or thenifvcnt or yy+wide then qout_temp=00000111;-cnt;elsifxxandhcnt thenqout_temp=qin;-input logo.hexelseqout_temp=00000111;-cnt;end if;elseifvcnt or yy+long then qout_temp=00000111;-cnt;elsif=xxandhcnt thenqout_temp=qin;-input logo.hexelse

23、qout_temp=00000111;-cnt;end if;end if;end process;end one;.(4) 按键控制模块图象显示顶层程序.LIBRARY ieee; -图象显示顶层程序 USE ieee.std_logic_1164.all; use ;ENTITY img IS port clk50MHz : IN STD_LOGIC; key1,key2,key3,key4,key,s2,s3: in std_logic;hs, vs : OUT STD_LOGIC;r,g: OUT STD_LOGIC_VECTOR;b: out STD_LOGIC_VECTOR; EN

24、D img; ARCHITECTURE modelstru OF img IS component vga800600 -VGA显示控制模块 PORTclk : IN STD_LOGIC; rgbin : IN STD_LOGIC_VECTOR; hs, vs : OUT STD_LOGIC;r, g: OUT STD_LOGIC_VECTOR;b : OUT STD_LOGIC_VECTOR;hcntout :OUT STD_LOGIC_VECTOR;vcntout : OUT STD_LOGIC_VECTOR ; end component;component imgrom -图象数据RO

25、M,数据线8位;地址线12位 PORTclock : IN STD_LOGIC; address : IN STD_LOGIC_VECTOR; q : OUT STD_LOGIC_VECTOR ; end component;component midport clk : in std_logic;fangda_temp : in std_logic;mode : in std_logic_vector;qin : in std_logic_vector;xx: in std_logic_vector;yy: in std_logic_vector; hcntin : in std_logic

26、_vector; vcntin : in std_logic_vector;qout : out std_logic_vector;romaddr_control : out std_logic_vector; end component;signal rgb : STD_LOGIC_VECTOR; signal rgb1 : STD_LOGIC_VECTOR; signal clk25MHz : std_logic; signal clk1Hz : std_logic; signal romaddr : STD_LOGIC_VECTOR; signal hpos: std_logic_vec

27、tor;signal vpos : std_logic_vector;signal txx,tyy :std_logic_vector;signalclk_count: std_logic_vector;signalclkm:std_logic;signal key_mode : std_logic_vector;signal fangda,yidong : std_logic ;signal yidong_mode : std_logic_vector;signal yidong_y,yidong_x :std_logic;BEGIN-ARCHITECTURE begindiv: proce

28、ssbeginif thenifclk_countclk_count = clk_count + 1;clkm = 0;elseclk_count = 0000000000000000000000001;clkm = 1;end if;end if;end process;process-clkm的频率为2Hz,做按键扫描用variable ttxx :std_logic_vector :=0011000000; -192variable ttyy :std_logic_vector :=0011010000; -208beginifthenifthenttyy := ttyy+10; -ke

29、y1elsif thenif9then ttyy := ttyy-10;end if;-key2elsif thenttxx := ttxx+10;-key3elsif thenif9then ttxx := ttxx-10;end if;elsif then -keyifthen key_mode = 00;elsekey_mode=key_mode+1;end if;if thenif then ttyy:=ttyy+96;if=0then ttxx:=ttxx-96;else yidong_x=0; end if;elsif then ttxx:=ttxx+96;if=0then tty

30、y:=ttyy-96;else yidong_y=0;end if;elsif then ttyy:=ttyy+96;if=0then ttxx:=ttxx-96;else yidong_x=0; end if;else ttxx:=ttxx+96;if=0then ttyy:=ttyy-96;else yidong_y=0;end if;-ttyy:=0000000000;end if;elseif then ttyy:=ttyy+192;if=0then ttxx:=ttxx-192;else yidong_x=0;end if;elsif then ttxx:=ttxx+192;if=0

31、then ttyy:=ttyy-192;else yidong_y=0;end if;elsif then ttyy:=ttyy+192;if=0then ttxx:=ttxx-192;else yidong_x=0; end if;else ttxx:=ttxx+192;if=0then ttyy:=ttyy-192;else yidong_y=0;end if;end if;end if;elsif thenfangda = not fangda; -s2if then ttxx :=ttxx+128; ttyy :=ttyy+32;else ttxx :=ttxx-128; ttyy :

32、=ttyy-32;end if;elsif then yidong= not yidong;end if;if then if then ttxx:=ttxx+12;-yidong_X等于0,图片的首坐标做自增运算,否则做自减运算else ttxx:=ttxx-12;end if;if then ttyy:=ttyy+8;-yidong_y等于0,图片的首坐标做自增运算,否则做自减运算else ttyy:=ttyy-8;end if;ifttxx then yidong_x=0;end if;ifttyy then yidong_y=0;end if;if thencase key_mode

33、is when 00 =if=544 then yidong_x=1;end if;if=536 then yidong_yif=544 then yidong_x=1;end if;if=536 then yidong_yif=736 then yidong_x=1;end if;if=334 then yidong_yif=736 then yidong_x=1;end if;if=334 then yidong_yif=288 then yidong_x=1;end if;if=472 then yidong_yif=288 then yidong_x=1;end if;if=472 then yidong_yif=672 then yidong_x=1;end if;if=88 then yidong_yif=672 then yidong_x=1;end if;if=88 then yidong_y=1;end if;end case;end if;end if;end if;-一下为防出边界检验及相应矫正操作,因为当ttxx和ttyy因为一些随 -

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号