华科 基于FPGA的VGA显示实验.docx

上传人:b****2 文档编号:2412073 上传时间:2023-05-03 格式:DOCX 页数:19 大小:47.28KB
下载 相关 举报
华科 基于FPGA的VGA显示实验.docx_第1页
第1页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第2页
第2页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第3页
第3页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第4页
第4页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第5页
第5页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第6页
第6页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第7页
第7页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第8页
第8页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第9页
第9页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第10页
第10页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第11页
第11页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第12页
第12页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第13页
第13页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第14页
第14页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第15页
第15页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第16页
第16页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第17页
第17页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第18页
第18页 / 共19页
华科 基于FPGA的VGA显示实验.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

华科 基于FPGA的VGA显示实验.docx

《华科 基于FPGA的VGA显示实验.docx》由会员分享,可在线阅读,更多相关《华科 基于FPGA的VGA显示实验.docx(19页珍藏版)》请在冰点文库上搜索。

华科 基于FPGA的VGA显示实验.docx

华科基于FPGA的VGA显示实验

 

电子线路测试与实验报告

 

基于FPGA的VGA显示实验

 

姓名:

专业班级:

光电1208

学号:

U2012

 

一、实验要求

功能要求:

利用Basys2实验板实现图片在VGA接口显示器上的显示。

基本要求:

1)实现240*160以上像素的图片在VGA接口显示器上的显示;

2)利用算法实现特定图片在VGA接口显示器上的放大、缩小旋转及其他动作的自动变换。

二、实验具体目标

1.首先实现特定图片在显示器上的显示;

2.图片自动旋转90度;

3.实现图片的放大与缩小,同样通过一个按键实现;

4.添加复位键,按下复位键后图片返回最初的状态。

三、实验原理

1.VGA的显示原理

在基于FPGA的VGA控制中,只需考虑行同步信号(HS),场同步信号(VS),以及红绿蓝三基色(R、G、B)这五个信号,即可实现对VGA显示的控制。

2.对图片的旋转与缩放操作

对图片的旋转操作在本质上是对IP核ROM的输入地址addr进行变换的过程。

在这里,假定显示的坐标分别为x_vdn以及y_vdn,由于图片是160*40的,在正常的显示时,addr与x_vdn以及y_vdn的对应关系应该为:

addr=x_vdn+y_vdn*160

即依次取像素点,图片正常显示。

要把图片顺时针旋转90度,那么相当于显示的图片是40*160的,重新考虑addr与两个坐标之间映射关系。

容易得到,此时:

addr=(39-x_vdn)*160+y_vd

对图片的缩放操作

对图片的缩放操作则只考虑以下两种变化,即放大一倍,此时图片的大小为320*80;缩小一倍,此时图片的大小为80*20。

对于图片的放大一倍,则要考虑不同的像素点对显示信号的共用(在这里即为m信号)。

由通常的规则,按照顺序,构成一个正方形的每四个相邻的像素点共用一个m信号。

同时,在这里对x_vdn以及y_vdn的最后一位判断,并且形成不同的映射规则。

具体的映射规则在源代码中给出。

对于图片的缩小,则相对简单的多。

此时的映射关系为:

addr=y_vdn*320+x_vdn*2;

3.工程结构与解读

如图,下图为系统的结构框图。

 

 

 

各模块之间的关系为:

__________top.v工程顶层模块

|

|______clkdiv.v时钟分频

|

|______my_vga.v同步信号模块

|

|______rom.xco像素数据

|

|______vga_stripes.vvga显示

说明:

顶层模块只是对各模块的调用;时钟分频是用于产生25MHz的扫描信号;同步信号用来产生相应的VGA显示控制信号;rom.xco是IP核,用来存放、输出要显示图片的数据信息。

最后一个模块则是显示模块,同时包括对图片的相关变换。

各模块的详细说明会在下文中给出。

四、源码清单

1.顶层模块(top.v)

moduletop(zoom,turn,clk,clr,hs,vs,red,green,blue

);

inputzoom;//缩放信号

inputturn;//模式改变信号

inputclk;//时钟信号

inputclr;//复位信号

outpuths,vs;//水平和垂直输出

output[2:

0]red,green;//红绿蓝三色输出

output[1:

0]blue;

 

