ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:84.64KB ,
资源ID:4319567      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4319567.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(课程设计基于FPGA的VGA图像显示设计图像旋转放大单步步进移动和屏保移动.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

课程设计基于FPGA的VGA图像显示设计图像旋转放大单步步进移动和屏保移动.docx

1、课程设计基于FPGA的VGA图像显示设计图像旋转放大单步步进移动和屏保移动课程设计-基于FPGA的VGA图像显示设计(图像旋转、放大、单步步进移动和屏保移动) 电子信息工程专业综合设计(报告)(课 程 设 计)题目 基于FPGA的VGA图像显示设计 (图像旋转、放大、单步步进移动和屏保移动) 二级学院 电子信息与自动化学院 专 业 电子信息工程 班 级 学生姓名 学 号 指导教师 时 间 2011.12.26-2012.01.13 图1.方案模块框图1.2工作原理根据VGA的显示协议,可以选择不同的显示分辨率。本设计选择的是800*600的分辨率。根据相应协议,在“VGA时序控制模块”对行扫描

2、信号HS和场扫描信号VS进行相应的时序控制(具体控制详细信息见“VGA驱动原理”资料文档)。“ROM内存地址控制模块”根据“按键扫描控制模块”获得的图片显示首坐标xx、yy信息和“VGA时序控制模块”传送过来的hcnt(列计数器值)、vcnt(行计数器值)及相关控制信号计算出正确的内存地址,从rom中取出所需要的像素点的三基色数据。本设计的功能实现包括:图像旋转、放大、单步步进移动和屏保移动功能。其中图像的旋转运用了矩阵的转置原理,通过对图像的内存存储地址矩阵进行转置运算获得图像90旋转的效果。图像的放大是通过将包括原像素点在内,相邻的4个点填写相同的颜色来实现的。1模块设计及仿真2.1 VG

3、A时序控制模块 VGA 时序控制模块是整个显示控制器的关键部分,其实质就是完成 VGA 显示卡的功能。主要作用就是在一定的工作频率下,产生准确的时序关系(VS垂直同步信号,HS水平同步信号,消隐信号之间的关系)。及其在准确的时序下对ROM存储器数据进行读取。 其中产生准确的时序关系为此模块重点,在 VGA显示过程中,完成一行扫描所需要的时间称为水平扫描时间,完成一帧(一屏)扫描所需要的时间称为垂直扫描时间。每扫描完一行用行同步信号进行同步;扫描完所有行后用场同步信号进行同步。本文设计采用的是80060075Hz 模式。依据时序标准,每显示行包含 1056 点,其中 800 点为有效显示区,25

4、6 点为消隐区,每行的行同步脉冲低电平宽度为 80个像素点;同理每场有 625 行,有效行为 600 行,其中场同步脉冲低电平宽度为 3 行。其行、场时序如表 1 ,时序图见图2。表1 行扫描、场扫描时序FormatPixel Clock MHzHorizontal(in Pixels)Vertical(in lines)ActiveVideoFront PorchSync PulseBack PorchActive VideoFront PorchSync PulseBack Porch800,600,75Hz49.5080016801606001321 依照这个标准,正好与开发板EP1C1

5、2外部晶振频率50MHz相近,可以直接引用外部晶振时钟作为其驱动时钟(只要所用时钟和协议要求的时钟相差不大,不会影响显示效果,最多就是显示的刷新频率不是真正等于75Hz而已)。图2 行HS、场VS时序图2.2 ROM内存地址控制模块 整个显示思路是在800*600分辨率的显示器上开辟一256*64的显示区域来显示图片,因为显示的图片的大小为256*64。在此区域以外显示指定颜色,例如黑色、蓝色等,作为一个背景色显示。在本模块中,通过在对ROM内存地址的控制,实现了图片的旋转和一倍放大功能。以下通过一段关键代码详细讲解其实现原理。(1)首先分析无旋转状态下的romaddr_control的计算原

6、理:romaddr_control = (vcnt(5 downto 0)-count_tempv(5 downto 0) &(hcnt(7 downto 0)-count_temph(7 downto 0);注:romaddr_control为从rom中取数据时所需要的地址,它对应着图片的没一个像素点的三基色数据;vcnt(5 downto 0)和hcnt(7 downto 0)分别表示取vcnt(9 downto 0)、hcnt(10 downto 0)的后6、后8 个二进制位来做运算。count_tempv(5 downto 0)和count_temph(7 downto 0)同理可以理

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

8、比0旋转和90旋转图片在屏幕上显示所对应的内存地址矩阵图:0度显示对应内存地址矩阵:0*256+00*256+10*256+2540*256+2551*256+01*256+11*256+2541*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+2

9、5562*256+2551*256+2550*256+255 观察前后变化规律,可以看成是进行了矩阵的转置运算。根据矩阵的转制原理,我们可以根据0状态下romaddr_control的算法获得90状态下romaddr_control的算法。romaddr_control = (64-(hcnt(5 downto 0)-count_temph(5 downto 0) &(vcnt(7 downto 0)-count_tempv(7 downto 0); 同理可以计算出“10”、“11”状态下的地址控制表达式,即旋转到180和270状态的地址控制表达式。(3)实现一倍放大 实现一倍放大的基本思路为

10、将原来的像素点相邻的另外三个点填上同样的颜色,也就是一个地址对应屏幕上的四个像素位,从而实现放大的效果。这个比较容易实现,也比较容易想到,将原来的算法改为:romaddr_control = (hcnt(6 downto 1)-count_temph(6 downto 1) &(vcnt(8 downto 1)-count_tempv(8 downto 1);2.3 按键扫描控制模块 按键扫描控制采用的电平触发机制,5Hz左右的扫描频率,适合于人们的使用习惯。其中按键的功能里包括了:a.单步上下、左右的移动;b.放大和不放大两种模式的选择;c.顺时针90旋转按钮;d.屏保模式自由移动和停止选择

11、按钮。2.4 ROM内存模块 ROM内存中存储的是图片的依次行扫描三基色数据,作为显示时送给VGA显示器的RGB数据。本设计存储的是一幅256*64的图片,所以定义了一256*64=16384 byte的rom内存。2结果分析和调试 在调试过程中,我们遇到图片在靠近行和列的零边界线时,会出现整个图片突然消失的问题,而不是想象中的逐渐步入,逐渐消失。经过查阅资料,发现VHDL中没有能表示负数的数据类型,而在程序的运算过程中,有会出现负数的可能性,即在对图片初始坐标的减运算过程中,可能会将图片的起始坐标减成负数,使图片初始坐标变量进入未知状态,致使图片在屏幕上立即消失的。经过对程序的修改,排除了大

12、部分的漏洞,让图片显示基本能按设想显示,不排除还存在部分Bug的可能性。3体会和感受 经过本次课程设计,学到了很多VHDL的知识,比纯粹的理论教学课堂上学到的知识更多,更加深刻。实践教学方式对于我们工程运用专业是一个非常适合的教学方式,不仅锻炼了个人的动手能力,而且调动了学习的积极性,改变了我们的学习状态,是一种非常值得重视和推广的教学方式。4参考文献【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】5附录(程序和元件清单)(1)800*600VGA时序控制模块代码:-library IEEE; use IEEE.std_logic_1164.all; use IEEE.STD_L

13、OGIC_UNSIGNED.ALL; entity vga800600 is port ( clk : in STD_LOGIC; hs : out STD_LOGIc; vs : out STD_LOGIc; r : out STD_LOGIC_VECTOR(2 downto 0); g : out STD_LOGIC_VECTOR(2 downto 0); b : out STD_LOGIC_VECTOR(1 downto 0); rgbin : in std_logic_vector(7 downto 0); hcntout : out std_logic_vector(10 downt

14、o 0); vcntout : out std_logic_vector(9 downto 0); end vga800600; architecture ONE of vga800600 is signal hcnt : std_logic_vector(10 downto 0); signal vcnt : std_logic_vector(9 downto 0); begin hcntout = hcnt; vcntout = vcnt; process(clk) begin if (rising_edge(clk) then if(hcnt 1056) then hcnt = hcnt

15、 + 1; else hcnt 0); end if; end if; end process; -this is Vertical counter process(clk) begin if (rising_edge(clk) then if (hcnt = 800+8 ) then if(vcnt 625) then vcnt = vcnt + 1; else vcnt 0); end if; end if; end if; end process; -this is hs pulse process(clk) begin if (rising_edge(clk) then if(hcnt

16、=800+8+8)and (hcnt800+8+8+80 ) then hs = 0; else hs = 600+0+1) and (vcnt 600+0+1+3) then vs = 0; else vs = 1; end if; end process; process(clk) begin if (rising_edge(clk) then if (hcnt800 and vcnt600) then r(2 downto 0)=rgbin(7 downto 5); g(2 downto 0)=rgbin(4 downto 2); b(1 downto 0)=rgbin(1 downto

17、 0); else r=000; g=000; b=00; end if; end if; end process; end ONE;(2)rom内存地址控制模块代码:-library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity mid is port (clk : in std_logic;fangda_temp : in std_logic;mode : in std_logic_vector(1 downto 0);-key按键输入旋转90度信号,下降沿有效qin : in std_

18、logic_vector(7 downto 0); xx: in std_logic_vector(9 downto 0);yy: in std_logic_vector(9 downto 0);hcntin : in std_logic_vector(10 downto 0); vcntin : in std_logic_vector(9 downto 0);qout : out std_logic_vector(7 downto 0);romaddr_control : out std_logic_vector(13 downto 0); end mid;architecture one

19、of mid issignal xuanzhuanjiaodu: std_logic_vector(1 downto 0);signal hcnt : std_logic_vector(10 downto 0); signal vcnt : std_logic_vector(9 downto 0); signal qout_temp : std_logic_vector(7 downto 0);signal count_temph : std_logic_vector(9 downto 0);signal count_tempv : std_logic_vector(9 downto 0);s

20、ignal wide : integer range 0 to 1024;signal long : integer range 0 to 1024;begin- Assign pin hcnt = hcntin; vcnt = vcntin;qout = qout_temp;xuanzhuanjiaodu =mode;process( fangda_temp )beginif(fangda_temp=0) then wide =256; long =64;else wide =512; long if(fangda_temp = 0) then romaddr_control = (vcnt

21、(5 downto 0)-count_tempv(5 downto 0)-0 du &(hcnt(7 downto 0)-count_temph(7 downto 0); else romaddr_control if(fangda_temp = 0) then romaddr_control = (64-(hcnt(5 downto 0)-count_temph(5 downto 0)-90 du &(vcnt(7 downto 0)-count_tempv(7 downto 0); else romaddr_control if(fangda_temp = 0) then romaddr_

22、control = (64-(vcnt(5 downto 0)-count_tempv(5 downto 0)-180 du &(256-(hcnt(7 downto 0)-count_temph(7 downto 0); else romaddr_control if(fangda_temp = 0) then romaddr_control = (hcnt(5 downto 0)-count_temph(5 downto 0) -270 du &(256-(vcnt(7 downto 0)-count_tempv(7 downto 0); else romaddr_control = (h

23、cnt(6 downto 1)-count_temph(6 downto 1) -270 du &(256-(vcnt(8 downto 1)-count_tempv(8 downto 1); end if; end case;end process;process(xx,yy) begin if(vcnt = yy) and( hcnt=xx) )then count_temph=xx; count_tempv=yy; end if;if(xuanzhuanjiaodu =1 ) or (xuanzhuanjiaodu =3 ) then if(vcnt yy+wide) then qout

24、_tempxx)and(hcntxx + long) then qout_temp=qin;-input logo.hex else qout_temp=00000111;-cnt(31 downto 24); end if; else if(vcnt yy+long) then qout_temp=xx)and(hcnt=xx + wide) then qout_temp=qin;-input logo.hex else qout_temp=00000111;-cnt(31 downto 24); end if; end if; end process;end one;(4)按键控制模块(图

25、象显示顶层程序)LIBRARY ieee; -图象显示顶层程序 USE ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;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(2 downto 0);b : out STD_LOGIC_VECTOR(1 downto 0); END img; ARCHITE

26、CTURE modelstru OF img IS component vga800600 -VGA显示控制模块 PORT(clk : IN STD_LOGIC; rgbin : IN STD_LOGIC_VECTOR(7 downto 0); hs, vs : OUT STD_LOGIC;r, g: OUT STD_LOGIC_VECTOR(2 downto 0);b : OUT STD_LOGIC_VECTOR(1 downto 0);hcntout :OUT STD_LOGIC_VECTOR(10 downto 0);vcntout : OUT STD_LOGIC_VECTOR(9 downto 0) ); end component; component imgrom -图象数据ROM,数据线8位;地址线12位 PORT(clock : IN STD_LOGIC; address : IN STD_LOGIC_VECTOR(13 downto 0); q : OUT STD_LOGIC_VECTOR(7 downto 0) ); end component;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1