FPGA_VGA驱动的编写

一、任务需求:
设计VGA接口驱动,显示图像的分辨率为640*480,60hz,显示全白色。

二、VGA介绍

VGA的行时序和场时序
VGA各分辨率对时序的要求
三、需求分析
要求显示一张640*480的纯白色图像,刷新率60Hz。
1、行时序中,一个周期内,依次 同步脉冲a,显示后延b,显示时序段c,显示前沿d 共四段组成,按照640*480,60Hz要求a段96个脉冲,b段45个脉冲,c段数据段646个脉冲,d段13个脉冲,一行的长度就是96+45+646+13 = 800个脉冲(像素,一个脉冲一个像素)。至此,传输完了一个图像的一行。
2、场时序,垂直时序,一个中期内的过程与行时序相同,也分为同步脉冲a,显示后延b,显示时序段c,显示前沿d四个阶段,但是场时序的单位是 一行 的时间(也就是行时序中一个周期的时间,此例子中是800个脉冲)。a段是2行,b段是30行,c段数据段是484行,d段9行。总共2+30+484+9 = 525行。至此传输完了一副完整的图像。
也就是说,真正的图像是640*480个像素,但是实际上花费的时间可以传输800*525个像素,但是实际上就传输了640*480个像素,其他时间用来进行同步和显示前沿和显示后沿了。
我们计算出了传输一幅图像的需要800*525个单位时间,但是每个单位时间是多少?
图像的刷新频率是60Hz,也就是一秒钟刷新60次,一幅图像的显示时间是1s/60,一幅图像有525行的单位时间,所以每一行的时间是(1/60)/525 = 31.75us,一行有800个像素点的时间,所以一个像素点的时间是31.75us/800 = 40ns。我们希望每一个时钟的上升沿传输一个像素点(一拍一个),也就是传输时钟周期是40ns,频率为25MHz。
我的板子上的时钟是50MHz,需要分频。

四、代码实现
1、利用Quartus IP产生二分频(25MHz)的时钟。
2、设计vga_driver.v代码。
3、设计顶层代码。
4、仿真。

五、源代码分享

/****************************
name:			vga_driver.v
time:			2021/04/08
author:		csdn_A_PIG
describe:		This is a VGA driver, the whole screen is white
****************************/
module vga_driver(
    clk     ,
    rst_n   ,
    lcd_hs  ,
    lcd_vs  ,
    lcd_data
);
    //define input signal 
    input       clk     ;//VGA clock = 25MHz.
    input       rst_n   ;
    
    //define output signal
    output      lcd_hs  ;//行同步信号
    output      lcd_vs  ;//场同步信号
    //The RGB signal of VGA,lcd_data[15:13] is R,lcd_data[10:8] is G,lcd_data[4:2]is B; 
    output[7:0] lcd_data;
    
    reg         lcd_hs  ; 
    reg         lcd_vs  ;
    reg   [15:0] lcd_data;
    
    reg[9:0]    lcd_hs_cnt  ;//count for lcd_hs:0-799
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            lcd_hs_cnt <= 10'b0;
        end
        else if(lcd_hs_cnt == 10'd799) begin
            lcd_hs_cnt <= 10'b0;
        end
        else begin
            lcd_hs_cnt <= lcd_hs_cnt + 1;
        end
    end
    
    //行同步信号
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            lcd_hs <=  1'b0;
        end
        else if(lcd_hs_cnt == 10'd95)begin
            lcd_hs <= 1'b1;
        end
        else if(lcd_hs_cnt == 10'd799)begin
            lcd_hs <= 1'b0;
        end
    end
        
    //场计数器--计数有多少行
    reg[9:0]    lcd_vs_cnt;

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            lcd_vs_cnt <= 10'b0;
        end
        else if(lcd_hs_cnt == 10'd799)begin
            if(lcd_vs_cnt == 10'd524)
                lcd_vs_cnt <= 10'b0;
            else
                lcd_vs_cnt <= lcd_vs_cnt + 1'b1;
        end
    end
    
    //场信号
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            lcd_vs <= 1'b0;
        end
        else if(lcd_vs_cnt<10'd2)begin
            lcd_vs <= 1'b0;
        end
        else
            lcd_vs <= 1'b1;
    end
    
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            lcd_data <= 8'b0;
        end
        else if(lcd_vs_cnt<32)begin
            lcd_data <= 8'b0;
        end
        else if(lcd_vs_cnt>484+32-1)begin
            lcd_data <= 8'b0;
        end
        else begin
            if(lcd_hs_cnt<(96+45))begin
                lcd_data <= 0;
            end
            else if(lcd_hs_cnt>(96+45+646-1))begin
                lcd_data <= 0;
            end
            else begin
                lcd_data <= 16'b11111_111111_11111;//All screen is white.
            end
        end
    end
    


endmodule
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
FPGA驱动VGA的代码是一种可编程逻辑设备的驱动程序,它能够将FPGA的输入信号转换为可在VGA显示器上显示的图像。 首先,我们需要了解VGA信号的基本原理。VGA信号由红、绿、蓝三个颜色通道以及同步信号组成。每个颜色通道的亮度等级可以通过数字信号控制,而同步信号用于同步整个显示过程。VGA信号的输出是通过以一定频率驱动像素点的方式来实现图像的显示。 要实现FPGA驱动VGA,我们需要首先将要显示的图像进行处理和编码。一旦图像数据被编码,我们可以将其传输到VGA显示器。在传输过程中,我们需要生成对应于VGA显示时序的同步信号。 编写FPGA驱动VGA的代码,需要定义VGA显示器的分辨率和刷新频率。然后,我们可以使用FPGA内部的时钟信号来生成同步信号。根据已定义的分辨率和频率,我们可以计算每个像素点的时序。通过在特定的时钟周期内为红、绿、蓝三个通道提供正确的信号值,我们可以实现对每个像素点的颜色控制。 为了实现VGA的显示,我们还需要定义图像数据存储的方法。可以使用内部的存储器来存储要显示的图像数据,也可以通过其他外部设备来传输图像数据。 总结来说,FPGA驱动VGA的代码需要处理并编码图像数据,生成对应的VGA同步信号,并按照固定的时序提供正确的颜色信号值。通过合适的存储方式,将处理后的图像数据传输到VGA显示器上,实现图像的显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值