- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于FPGAVGA图像显示与控制
基于FPGA的VGA图像显示与控制
课程要求:采用verilog语言,基于FPGA的VGA图像显示,即能够在显示器上实现动态彩色图像的显示。
VGA显示接口的理论分析:硬件采用CycloneII系列的EP2C20Q240C8N,它含有240个引脚。对于VGA的显示器遵循800*600@75模式,其中800是指每行中显示的像素的个数,而600是指屏幕每一列所包含的像素的个数。
VGA工业标准规定了具体地,在扫描过程中的时序图如下:
行扫描时序图
场扫描时序图
每场信号对应625个行周期,其中600行为图像显示行,每场有场同步信号,该脉冲宽度为3个行周期的负脉冲;每行显示行包括1056个点时钟,其中800点为有效显示区,每行有一个行同步信号的负脉冲,该脉冲宽度为80个点时钟。这样我们可以知道,行频为625*75=46857Hz。需要的点时钟的频率为:625*1056*75=49.5MHz约为50MHz。由上图可知,实际上在真正的实现过程中,每一行扫描所花的时间实际上比显示一行的像素所花的时间多了1056-800=256个像素点。同理,每一场的扫描时间多了625-600=25个行时间。
设计思路:
我们采用BmpToMif工具把BMP格式的图像转换为.mif文件。利用QuartusII7.2自带的MegaWizard Plug-In Manager产生一个ROM存储器,并用其来初始时.mif文件。即将图像文件写入到存储器里面。然后利用编程来控制图像的显示。
设计步骤:
工程创建:创建一个Project取名字为vga,在创建工程的向导中选着CycloneII系列的EP2C20Q240C8。
代码书写:新建一个Verilog HDL File编写程序代码如下:
`timescale 1ns/1ps
module tupian (clk,rst_n,hsync,vsync,vga_r,vga_g,vga_b,addr);
input clk,rst_n;
output hsync,vsync,vga_r,vga_g,vga_b;
reg hsync,vsync;
output [14:0] addr;
reg [14:0] addr;
reg [10:0] x_cnt; //行坐标
reg [9:0] y_cnt; //列坐标
parameter h_Ta=80,h_Tb=128,h_Tc=32,h_Td=800,h_Te=8,h_Tf=8,h_Tg=1056;
parameter v_Ta=3, v_Tb=14,v_Tc=7,v_Td=600,v_Te=0.8,v_Tf=0.2,v_Tg=625;
// 行场的计数
always @(posedge clk)
begin
if(x_cnt == h_Tg-1) x_cnt=0;
else x_cnt=x_cnt+1;
end
always @(posedge clk)
begin
if(y_cnt==v_Tg-1) y_cnt=0;
else if ( x_cnt == h_Tg-1 )
y_cnt=y_cnt+1;
end
//同步信号产生
always @(posedge clk)
begin
if(x_cnt=h_Ta-1) hsync=0;
else hsync=1;
end
always @(posedge clk)
begin
if(y_cnt = v_Ta -1) vsync = 0;
else vsync =1;
end
//有效显示区坐标
wire valid;
assign valid = (x_cnt = 11d187) (x_cnt = 11d987) (y_cnt = 10d31) (y_cnt = 10d631);
wire [9:0] xpos;
wire [9:0] ypos;
assign xpos = x_cnt-11d187;
assign ypos = y_cnt-10d31;
//显示图像
reg[27:0] k;
always @ (posedge clk )
begin
if(k
begin
if((ypos = 9d100 ypos = 9d229)(xpos = 10d65 xpos = 10d192))
addr = (ypos-100)*128 + (xpos-65);
文档评论(0)