wireclk25;

wire[9:

0]hc,vc;

wirevidon;

wire[27:

0]cntdyn;

wire[7:

0]m;

wire[12:

0]addr;

 

clkdivu1(

.mclk(clk),

.clr(clr),

.clk25(clk25)

);//u1为2分频程序,使时钟信号为25MHz

my_vgau2(

.clk(clk25),

.clr(clr),

.hs(hs),

.vs(vs),

.hc(hc),

.vc(vc),

.vidon(vidon),

.cntdyn(cntdyn)

);//u2为160*40VGA图像显示程序

//----160*40-----xilinx------

romu3(

.clka(clk25),//inputclka

.addra(addr),//input[12:

0]addra

.douta(m)//output[7:

0]douta

);

//----160*40-----xilinx------u3为ROM的IP核,功能为存储、输出图片

 

vga_stripesu4(

.clr(clr),

.zoom(zoom),

.turn(turn),

.vidon(vidon),

.m(m),

.hc(hc),

.vc(vc),

.red(red),

.green(green),

.blue(blue),

.cntdyn(cntdyn),

.addr(addr)

);//u4对图像的显示进行各种操作

endmodule

说明:

顶层模块比较简单,只是对各分模块的调用。

2.时钟分频模块(clkdiv.v)

信号

模式

描述

mclk

Input

主时钟输入

clr

Input

复位键

clk25

output

输出25MHz时钟

moduleclkdiv(mclk,clr,clk25);//对时钟信号进行二分频

inputmclk,clr;

outputclk25;

reg[1:

0]q;

assignclk25=q[0];//25Mhz

always@(posedgemclkorposedgeclr)

if(clr)

q<=0;

else

q<=q+1;

endmodule//实现25MHz的频率

3.控制信号模块(my_vga.v)

信号

模式

描述

clr

Input

复位

clk

Input

主时钟25MHz

hc[9:

0]

Output

行计数

vc[9:

0]

Output

场计数

cntdyn[27:

0]

Output

vga控制计数

vidon

Output

vidon可见信号

modulemy_vga(clk,clr,hs,vs,hc,vc,vidon,cntdyn

);

inputclk,clr;

outputreghs,vs;

outputreg[9:

0]hc,vc;

outputregvidon;

outputreg[27:

0]cntdyn;

parameterhpixels=10'b1100100000;//800

parametervlines=10'b1000001001;//521

parameterhbp=10'b0010010000;//144

parameterhfp=10'b1100010000;//784

parametervbp=10'b0000011111;//31

parametervfp=10'b0111111111;//511

regvsenable;

always@(posedgeclkorposedgeclr)

begin

if(clr)

cntdyn<=0;

else

cntdyn<=cntdyn+1;

end

always@(posedgeclkorposedgeclr)

begin

if(clr)

hc<=0;

elsebegin

if(hc==hpixels-1)

begin

hc<=0;

vsenable<=1;

end

else

begin

hc<=hc+1;

vsenable<=0;

end

end

end

always@(*)

begin

if(hc<96)

hs=0;

else

hs=1;

end

always@(posedgeclkorposedgeclr)

begin

if(clr)

vc<=0;

else

if(vsenable==1)

begin

if(vc==vlines-1)

vc<=0;

else

vc<=vc+1;

end

end

always@(*)

begin

if(vc<2)

vs=0;

else

vs=1;

end

always@(*)

begin

if((hchbp)&&(vcvbp))

vidon=1;

else

vidon=0;

end

endmodule

4.IP核rom(rom.xco)

这是一个调用IP核的模块,该模块有两个输入,除了clka为时钟信号外,addra是一个地址信号,通过addra的控制来输出不同的m信号。

rom模块示意图:

 

5.vga显示模块(vga_stripes.v)

信号

模式

描述

m[7:

0]

Input

像素数据

zoom

Input

缩放信号

turn

Input

翻转信号

vidon

Input

vidon像素可见

hc

Input

行同步

vc

Input

场同步

red

Output

红色

green

Output

绿色

blue

Output

蓝色

cntdyn

Output

vga控制

addr[10:

0]

Output

地址

modulevga_stripes(clr,zom,turn,vidon,m,hc,vc,red,green,blue,cntdyn,addr

);

inputclr;

inputzoom;

