| 
 | 
 
驱动VGA主要做好以下几个部分就可以了! 
 
1. 选好显示模式从而确定刷新率.比如说:显示模式是640*480 60hz的刷新率 
   则行计数器的驱动时钟频率为25MHZ 则显示器的刷新率为   25MHz/800/525=59.2HZ   满足要求。 
 
2. 选好行同步计数器和场同步计数器的驱动时钟频率 
 
3. 就是写好行同步信号和场同步信号(时序) 
 
4.        筛选有效显示区域 
 
  
就640*480模式来说 行同步脉冲是96 、场同步脉冲为2 !行同步脉冲和场同步脉冲就是进行 行消隐和场消隐 目的分别是使行扫描回到下一行的初始位置、使扫描回到屏幕的左上方。 
 
 
 
下面是程序代码: 
module vga(clock,switch,vga_RGB,hsync,vsync); 
input clock; 
input[1:0] switch; 
output[2:0] vga_RGB;  //VGA数据三种颜色的输出 
output hsync,vsync;   //行同步信号和场同步信号 
reg[2:0] data; 
reg[2:0] h_dat; 
reg[2:0] v_dat; 
reg[9:0]  hcount; 
reg[9:0]  vcount; 
reg clk25; 
//************************************************// 
always@(posedge clock)    
begin 
clk25=~clk25; 
end 
//****************************************************// 
always@(posedge clk25)     //行同步信号计数器 
begin 
        if(hcount==10'd799) 
                hcount<=10'd0; 
        else  
                hcount<=hcount+1'd1; 
end 
 
always@(posedge clk25)    //场同步信号计数器 
begin 
        if(hcount==10'd799) 
                if(vcount==10'd524) 
                        vcount<=10'd0; 
                else 
                vcount<=vcount+1'd1; 
end 
//**************************************************// 
wire dat_act;     //有效显示区域 
assign dat_act=(hcount>=143)&&(hcount<783)&&(vcount>=34)&&(vcount<514); 
//****************************************************// 
reg hsync_r,vsync_r; 
always@(posedge clk25)    //行同步信号的产生 
begin 
        if(hcount==10'd0)  
                hsync_r=1'b0; 
        else if(hcount==10'd96) 
                hsync_r=1'b1; 
end 
//*******************************************// 
 
always@(posedge clk25)     //场同步信号的产生 
begin 
        if(vcount==10'd0)  
                vsync_r=1'b0; 
        else if(vcount==10'd2) 
                vsync_r=1'b1; 
end 
 
assign hsync=hsync_r; 
assign vsync=vsync_r; 
//**********************************************// 
//wire[9:0] xpos,ypos; 
//assign xpos=hcount-10'd143; 
//assign ypos=vcount-10'd34; 
//wire e_read; 
//ssign e_read=(xpos>120)&&(xpos<420)&&(ypos>120)&&(ypos<514); 
//assign vga_g=(dat_act) ? 1 : 1'b0; 
//assign vga_r=(dat_act) ? e_read : 1'b0; 
 
assign vga_RGB=(dat_act) ? data : 3'h0; 
 
always @(posedge clk25) 
begin 
 case(switch[1:0]) 
  2'd0: data <= h_dat;      //选择横彩条 
  2'd1: data <= v_dat;      //选择竖彩条 
  2'd2: data <= (v_dat ^ h_dat); //产生棋盘格 
  2'd3: data <= (v_dat ~^ h_dat); //产生棋盘格 
 endcase 
end 
 
always @(posedge clk25)  //产生竖彩条 
begin 
 if(hcount < 223) 
  v_dat <= 3'h7;      //白    
 else if(hcount < 303) 
  v_dat <= 3'h6;   //黄 
 else if(hcount < 383) 
  v_dat <= 3'h5;   //青 
 else if(hcount < 463) 
  v_dat <= 3'h4;    //绿 
 else if(hcount < 543) 
  v_dat <= 3'h3;   //紫 
 else if(hcount < 623) 
  v_dat <= 3'h2;   //红 
 else if(hcount < 703) 
  v_dat <= 3'h1;   //蓝 
 else  
  v_dat <= 3'h0;   //黑 
end 
 
always @(posedge clk25)  //产生横彩条 
begin 
 if(vcount < 94) 
  h_dat <= 3'h7;        //白 
 else if(vcount < 154) 
  h_dat <= 3'h6;   //黄 
 else if(vcount < 214) 
  h_dat <= 3'h5;   //青 
 else if(vcount < 274) 
  h_dat <= 3'h4;    //绿 
 else if(vcount < 334) 
  h_dat <= 3'h3;   //紫 
 else if(vcount < 394) 
  h_dat <= 3'h2;   //红 
 else if(vcount < 454) 
  h_dat <= 3'h1;   //蓝 
 else  
  h_dat <= 3'h0;   //黑 
end 
endmodule |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册 
 
 
 
x
 
 
 
 
 |