0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的VGA/LCD显示控制器设计(附代码)

FPGA技术江湖 来源:FPGA技术江湖 作者:FPGA技术江湖 2022-11-04 09:19 次阅读

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇。今天带来第三篇,下篇,程序的仿真与测试以及总结,话不多说,上货。

前两篇和之前推送过关于VGA显示相关的文章,这里给个超链接,给各位大侠作个参考。

基于FPGA的VGA/LCD显示控制器设计(上)

基于FPGA的VGA/LCD显示控制器设计(中)

源码系列:基于FPGA的VGA驱动设计(附源工程)

导读

VGA (Video Graphics Array) 即视频图形阵列,是IBM于1987年随PS/2机(PersonalSystem 2)一起推出的使用模拟信号的一种视频传输标准。这个标准对于现今的个人电脑市场已经十分过时。但在当时具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域取得了广泛的应用,是众多制造商所共同支持的一个低标准。

LCD ( Liquid Crystal Display 的简称)液晶显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。按照背光源的不同,LCD可以分为CCFL显示器和LED显示器两种。LCD已经替代CRT成为主流,价格也已经下降了很多,并已充分普及。

在之前的文章中介绍了如何获取、处理摄像头提供的视频信号,在实际应用中还需要将经过处理的信号显示在显示器上。这个过程与信号处理中的过程上是相反的,将数字信号按照电视信号的制式组成合乎时序、格式要求的信号,并加入用于控制的各种同步信号。本篇将通过 FPGA实现一个 VGA/LCD 显示控制器的实例,并详细介绍实现过程。

第三篇内容摘要:本篇会介绍程序的仿真与测试以及总结等相关内容。

四、程序的仿真与测试

为了检验程序是否实现预先设定的功能,需要编写仿真程序。仿真程序的主要代码如下:

