集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 6511|回复: 14

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

[复制链接]
lupengpeng 发表于 2011-3-1 17:11:40 | 显示全部楼层 |阅读模式
驱动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
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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-27 03:09 , Processed in 0.064161 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表