• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

VGA的问题

蓝蓝的天 2018-05-07 浏览量:920

我仿照特权同学的FPGA VGA历程写了一个VGA程序。

下到板子里,屏幕显示许多竖条,没有预期的小方块。

大神看看,是不是我纵坐标哪里搞错了?谢谢!

分辨率800*600,原来特权同学的分辨率是640*480

module VGA(
   clkrst_n   //系统控制
   hsyncvsync
   vga_rvga_gvga_b  //VGA控制 
   );
   
input clk;  //50M
input rst_n; //低电平复位
 //FPGA与VGA接口信号
output hsync;   //行同步信号
output vsync;   //场同步信号
output[2:0] vga_r;
output[2:0] vga_g;
output[1:0] vga_b;


//坐标计数
reg[10:0] x_cnt;  //行坐标
reg[9:0] y_cnt;  //列坐标


always @(posedge clk or negedge rst_n)
 if(!rst_n) x_cnt <= 11'd0;
 else if(x_cnt == 11'd1039) x_cnt <= 11'd0;
 else x_cnt <= x_cnt+1'b1;

always @(posedge clk or negedge rst_n)
 if(!rst_n) y_cnt <= 10'd0;
 else if(y_cnt == 10'd665) y_cnt <= 10'd0;
 else if(x_cnt == 11'd1039) y_cnt <= y_cnt+1'b1;

 //VGA场同步,行同步信号
reg hsync_rvsync_r;   //同步信号

always @(posedge clk or negedge rst_n)
 if(!rst_n) hsync_r <= 1'b1;
 else if(x_cnt == 11'd0) hsync_r <= 1'b0; //产生hsync信号
 else if(x_cnt == 11'd120) hsync_r <= 1'b1;
 
always @(posedge clk or negedge rst_n)
 if(!rst_n) vsync_r <= 1'b1;
 else if(y_cnt == 10'd0) vsync_r <= 1'b0; //产生vsync信号
 else if(y_cnt == 10'd6) vsync_r <= 1'b1;
 
assign hsync =hsync_r;
assign vsync = vsync_r;
  //有效显示标志位产生
reg valid_yr;  //行显示有效信号

always @(posedge clk or negedge rst_n)
 if(!rst_n) valid_yr <= 1'b0;
 else if(y_cnt == 10'd32) valid_yr <= 1'b1;
 else if(y_cnt == 10'd632) valid_yr <= 1'b0;

wire valid_y=valid_yr;
reg valid_r;
always @(posedge clk or negedge rst_n)
 if(!rst_n) valid_r <= 1'b0;
 else if((x_cnt == 11'd187) && valid_y) valid_r <= 1'b1;
 else if((x_cnt == 11'd987) && valid_y) valid_r <= 1'b0;
 
wire valid=valid_r;

wire[10:0] x_dis;  //横坐标显示有效区域0-799
wire[9:0] y_dis;  //纵坐标显示有效区域0-599

assign x_dis = x_cnt - 11'd187;
assign y_dis = y_cnt - 10'd33;

//VGA色彩信号产生
/*
RGB = 000 黑色     RGB = 100  红色
  = 001 蓝色         = 101  紫色
  = 010 绿色         = 110  黄色
  = 011 青色         = 111  白色
  */
/*
一共800*600个像素点,需要显示256种颜色;
那么每个颜色显示区域为40*30,就正好。
*/
reg[7:0] vga_rgb;   //VGA色彩显示寄存器

always @(posedge clk)
 if(!valid) vga_rgb <= 8'd0;
 else begin
  case(x_dis)
   11'd0: begin  //当x坐标画到0时,让显示色彩数据根据当前的y坐标值重新
    if(y_dis >= 10'd0 && y_dis < 10'd40) vga_rgb <= 8'd0;
    else if(y_dis >= 10'd40 && y_dis < 10'd80) vga_rgb <= 8'd16;
    else if(y_dis >= 10'd80 && y_dis < 10'd120) vga_rgb <= 8'd32;
    else if(y_dis >= 10'd120 && y_dis < 10'd160) vga_rgb <= 8'd48;
    else if(y_dis >= 10'd160 && y_dis < 10'd200) vga_rgb <= 8'd64;
    else if(y_dis >= 10'd200 && y_dis < 10'd240) vga_rgb <= 8'd80;
    else if(y_dis >= 10'd240 && y_dis < 10'd280) vga_rgb <= 8'd96;
    else if(y_dis >= 10'd280 && y_dis < 10'd320) vga_rgb <= 8'd112;
    else if(y_dis >= 10'd320 && y_dis < 10'd360) vga_rgb <= 8'd128;
    else if(y_dis >= 10'd360 && y_dis < 10'd400) vga_rgb <= 8'd144;
    else if(y_dis >= 10'd400 && y_dis < 10'd440) vga_rgb <= 8'd160;
    else if(y_dis >= 10'd440 && y_dis < 10'd480) vga_rgb <= 8'd176;
    else if(y_dis >= 10'd480 && y_dis < 10'd520) vga_rgb <= 8'd192;
    else if(y_dis >= 10'd520 && y_dis < 10'd560) vga_rgb <= 8'd208;
    
    else vga_rgb <= 8'd224;
   end
  11'd5011'd10011'd15011'd20011'd25011'd30011'd35011'd40011'd45011'd50011'd55011'd600
  11'd65011'd7011'd750: vga_rgb <= vga_rgb + 1'b1;
  default:;
  endcase
 end
assign vga_r = vga_rgb[7:5];
assign vga_g = vga_rgb[4:2];
assign vga_b = vga_rgb[1:0];

endmodule

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:0

相关问题

问题达人换一批

VGA的问题