集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

FPGA初级课程第二十四讲 VGA(显示纯色、彩条)

[复制链接]
 楼主| lcytms 发表于 2017-2-13 19:49:38 | 显示全部楼层
帧(竖直方向)同步时序:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-13 19:51:22 | 显示全部楼层
说明:
VGA中定义行时序和帧时序都需要同步脉冲(a段),显示后沿(b段)、显示时序段(c段)和显示前沿(d段)四部分。
VGA工业标准显示模式要求:行同步、帧同步都为负极性,即同步脉冲要求是负脉冲。
由VGA行时序可知:每一行都有一个负极性行同步脉冲(a段),是数据行的结束标志,同时也是下一行的开始标志。
在同步脉冲之后为显示后沿(b段),在显示时序段(c段)显示器为亮的过程,RGB数据驱动一行上的每一个像素点,从而显示一行。
在一行的最后为显示前沿(d段)。
在显示时间段之外没有图像投射到屏幕是插入消隐信号。
同步脉冲、显示后沿和显示前沿都是在行消隐间隔内,当消隐有效时,RGB信号无效,屏幕不显示数据。

VGA的帧时序与行时序分析基本一样。
 楼主| lcytms 发表于 2017-2-13 19:55:27 | 显示全部楼层
5)显示标准
VGA有许多的显示标准,如下表:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-14 11:15:15 | 显示全部楼层
三、实验内容:

以本实验的显示标准800*600*60Hz为例。
(800为列数,600为行数,60Hz为刷新一屏的频率,即帧频)
行时序:每个显示行包括1056列(a+b+c+d=e段),其中800(c段)为有效显示区,每一行有一个行同步信号(a段),为128个行周期的低电平。
帧时序:屏幕对应的行数为628(a+b+c+d=e段),其中600(c段)为显示行;每行均有行同步信号(a段),为4个行周期的低电平。
由此可知:帧频为60Hz,行频为628*60=37680Hz,单点需要的时钟频率:1056*628*60约为39.79MHz,约为40MHz。

屏幕显示有效区域如下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-14 11:17:02 | 显示全部楼层
四、实验步骤

原理清楚以后,我们本次的任务是设计VGA控制器,驱动液晶屏显示器显示全红色。

VGA的工作原理既然已经清楚,我们下面来进行系统设计。
命名VGA驱动逻辑为vga。
架构图如下所示。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-14 11:18:18 | 显示全部楼层
在前级加上锁相环模块pll、后级加上RGB解码模块rgb后,总体架构图如下。
其中,锁相环模块pll产生40MHz时钟信号。
而RGB解码模块rgb将8位的RGB信号编码解析为单独的r、g、b三种信号,输出至开发板上的VGA对应电路。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-14 11:20:16 | 显示全部楼层
本帖最后由 lcytms 于 2017-2-14 11:27 编辑

先从VGA驱动逻辑模块vga.v做起吧!
新建工程文件夹vga。
新建vga.v(显示纯色)文件。
module vga(clk, rst_n, rgb8, hsync, vsync);

        input clk, rst_n;
       
        output [7:0] rgb8;
        output hsync, vsync;
       
        reg [31:0] hcnt, vcnt;
        wire hflag, vflag;

/////        800*600*60 40.0MHz = 1056(128+88+800+40) * 628(4+23+600+1) * 60Hz
        parameter        ha = 128,
                                        hb = 88,
                                        hc = 800,
                                        hd = 40,
                                        he = 1056;
        parameter        va = 4,
                                        vb = 23,
                                        vc = 600,
                                        vd = 1,
                                        ve = 628;

        localparam        hab = ha + hb,
                                        hac = ha + hb + hc;
        localparam        vab = va + vb,
                                        vac = va + vb + vc;
       
        always @ (posedge clk or negedge rst_n)
                begin
                        if (!rst_n)
                                begin
                                        hcnt <= 0;
                                        vcnt <= 0;
                                end
                        else
                                begin
                                        if ((vcnt == ve - 1) && (hcnt == he - 1))
                                                begin
                                                        hcnt <= 0;
                                                        vcnt <= 0;
                                                end
                                        else       
                                                begin
                                                        if (hcnt == he - 1)
                                                                begin
                                                                        hcnt <= 0;
                                                                        vcnt <= vcnt + 1;
                                                                end
                                                        else
                                                                hcnt <= hcnt + 1;
                                                end
                                end
                end
       
        assign hsync = (hcnt < ha) ? 1'b0 : 1'b1;
        assign vsync = (vcnt < va) ? 1'b0 : 1'b1;
       
        assign hflag = ((hcnt >= hab) && (hcnt < hac)) ? 1'b1 : 1'b0;
        assign vflag = ((vcnt >= vab) && (vcnt < vac)) ? 1'b1 : 1'b0;

        wire [7:0] block;
       
        assign block = 8'b111_000_00;
       
        assign rgb8 = (hflag && vflag) ? block : 8'b000_000_00;
       
endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-14 11:32:32 | 显示全部楼层
参照第十四讲的pll,使用IP核建立pll模块。
输出40MHz时钟。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-14 11:33:31 | 显示全部楼层
本帖最后由 lcytms 于 2017-2-14 11:35 编辑

新建RGB解码模块rgb.v。
module rgb(rgb8, r, g, b);

        input [7:0] rgb8;
       
        output [2:0] r, g;
        output [1:0] b;
       
        assign r = rgb8[7:5];
        assign g = rgb8[4:2];
        assign b = rgb8[1:0];

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-14 11:36:33 | 显示全部楼层
本帖最后由 lcytms 于 2017-2-14 11:39 编辑

新建top.v顶层模块,将以上三个模块都加入到top.v顶层模块中进行例化。
将top.v模块设置为顶层模块。
编写top.v模块如下。
module top (clk, rst_n, r, g, b, hsync, vsync);

        input clk, rst_n;
       
        output [2:0] r, g;
        output [1:0] b;
        output hsync, vsync;
       
        wire clk_40M;
        wire [7:0] rgb8;
       
        pll pll (.areset(~rst_n), .inclk0(clk), .c0(clk_40M));
       
        vga vga (.clk(clk_40M), .rst_n(rst_n), .rgb8(rgb8), .hsync(hsync), .vsync(vsync));
       
        rgb rgb (.rgb8(rgb8), .r(r), .g(g), .b(b));

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

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

GMT+8, 2024-12-24 03:33 , Processed in 0.063461 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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