inputturn;

input[7:

0]m;

inputvidon;

input[9:

0]hc,vc;

input[27:

0]cntdyn;

output[2:

0]red,green;

output[1:

0]blue;

output[12:

0]addr;//6400160*40

reg[7:

0]red_r;

reg[7:

0]green_r,blue_r;

regaddr;

reg[1:

0]mode;

reg[1:

0]set;

parameterhbp=10'b0010010000;//144

parametervbp=10'b0000011111;//31

reg[10:

0]y_vdn,x_vdn;

assignred=red_r[7:

5];

assigngreen=green_r[7:

5];

assignblue=blue_r[7:

6];

always@(*)

begin

y_vdn=vc-vbp;

x_vdn=hc-hbp;

end

always@(posedgeturnorposedgeclr)//选择模式

begin

if(clr)mode=0;//若复位,则选择模式0

elseif(turn)//若无复位,按键则模式加一

mode=mode+1;

end

always@(posedgezoomorposedgeclr)//当放大或复位信号处于上升沿时

beginif(clr)set=0;//若复位,大小设定选择0

elseif(zoom)//如果有放大信号

begin

if(set==2'b10)set=0;//若大小设定为2,则改为设定0,否则设定加一

elseset=set+1;

end

end

always@(*)//当有涉及到的变量改变时

if(vidon==1)

begin

if(set==2'b01)//设定1,显示320*80

begin

if(((x_vdn>=0)&&(x_vdn<=319)&&(y_vdn>=0)&&(y_vdn<=79)))//如果0<=x_vdn<=319且0<=y_vdn<=79

if((x_vdn[0]==0)&&(y_vdn[0]==0))addr=x_vdn/2+y_vdn*80;//起点为(0,0)时

elseif((x_vdn[0]==0)&&(y_vdn[0]==1))addr=x_vdn/2+(y_vdn-1)*80;//起点为(0,1)时

elseif((x_vdn[0]==1)&&(y_vdn[0]==0))addr=(x_vdn-1)/2+y_vdn*80;//起点为(1,0)时

elseaddr=(x_vdn-1)/2+(y_vdn-1)*80;//起点为(1,1)时

red_r<={m[7:

5],5'b00000};//显示

green_r<={m[4:

2],5'b00000};

blue_r<={m[1:

0],6'h00};

end

elsebegin//否则不显示

red_r<=0;

green_r<=0;

blue_r<=0;

end

end

elseif(set==2'b10)//设定2,显示80*20

begin

if((x_vdn>=0)&&(x_vdn<=79)&&(y_vdn>=0)&&(y_vdn<=19))//如果0<=x_vdn<=79且0<=y_vdn<=19,则显示

begin

addr=y_vdn*320+x_vdn*2;

red_r<={m[7:

5],5'b00000};

green_r<={m[4:

2],5'b00000};

blue_r<={m[1:

0],6'h00};

end

elsebegin

red_r<=0;

green_r<=0;

blue_r<=0;

end

end

elsebegin

case(mode[0])//模式选择

1'b0:

//为模式0时

if((x_vdn>=0)&&(x_vdn<=159)&&(y_vdn>=0)&&(y_vdn<=39))//显示160*40

begin//160*40200=144+55+1

addr=y_vdn*160+x_vdn;

red_r<={m[7:

5],5'b00000};

green_r<={m[4:

2],5'b00000};

blue_r<={m[1:

0],6'h00};

end

elsebegin//其他地方不显示

red_r<=0;

green_r<=0;

blue_r<=0;

end

1'b1:

//为模式1时

if(((x_vdn>=0)&&(x_vdn<=39)&&(y_vdn>=0)&&(y_vdn<=159)))//显示40*160

begin//160*40200=144+55+1

addr=(39-x_vdn)*160+y_vdn;

red_r<={m[7:

5],5'b00000};

green_r<={m[4:

2],5'b00000};

blue_r<={m[1:

0],6'h00};

end

elsebegin//其他地方不显示

red_r<=0;

green_r<=0;

blue_r<=0;

end

endcase

end

end

else//不显示

begin

red_r<=0;

green_r<=0;

blue_r<=0;

end

endmodule

说明:

相应的变量说明在表格中已经给出,有一点需要注意的是,在这里是先对zoom进行判断的,假如zoom为1,那就要对图片进行缩放处理。

只有在zoom为0的情况下,才会进行翻转的变换。

也就是说,这两个过程是有优先级的。

若要去掉这个优先级,代码会复杂一些。

同时,图片的放大只能对原图放大缩小,已经旋转的图片则不能。

6.引脚约束文件(top.ucf)

NET"clk"LOC=B8;

NET"clr"LOC=G12;

 

#Bank=2,Pinname=IO/D5,Type=DUAL,Schname=RED0

NET"red[0]"LOC=C14;

#Bank=2,Pinname=IO_L10N_2,Type=I/O,Schname=RED1

NET"red[1]"LOC=D13;

#Bank=2,Pinname=IO_L10P_2,Type=I/O,Schname=RED2

NET"red[2]"LOC=F13;

#Bank=2,Pinname=IO_L09N_2,Type=I/O,Schname=GRN0

NET"green[0]"LOC=F14;

#Bank=2,Pinname=IO_L09P_2,Type=I/O,Schname=GRN1

NET"green[1]"LOC=G13;

#Bank=2,Pinname=IO_L05N_2,Type=I/O,Schname=GRN2

NET"green[2]"LOC=G14;

#Bank=2,Pinname=IO/VREF_2,Type=VREF,Schname=BLU1

NET"blue[0]"LOC=H13;

#Bank=2,Pinname=IO_L03P_2/DOUT/BUSY,Type=DUAL,Schname=BLU2

NET"blue[1]"LOC=J13;

 

#Bank=2,Pinname=IO_L03N_2/MOSI/CSI_B,Type=DUAL,Schname=HSYNC

NET"hs"LOC=J14;

#Bank=2,Pinname=IO_L01P_2/CSO_B,Type=DUAL,Schname=VSYNC

NET"vs"LOC=K13;

 

NET"turn"LOC=A7;

#PlanAheadGeneratedphysicalconstraints

NET"zoom"LOC=M4;

说明:

处理相关的信号、颜色引脚按照手册来配置以外,clr、turn、zoom分别配置按键G12、A7、M4。

五、系统功能与测试结果

1.将bit下载到板子后,连接开发板和显示器的VGA接口,就能看到显示器上左上角显示该图片。

2.开发板上的A7键控制翻转,按一次图片会自动旋转90度,再按一次回复到原来的图形。

3.开发板上的M4键控制图片的放大与缩小,连续按键会让图片先放大一倍,再变为原图的缩小一倍,再回到原处。

4.在任何时刻按下G12键(即复位键),会回到原图的状态。

5.需要注意的是,在图片处于放大或者缩小的状态中,是不能对图片进行翻转操作的,但是在翻转的状态中则可以对图片进行缩放,但是缩放的也只是原图。

这是由程序中设计的优先级导致的。

6.测试结果:

可以完成上述功能,但是图片显示并不是很稳定。

六、心得体会与建议

1.这个实验是利用IP核来完成某项功能的,IP核是为开发人员提供便利的,但是怎么合理利用IP核、怎么创建其中有些细节需要去注意。

在这个实验中,重点并不是VGA显示,而是怎样利用IP核来显示特定的图片。

因为有范例,所以其中对各种参数的设置变得并不困难,各种参数的意义也更容易理解。

在了解VGA的基本原理后,就能比较快速地解决这个问题。

而利用matlab把图片转换为coe格式,再存入IPROM内由于有给出的程序,这一过程也变得并不复杂。

2.实际上实验结果还是有很多不足。

一个是做出来的图片像素要小于实验要求。

另一个存在的问题则是显示的图片不是特别稳定,扫描不太均匀,但是迫于时间原因并没有深究这个问题。

3.在设计旋转的过程中,可以看到输入rom模块的地址和屏幕显示坐标之间的映射关系是非常重要的。

假如只考虑90度的旋转,其实是可以很容易做出180度和270度的旋转的,但是其他的角度的话,映射规则会非常复杂,难以实现,故应该寻找其他跟好的算法。

4.心得体会:

这是一个非常好的锻炼机会,对于工科学生来说,重要的在于实践,在于

创造,在于自己主动地学习和创新,因此抓住这样的锻炼机会是对自己非常有好处的。

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2