lupengpeng 发表于 2011-3-1 17:11:40

本人用FPGA驱动VGA端口 希望对大家有帮助!

驱动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 switch;
output vga_RGB;//VGA数据三种颜色的输出
output hsync,vsync;   //行同步信号和场同步信号
reg data;
reg h_dat;
reg v_dat;
reghcount;
regvcount;
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 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)
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

rui22 发表于 2011-3-4 09:52:37

呵呵好呀!

woabj2008 发表于 2011-3-4 17:19:52

谢谢。。。。。。。。。。。。。。。。。。。。

haoge 发表于 2011-8-9 10:29:53

谢谢楼主分享!!!!!

新一代老大 发表于 2012-2-16 11:21:18

先看看再说

PEIN 发表于 2012-2-25 21:30:56

谢谢楼主,有问题反馈给你啊!

a2830884 发表于 2012-10-14 22:38:09

收藏拉~~~~~~~~~!

a2830884 发表于 2012-10-14 22:39:23

收藏拉~~~~~~~~~!

a2830884 发表于 2012-10-14 22:39:50

收藏拉~~~~~~~~~!

a2830884 发表于 2012-10-14 22:39:50

收藏拉~~~~~~~~~!
页: [1] 2
查看完整版本: 本人用FPGA驱动VGA端口 希望对大家有帮助!