module test;
    //寄存器
    reg clk;
    reg rst;
    //参数
    parameter LINE_FIFO_AWIDTH = 7;
    //wire 申明
    wire int;
    wire [31:0] wb_addr_o;
    wire [31:0] wb_data_i;
    wire [31:0] wb_data_o;
    wire [3:0] wb_sel_o;
    wire wb_we_o;
    wire wb_stb_o;
    wire wb_cyc_o;
    wire [2:0] wb_cti_o;
    wire [1:0] wb_bte_o;
    wire wb_ack_i;
    wire wb_err_i;
    wire [31:0] wb_addr_i;
    wire [31:0] wbm_data_i;
    wire [3:0] wb_sel_i;
    wire wb_we_i;
    wire wb_stb_i;
    wire wb_cyc_i;
    wire wb_ack_o;
    wire wb_rty_o;
    wire wb_err_o;
    reg pclk_i;
    wire pclk;
    wire hsync;
    wire vsync;
    wire csync;
    wire blanc;
    wire [7:0] red;
    wire [7:0] green;
    wire [7:0] blue;
    wire dvi_pclk_p_o;
    wire dvi_pclk_m_o;
    wire dvi_hsync_o;
    wire dvi_vsync_o;
    wire dvi_de_o;
    wire [11:0] dvi_d_o;
    wire vga_stb_i;
    wire clut_stb_i;
    reg scen;
    
    // 测试程序变量
    integer wd_cnt;
    integer error_cnt;
    
    reg [31:0] data;
    reg [31:0] pattern;
    reg int_warn;
    
    integer n;
    integer mode;
    
    reg [7:0] thsync, thgdel;
    reg [15:0] thgate, thlen;
    reg [7:0] tvsync, tvgdel;
    reg [15:0] tvgate, tvlen;
    reg hpol;
    reg vpol;
    reg cpol;
    reg bpol;
    integer p, l;
    reg [31:0] pn;
    reg [31:0] pra, paa, tmp;
    reg [23:0] pd;
    reg [1:0] cd;
    reg pc;
    reg [31:0] vbase;
    reg [31:0] cbase;
    reg [31:0] vbara;
    reg [31:0] vbarb;
    reg [7:0] bank;
    
    // 常量定义
    `define CTRL 32'h0000_0000
    `define STAT 32'h0000_0004
    `define HTIM 32'h0000_0008
    `define VTIM 32'h0000_000c
    `define HVLEN 32'h0000_0010
    `define VBARA 32'h0000_0014
    `define VBARB 32'h0000_0018
    `define USE_VC 1
    parameter PCLK_C = 20;
    
    //测试内容
    initial
        begin
            $timeformat (-9, 1, " ns", 12);
            $display("

");
            $display("******************************************************");
            $display("*VGA/LCD Controller Simulation started ... *");
            $display("******************************************************");
            $display("
");
            
    `ifdef WAVES
        $shm_open("waves");
        $shm_probe("AS",test,"AS");
        $display("INFO: Signal dump enabled ...

");
  
    `endif
        scen = 0;
        error_cnt = 0;
        clk = 0;
        pclk_i = 0;
        rst = 0;
        int_warn=1;
        repeat(20) @(posedge clk);
        rst = 1;
        repeat(20) @(posedge clk);
        
    if(0)
        begin
        
        end
    else
    if(1)
        begin
        
    `ifdef VGA_12BIT_DVI
        dvi_pd_test;
    `endif
    
        end
    else
        begin
        
        // 测试区域
    $display("

");
    $display("*****************************************************");
    $display("*** XXX Test ***");
    $display("*****************************************************
");
    
        s0.fill_mem(1);
        repeat(10) @(posedge clk);
        //参数设置
        vbara = 32'h0000_0000;
        vbarb = 32'h0001_0000;
        m0.wb_wr1( `VBARA, 4'hf, vbara );
        m0.wb_wr1( `VBARB, 4'hf, vbarb );
        thsync = 0;
        thgdel = 0;
        thgate = 340;
        thlen = 345;
        tvsync = 0;
        tvgdel = 0;
        tvgate = 240;
        tvlen = 245;
        
        /*
        thsync = 0;
        thgdel = 0;
        thgate = 63;
        thlen = 70;
        tvsync = 0;
        tvgdel = 0;
        tvgate = 32;
        tvlen = 36;
        */
        
        hpol = 0;
        vpol = 0;
        cpol = 0;
        bpol = 0;
        m0.wb_wr1( `HTIM, 4'hf, {thsync, thgdel, thgate} );
        m0.wb_wr1( `VTIM, 4'hf, {tvsync, tvgdel, tvgate} );
        m0.wb_wr1( `HVLEN, 4'hf, {thlen, tvlen} );


    mode = 2;


    for(bank=0;bank<3;bank=bank + 1)
        begin
            case(mode)
            0:
            begin
                cd = 2'h2;
                pc = 1'b0;
            end
            
            1:
            begin
                cd = 2'h0;
                pc = 1'b0;
            end
            
            2:
            begin
                cd = 2'h0;
                pc = 1'b1;
            end
            
            3:
            begin
                cd = 2'h1;
                pc = 1'b0;
            end
            
        endcase
    
    m0.wb_wr1( `CTRL, 4'hf, {
        16'h0, // Reserved
        bpol, cpol,
        vpol, hpol,
        pc, // 1'b0, // PC
        cd, // 2'h2, // CD
        2'h0, // VBL
        1'b0, // Reserved
        1'b1, // CBSWE
        1'b1, // VBSWE
        1'b0, // BSIE
        1'b0, // HIE
        1'b0, // VIE
        1'b1 // Video Enable
      });
      
    $display("Mode: %0d Screen: %0d", mode, bank);
    //repeat(2) @(posedge vsync);
    @(posedge vsync);
    
    // 每一行数据
    for(l=0;l9000)
            begin
                $display("

*************************************
");
                $display("ERROR: Watch Dog Counter Expired
");
                $display("*************************************


");
                $finish;
            end
            
    always @(posedge int)
        if(int_warn)
            begin
                $display("

*************************************
");
                $display("WARNING: Recieved Interrupt (%0t)", $time);
                $display("*************************************


");
            end
    
    always #2.5 clk = ~clk;
    always #(PCLK_C/2) pclk_i = ~pclk_i;
    
    //模块原型
    vga_enh_top #(1'b0, LINE_FIFO_AWIDTH) u0 (
        .wb_clk_i ( clk ),
        .wb_rst_i ( 1'b0 ),
        .rst_i ( rst ),
        .wb_inta_o ( int ),
        //从信号
        .wbs_adr_i ( wb_addr_i[11:0] ),
        .wbs_dat_i ( wb_data_i ),
        .wbs_dat_o ( wb_data_o ),
        .wbs_sel_i ( wb_sel_i ),
        .wbs_we_i ( wb_we_i ),
        .wbs_stb_i ( wb_stb_i ),
        .wbs_cyc_i ( wb_cyc_i ),
        .wbs_ack_o ( wb_ack_o ),
        .wbs_rty_o ( wb_rty_o ),
        .wbs_err_o ( wb_err_o ),
        //主信号
        .wbm_adr_o ( wb_addr_o[31:0] ),
        .wbm_dat_i ( wbm_data_i ),
        .wbm_sel_o ( wb_sel_o ),
        .wbm_we_o ( wb_we_o ),
        .wbm_stb_o ( wb_stb_o ),
        .wbm_cyc_o ( wb_cyc_o ),
        .wbm_cti_o ( wb_cti_o ),
        .wbm_bte_o ( wb_bte_o ),
        .wbm_ack_i ( wb_ack_i ),
        .wbm_err_i ( wb_err_i ),
        //VGA 信号
        .clk_p_i ( pclk_i ),
    `ifdef VGA_12BIT_DVI
        .dvi_pclk_p_o ( dvi_pclk_p_o ),
        .dvi_pclk_m_o ( dvi_pclk_m_o ),
        .dvi_hsync_o ( dvi_hsync_o ),
        .dvi_vsync_o ( dvi_vsync_o ),
        .dvi_de_o ( dvi_de_o ),
        .dvi_d_o ( dvi_d_o ),
    `endif
        .clk_p_o ( pclk ),
        .hsync_pad_o ( hsync ),
        .vsync_pad_o ( vsync ),
        .csync_pad_o ( csync ),
        .blank_pad_o ( blanc ),
        .r_pad_o ( red ),
        .g_pad_o ( green ),
        .b_pad_o ( blue )
    );
    
    wb_mast m0( .clk( clk ),
            .rst( rst ),
            .adr( wb_addr_i ),
            .din( wb_data_o ),
            .dout( wb_data_i ),
            .cyc( wb_cyc_i ),
            .stb( wb_stb_i ),
            .sel( wb_sel_i ),
            .we( wb_we_i ),
            .ack( wb_ack_o ),
            .err( wb_err_o ),
            .rty( 1'b0 )
        );
    
    wb_slv #(24) s0(.clk( clk ),
            .rst( rst ),
            .adr( {1'b0, wb_addr_o[30:0]} ),
            .din( 32'h0 ),
            .dout( wbm_data_i ),
            .cyc( wb_cyc_o ),
            .stb( wb_stb_o ),
            .sel( wb_sel_o ),
            .we( wb_we_o ),
            .ack( wb_ack_i ),
            .err( wb_err_i ),
            .rty( )
        );
    
    `include "tests.v"
    
endmodule

五、总结

本篇介绍了一个 VGA/LCD 显示控制器的实例。首先介绍了 VGA/LCD 显示的相关知识,然后介绍了程序的主要结构和主要功能模块的实现过程。最后用一个测试程序验证程序的功能是否满足要求。本章为各位大侠设计自己的 VGA/LCD 显示控制器提供了一个可以使用的方案。

本篇到此结束,各位大侠,有缘再见!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593201
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4278

    浏览量

    164101
  • 显示控制器
    +关注

    关注

    0

    文章

    18

    浏览量

    15414

原文标题:基于FPGA的VGA/LCD显示控制器设计(附代码)

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    模仿RA8875/RA8876做个图形LCD控制器,STM32跑emWin接VGA显示器测试OK

    SLC颗粒的U盘。。。 这个是用图形LCD控制器做好的GVGA显示卡,可以接大尺寸的VGA显示器,目前最大支持24位色1280*800@60
    发表于 06-04 21:32

    基于FPGAVGA显示矩形框_VGA接口设计_VGA信号处理_明德扬资料

    ,成为电脑显卡上应用最为广泛的接口类型,绝大多数的显卡都带有此种接口。VGA类型的显示驱动需要比较高的扫面频率和尽量短的处理时间,因而通过FPGA来实现VGA
    发表于 08-02 11:40

    如何使用FPGA控制VGA显示

    如何使用FPGA控制VGA显示
    发表于 04-30 07:04

    基于FPGALCD&VGA控制器设计

    介绍了基于FPGA的图形式LCD&VGA控制器的设计,详细讨论了
    发表于 07-21 17:25 0次下载

    LCDVGA视频加速卡

    LCDVGA视频加速卡:此 LCDVGA 视频加速卡是一款以FPGA+SDRAM+DAC 为核心的视频加速卡。带有
    发表于 09-21 08:28 56次下载

    基于ARM与FPGALCD控制器设计

    针对目前使用ARM内嵌LCD控制器或外部控制器件实现显示控制的技术存在着帧率有限、处理器负担重、成本高及专用性强等问题,提出一种采用
    发表于 07-10 15:26 35次下载

    基于FPGAVGA控制器设计与实现

    利用FPGA 设计一个类似点阵LCD 显示VGA 显示控制器,可实现文字及简单的图表
    发表于 09-22 10:17 137次下载

    基于FPGALCD&VGA控制器设计

    摘要:介绍了基于FPGA的图形式LCD&VGA控制器的设计,详细讨论了用VHDL设计行场扫描时序的方法,这种设计方法稍作改动便可产生任意行场扫描时序,具有很好的可重用性。
    发表于 06-20 13:28 1386次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>LCD&VGA</b><b class='flag-5'>控制器</b>设计

    基于FPGAVGA图形控制器设计

    VGA(视频图形阵列)作为一种标准的显示接口得到广泛的应用。利用FPGA 芯片和EDA 设计方法,可以因地制宜,根据用户的特定需要,设计出针对性强的VGA
    发表于 09-23 16:31 4060次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>VGA</b>图形<b class='flag-5'>控制器</b>设计

    基于FPGALCD控制器设计

    基于 FPGALCD控制器设计的论文。
    发表于 10-29 14:05 17次下载

    基于FPGAVGA图像控制器的设计与实现

    基于FPGAVGA图像控制器的设计与实现
    发表于 08-30 15:10 11次下载

    基于FPGA设计LCD显示控制器相关知识详解

    ,只需通过端口的使能参数配置便可以驱动LCD1602/LCD12864模块实现字符或图形的实时显示,并且该多功能LCD控制器的可行性也在Cv
    发表于 12-01 17:17 35次下载
    基于<b class='flag-5'>FPGA</b>设计<b class='flag-5'>LCD</b><b class='flag-5'>显示</b><b class='flag-5'>控制器</b>相关知识详解

    vga图像显示_fpga控制vga显示图片

    本文为大家分享fpga控制vga显示图片的方法。
    发表于 01-15 15:56 7688次阅读

    基于FPGALCD VGA控制器设计

    关键词:FPGA , LCD , VGA 飞机座舱图形显示系统已发展到第六代,即采用有源矩阵彩色液晶显示器AMLCD(Active Matr
    发表于 02-12 09:05 268次阅读

    采用FPGAVGA图形控制器的Verilog设计方法

    VGA(视频图形阵列)作为一种标准的显示接口得到广泛的应用。依据VGA显示原理,介绍了利用FPGA实现对
    的头像 发表于 06-29 10:05 4837次阅读
    采用<b class='flag-5'>FPGA</b>对<b class='flag-5'>VGA</b>图形<b class='flag-5'>控制器</b>的Verilog设计方法