第1页,共21页实验报告课程名称:_____FPGA实验______指导老师:__竺红卫/陈宏__成绩:__________________实验名称:_______VGA显示的设计______实验类型:_FPGA实验_同组学生姓名:__一、实验目的1.熟悉显示器的显示原理;2.熟悉源代码,并在VGA显示器上观察结果。二、实验装置1.电脑一台;2.实验板一块;3.实验板电源一只;4.实验板连接电脑的下载线一根。三、实验原理通过DB15连接器输出一个VGA显示端口。该端口通过标准的监视电缆直接连到PC监视器或平板LCD上。如图6.1所示,VGA连接器在板上的最左端。FPGA通过串联电阻直接驱动5个VGA信号。每个颜色信号串一个电阻,每位的颜色信号分别是VGA_RED、VGA_BLUE、VGA_GREEN。每个电阻与终端的75欧电缆电阻相结合,确保颜色信号保持在VGA规定的0V~0.7V之间。VGA_HSYNC和VGA_VSYNC信号使用LVTTL或LVCMOS3I/O标准驱动电平。通过VGA_RED、VGA_BLUE、VGA_GREEN置高或低来产生8种颜色,VGA信号的时序由视频电气标准委员会(VESA)规定。以下提供的VGA系统和时序信息作为例子来说明FPGA在640×480模式下是如何驱动VGA监视器的。专业:__电子信息工程__姓名:_____陈华杰_____学号:______日期:___4月11日___地点:应电楼303桌号2组第2页,共21页四、操作方法和实验步骤对于程序的各个步骤,如新建项目、新建VerilogHDL、新建.ucf文件、Synthesize、ImplementDesign、GenerateProgrammingFile、ConfigureTargetDevice等等,在实验一中已经展示过,每一次实验的基本操作步骤都是差不多的,故这里不再重复阐述。程序下载成功后,关掉VGA显示屏的电源,拔下电脑端的连接线,接到开发板上,然后打开VGA显示屏开关。本次实验总共需要做两份程序并观察现象:1)例程。2)设计按键时,VGA的字体从上向下移动。五、实验源代码和现象1)例程UCF文件如下:NETclkLOC=C9;第3页,共21页NETrst_nLOC=L13;NETvga_b0LOC=G15;NETvga_g0LOC=H15;NETvga_hsLOC=F15;NETvga_r0LOC=H14;NETvga_vsLOC=F14;源代码如下:modulevga_VibesIC(clk,rst_n,vga_hs,vga_vs,vga_r0,vga_g0,vga_b0);inputclk;inputrst_n;outputvga_hs;outputvga_vs;outputvga_r0,vga_g0,vga_b0;wirehsync;wirevsync;wirevalid;wire[9:0]x_cnt;wire[9:0]y_cnt;wire[9:0]char_sel;wire[15:0]char;//设定屏幕分辨率:800x600wire[9:0]xpos;//[0...799]wire[9:0]ypos;//[0...599]regcolor;assignxpos=x_cnt-10'd180;//确定X轴像素位置assignypos=y_cnt-10'd35;//确定Y轴像素位置sync_gen_50msync_gen_50m_int(.clk(clk),.rst_n(rst_n),.hsync(hsync),.vsync(vsync),.valid(valid),.x_cnt(x_cnt),.y_cnt(y_cnt));wiretable0=((ypos10'd140&&ypos10'd460)&&(xpos10'd160&&xpos10'd640));wireline0=((ypos==10'd140||ypos==10'd460)&&(xpos10'd160&&xpos10'd640)||(xpos==10'd160||xpos==10'd640)&&(ypos10'd140&&ypos10'd460));wireword0=((xpos10'd204)&&(xpos10'd588)&&(ypos10'd96)&&(ypos10'd128));wireword=word0&&color;assignvga_r0=valid?(word?1'b1:(line0?1'b1:(table0?1'b0:1'b0))):1'b0;assignvga_g0=valid?(word?1'b0:(line0?1'b1:(table0?1'b0:1'b0))):1'b0;assignvga_b0=valid?(word?1'b0:(line0?1'b1:(table0?1'b0:1'b1))):1'b0;第4页,共21页assignvga_hs=hsync;assignvga_vs=vsync;assignchar_sel=xpos-10'd204;char_rom_VibesICchar_rom_VibesIC_inst(.addr({char_sel[9:5],ypos[4:1]}),//字符的Y轴由16pixel变为32pixel.data(char));always@(char_sel[4:1]orchar)begincase(char_sel[4:1])4'h0:color=char[15];4'h1:color=char[14];4'h2:color=char[13];4'h3:color=char[12];4'h4:color=char[11];4'h5:color=char[10];4'h6:color=char[9];4'h7:color=char[8];4'h8:color=char[7];4'h9:color=char[6];4'hA:color=char[5];4'hB:color=char[4];4'hC:color=char[3];4'hD:color=char[2];4'hE:color=char[1];4'hF:color=char[0];endcaseendendmodulemodulesync_gen_50m(clk,rst_n,hsync,vsync,valid,x_cnt,y_cnt);inputclk;inputrst_n;outputhsync;outputvsync;outputvalid;output[9:0]x_cnt;output[9:0]y_cnt;reghsync;regvsync;regvalid;reg[9:0]x_cnt;reg[9:0]y_cnt;//---------------------------------------------------------------------------第5页,共21页//两个Always中可以使用相同的判断条件//---------------------------------------------------------------------------always@(posedgeclkornegedgerst_n)if(!rst_n)x_cnt=10'd0;elseif(x_cnt==10'd1000)x_cnt=10'd0;elsex_cnt=x_cnt+1'b1;always@(posedgeclkornegedgerst_n)if(!rst_n)y_cnt=10'd0;elseif(y_cnt==10'd665)y_cnt=10'd0;elseif(x_cnt==10'd1000)y_cnt=y_cnt+1'b1;//---------------------------------------------------------------------------//hsync=x_cnt=10'd50;中第一个=为赋值语句,第二个=为比较语句//本代码的操作为:比较后再赋值。//---------------------------------------------------------------------------always@(posedgeclkornegedgerst_n)if(!rst_n)beginhsync=1'b0;vsync=1'b0;endelsebeginhsync=x_cnt=10'd50;//产生hsync信号vsync=y_cnt=10'd6;//产生vsync信号endalways@(posedgeclkornegedgerst_n)if(!rst_n)valid=1'b0;elsevalid=((x_cnt10'd180)&&(x_cnt10'd980)&&(y_cnt10'd35)&&(y_cnt10'd635));Endmodulemodulechar_rom_VibesIC(addr,data);//字模产生模块input[8:0]addr;output[15:0]data;reg[15:0]data;//Amemoryisimplemented//usingacasestatement第6页,共21页always@(addr)begincase(addr)9'h000:data=16'H0040;//威9'h001:data=16'H0050;9'h002:data=16'H0048;9'h003:data=16'H3FFC;9'h004:data=16'H2040;9'h005:data=16'H3F48;9'h006:data=16'H284C;9'h007:data=16'H2848;9'h008:data=16'H3F50;9'h009:data=16'H2930;9'h00a:data=16'H2920;9'h00b:data=16'H2620;9'h00c:data=16'H2552;9'h00d:data=16'H488A;9'h00e:data=16'H5304;9'h00f:data=16'H8000;9'h010:data=16'H0000;//百9'h011:data=16'HFFFE;9'h012:data=16'H0300;9'h013:data=16'H0200;9'h014:data=16'H1FF0;9'h015:data=16'H1010;9'h016:data=16'H1010;9'h017:data=16'H1010;9'h018:data=16'H1FF0;9'h019:data=16'H1010;9'h01a:data=16'H1010;9'h01b:data=16'H1010;9'h01c:data=16'H1010;9'h01d:data=16'H1010;9'h01e:data=16'H1FF0;9'h01f:data=16'H1010;9'h020:data=16'h0840;//仕9'h021:data=16'h0C40;9'h022:data=16'h1840;9'h023:data=16'h1040;9'h024:data=16'h3044;9'h025:data=16'h2FFE;9'h026:data=16'h6040;9'h027:data=16'hA040;9'h028:data=16'h2040;第7页,共21页9'h029:data=16'h2040;9'h02a:data=16'h2040;9'h02b:data=16'h2040;9'h02c:data=16'h2044;9'h02d:data=16'h2FFE;9'h02e:data=16'h2000;9'h02f:data=16'h0000;9'h030:data=16'h0000;//9'h031:data=16'h0000;9'h032: