0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的VGA/LCD顯示控制器設(shè)計(jì)(附代碼)

FPGA技術(shù)江湖 ? 來(lái)源:FPGA技術(shù)江湖 ? 作者:FPGA技術(shù)江湖 ? 2022-11-04 09:19 ? 次閱讀

大俠好,歡迎來(lái)到FPGA技術(shù)江湖,江湖偌大,相見即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。

今天給大俠帶來(lái)基于FPGA的VGA/LCD顯示控制器設(shè)計(jì),由于篇幅較長(zhǎng),分三篇。今天帶來(lái)第三篇,下篇,程序的仿真與測(cè)試以及總結(jié),話不多說(shuō),上貨。

前兩篇和之前推送過(guò)關(guān)于VGA顯示相關(guān)的文章,這里給個(gè)超鏈接,給各位大俠作個(gè)參考。

基于FPGA的VGA/LCD顯示控制器設(shè)計(jì)(上)

基于FPGA的VGA/LCD顯示控制器設(shè)計(jì)(中)

源碼系列:基于FPGA的VGA驅(qū)動(dòng)設(shè)計(jì)(附源工程)

導(dǎo)讀

VGA (Video Graphics Array) 即視頻圖形陣列,是IBM于1987年隨PS/2機(jī)(PersonalSystem 2)一起推出的使用模擬信號(hào)的一種視頻傳輸標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)對(duì)于現(xiàn)今的個(gè)人電腦市場(chǎng)已經(jīng)十分過(guò)時(shí)。但在當(dāng)時(shí)具有分辨率高、顯示速率快、顏色豐富等優(yōu)點(diǎn),在彩色顯示器領(lǐng)域取得了廣泛的應(yīng)用,是眾多制造商所共同支持的一個(gè)低標(biāo)準(zhǔn)。

LCD ( Liquid Crystal Display 的簡(jiǎn)稱)液晶顯示器。LCD 的構(gòu)造是在兩片平行的玻璃基板當(dāng)中放置液晶盒,下基板玻璃上設(shè)置TFT(薄膜晶體管),上基板玻璃上設(shè)置彩色濾光片,通過(guò)TFT上的信號(hào)與電壓改變來(lái)控制液晶分子的轉(zhuǎn)動(dòng)方向,從而達(dá)到控制每個(gè)像素點(diǎn)偏振光出射與否而達(dá)到顯示目的。按照背光源的不同,LCD可以分為CCFL顯示器和LED顯示器兩種。LCD已經(jīng)替代CRT成為主流,價(jià)格也已經(jīng)下降了很多,并已充分普及。

在之前的文章中介紹了如何獲取、處理攝像頭提供的視頻信號(hào),在實(shí)際應(yīng)用中還需要將經(jīng)過(guò)處理的信號(hào)顯示在顯示器上。這個(gè)過(guò)程與信號(hào)處理中的過(guò)程上是相反的,將數(shù)字信號(hào)按照電視信號(hào)的制式組成合乎時(shí)序、格式要求的信號(hào),并加入用于控制的各種同步信號(hào)。本篇將通過(guò) FPGA實(shí)現(xiàn)一個(gè) VGA/LCD 顯示控制器的實(shí)例,并詳細(xì)介紹實(shí)現(xiàn)過(guò)程。

第三篇內(nèi)容摘要:本篇會(huì)介紹程序的仿真與測(cè)試以及總結(jié)等相關(guān)內(nèi)容。

四、程序的仿真與測(cè)試

為了檢驗(yàn)程序是否實(shí)現(xiàn)預(yù)先設(shè)定的功能,需要編寫仿真程序。仿真程序的主要代碼如下:

module test;
    //寄存器
    reg clk;
    reg rst;
    //參數(shù)
    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;
    
    // 測(cè)試程序變量
    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;
    
    //測(cè)試內(nèi)容
    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
        
        // 測(cè)試區(qū)域
    $display("

");
    $display("*****************************************************");
    $display("*** XXX Test ***");
    $display("*****************************************************
");
    
        s0.fill_mem(1);
        repeat(10) @(posedge clk);
        //參數(shù)設(shè)置
        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);
    
    // 每一行數(shù)據(jù)
    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 ),
        //從信號(hào)
        .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 ),
        //主信號(hà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 信號(hào)
        .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

