华科基于FPGA的VGA显示实验.docx
- 文档编号:24105362
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:18
- 大小:109.40KB
华科基于FPGA的VGA显示实验.docx
《华科基于FPGA的VGA显示实验.docx》由会员分享,可在线阅读,更多相关《华科基于FPGA的VGA显示实验.docx(18页珍藏版)》请在冰豆网上搜索。
华科基于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.v
说明:
顶层模块只是对各模块的调用;时钟分频是用于产生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*40xilinxu3为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说明:
顶层模块比较简单,只是对各分模块的调用。
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;
endalways@(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
endalways@(*)
begin
if(hc<96)hs=0;
else
hs=1;
endalways@(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;
endalways@(*)
begin
if((hc
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
clr、turn、zoom分别配置按
NET"zoom"LOC=M4;
说明:
处理相关的信号、颜色引脚按照手册来配置以外,
键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.心得体会:
这是一个非常好的锻炼机会,对于工科学生来说,重要的在于实践,在于创造,在于自己主动地学习和创新,因此抓住这样的锻炼机会是对自己非常有好处的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA VGA 显示 实验