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

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

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

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

华科基于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、GB)这五个信号,即可实现对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

I

|my_vga.v

I

|rom.xco

|

|vga_stripes.v

工程顶层模块

时钟分频

同步信号模块像素数据

vga显示

说明:

顶层模块只是对各模块的调用;时钟分频是用于产生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*40xilinx

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),

.hc(hc),

.vc(vc),

.red(red),

.green(green),

.blue(blue),

.cntdyn(cntdyn),

.addr(addr)

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

endmodule

说明:

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

moduleclkdiv(mclk,clr,clk25);〃

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

信号

模式

描述

mclk

Input

主时钟输入

clr

Input

复位键

clk25

output

输出25MHz时钟

对时钟信号进行二分频

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;//521parameterhbp=10'b0010010000;//144

parameterhfp=10'b1100010000;//784parametervbp=10'b0000011111;//31

parametervfp=10'b0111111111;//511regvsenable;

always@(posedgeclkorposedgeclr)begin

if(clr)

cntdyn<=0;

else

cntdyn<=cntdyn+1;

end

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

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;

endendmodule4.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

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=GRN0NET"green[0]"LOC=F14;

#Bank=2,Pinname=IO_L09P_2,Type=I/O,Schname=GRN1NET"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=BLU2NET"blue[1]"LOC=J13;

#Bank=2,Pinname=IO_L03N_2/MOSI/CSI_B,Type=DUAL,Schname=HSYNCNET"hs"LOC=J14;

#Bank=2,Pinname=IO_L01P_2/CSO_B,Type=DUAL,Schname=VSYNCNET"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