五、總結(jié)

本篇介紹了一個(gè) VGA/LCD 顯示控制器的實(shí)例。首先介紹了 VGA/LCD 顯示的相關(guān)知識(shí),然后介紹了程序的主要結(jié)構(gòu)和主要功能模塊的實(shí)現(xiàn)過(guò)程。最后用一個(gè)測(cè)試程序驗(yàn)證程序的功能是否滿足要求。本章為各位大俠設(shè)計(jì)自己的 VGA/LCD 顯示控制器提供了一個(gè)可以使用的方案。

本篇到此結(jié)束,各位大俠,有緣再見!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21620

    瀏覽量

    601231
  • lcd
    lcd
    +關(guān)注

    關(guān)注

    34

    文章

    4405

    瀏覽量

    166930
  • 顯示控制器
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    15454

原文標(biāo)題:基于FPGA的VGA/LCD顯示控制器設(shè)計(jì)(附代碼)

文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    利用可編程器件CPLD/FPGA實(shí)現(xiàn)VGA圖像控制器的設(shè)計(jì)方案

    利用可編程器件CPLD/FPGA實(shí)現(xiàn)VGA彩色顯示控制器在工業(yè)現(xiàn)場(chǎng)中有許多實(shí)際應(yīng)用。以硬件描述語(yǔ)言VHDL對(duì)可編程器件進(jìn)行功能模塊設(shè)計(jì)、仿真綜合,可實(shí)現(xiàn)
    發(fā)表于 08-30 12:03 ?1084次閱讀
    利用可編程器件CPLD/<b class='flag-5'>FPGA</b>實(shí)現(xiàn)<b class='flag-5'>VGA</b>圖像<b class='flag-5'>控制器</b>的設(shè)計(jì)方案

    基于FPGALCD&VGA控制器設(shè)計(jì)

    介紹了基于FPGA的圖形式LCD&VGA控制器的設(shè)計(jì),詳細(xì)討論了
    發(fā)表于 07-21 17:25 ?0次下載

    LCD轉(zhuǎn)VGA視頻加速卡

    LCD轉(zhuǎn)VGA視頻加速卡:此 LCD 轉(zhuǎn)VGA 視頻加速卡是一款以FPGA+SDRAM+DAC 為核心的視頻加速卡。帶有
    發(fā)表于 09-21 08:28 ?56次下載

    基于ARM與FPGALCD控制器設(shè)計(jì)

    針對(duì)目前使用ARM內(nèi)嵌LCD控制器或外部控制器件實(shí)現(xiàn)顯示控制的技術(shù)存在著幀率有限、處理負(fù)擔(dān)重、
    發(fā)表于 07-10 15:26 ?35次下載

    基于FPGAVGA控制器設(shè)計(jì)與實(shí)現(xiàn)

    利用FPGA 設(shè)計(jì)一個(gè)類似點(diǎn)陣LCD 顯示VGA 顯示控制器,可實(shí)現(xiàn)文字及簡(jiǎn)單的圖表
    發(fā)表于 09-22 10:17 ?138次下載

    基于FPGALCD&VGA控制器設(shè)計(jì)

    摘要:介紹了基于FPGA的圖形式LCD&VGA控制器的設(shè)計(jì),詳細(xì)討論了用VHDL設(shè)計(jì)行場(chǎng)掃描時(shí)序的方法,這種設(shè)計(jì)方法稍作改動(dòng)便可產(chǎn)生任意行場(chǎng)掃描時(shí)序,具有很好的可重用性。
    發(fā)表于 06-20 13:28 ?1469次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>LCD&VGA</b><b class='flag-5'>控制器</b>設(shè)計(jì)

    基于FPGAVGA圖形控制器設(shè)計(jì)

    VGA(視頻圖形陣列)作為一種標(biāo)準(zhǔn)的顯示接口得到廣泛的應(yīng)用。利用FPGA 芯片和EDA 設(shè)計(jì)方法,可以因地制宜,根據(jù)用戶的特定需要,設(shè)計(jì)出針對(duì)性強(qiáng)的VGA
    發(fā)表于 09-23 16:31 ?4280次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>VGA</b>圖形<b class='flag-5'>控制器</b>設(shè)計(jì)

    基于FPGALCD控制器設(shè)計(jì)

    基于 FPGALCD控制器設(shè)計(jì)的論文。
    發(fā)表于 10-29 14:05 ?17次下載

    基于FPGAVGA圖像控制器的設(shè)計(jì)與實(shí)現(xiàn)

    基于FPGAVGA圖像控制器的設(shè)計(jì)與實(shí)現(xiàn)
    發(fā)表于 08-30 15:10 ?13次下載

    基于FPGA設(shè)計(jì)LCD顯示控制器相關(guān)知識(shí)詳解

    ,只需通過(guò)端口的使能參數(shù)配置便可以驅(qū)動(dòng)LCD1602/LCD12864模塊實(shí)現(xiàn)字符或圖形的實(shí)時(shí)顯示,并且該多功能LCD控制器的可行性也在Cv
    發(fā)表于 12-01 17:17 ?35次下載
    基于<b class='flag-5'>FPGA</b>設(shè)計(jì)<b class='flag-5'>LCD</b><b class='flag-5'>顯示</b><b class='flag-5'>控制器</b>相關(guān)知識(shí)詳解

    vga圖像顯示_fpga控制vga顯示圖片

    本文為大家分享fpga控制vga顯示圖片的方法。
    發(fā)表于 01-15 15:56 ?7886次閱讀

    基于FPGALCD VGA控制器設(shè)計(jì)

    關(guān)鍵詞:FPGA , LCD , VGA 飛機(jī)座艙圖形顯示系統(tǒng)已發(fā)展到第六代,即采用有源矩陣彩色液晶顯示器AMLCD(Active Matr
    發(fā)表于 02-12 09:05 ?335次閱讀

    采用FPGA對(duì)VGA圖形控制器的Verilog設(shè)計(jì)方法

    VGA(視頻圖形陣列)作為一種標(biāo)準(zhǔn)的顯示接口得到廣泛的應(yīng)用。依據(jù)VGA顯示原理,介紹了利用FPGA實(shí)現(xiàn)對(duì)
    的頭像 發(fā)表于 06-29 10:05 ?5085次閱讀
    采用<b class='flag-5'>FPGA</b>對(duì)<b class='flag-5'>VGA</b>圖形<b class='flag-5'>控制器</b>的Verilog設(shè)計(jì)方法

    基于FPGA的多功能LCD顯示控制器是如何實(shí)現(xiàn)的

    基于FPGA設(shè)計(jì) LCD顯示控制器 ,關(guān)鍵在于采用硬件描述語(yǔ)言設(shè)計(jì)有限狀態(tài)機(jī)(FSM)來(lái)控制LCD
    發(fā)表于 04-02 09:13 ?1242次閱讀

    如何使用FPGA實(shí)現(xiàn)VGA圖像控制器的設(shè)計(jì)論文免費(fèi)下載

    依據(jù)VGA顯示原理。利用VHDL作為設(shè)計(jì)語(yǔ)言.設(shè)計(jì)了一種基于現(xiàn)場(chǎng)可編程器件FPGAVGA多圖像控制器,并在硬件平臺(tái)上實(shí)現(xiàn)設(shè)計(jì)目標(biāo)。與傳統(tǒng)的
    發(fā)表于 01-29 15:27 ?20次下載
    如何使用<b class='flag-5'>FPGA</b>實(shí)現(xiàn)<b class='flag-5'>VGA</b>圖像<b class='flag-5'>控制器</b>的設(shè)計(jì)論文免費(fèi)下載