91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FPGA實現一個VGA/LCD顯示控制器的實例

FPGA技術江湖 ? 來源:FPGA技術江湖 ? 作者:FPGA技術江湖 ? 2022-08-01 10:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天給大俠帶來基于FPGA的VGA/LCD顯示控制器設計,由于篇幅較長,分三篇。今天帶來第三篇,下篇,程序的仿真與測試以及總結,話不多說,上貨。

導讀

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;l    // For each Pixel    for(p=0;p        begin            while(blanc) @(posedge pclk);                        if(bank[0]) vbase = vbarb[31:2];            else vbase = vbara[31:2];            if(bank[0]) cbase = 32'h0000_0c00;            else cbase = 32'h0000_0800;                        // 各種顯示模式            //像素數目 = 行數* (thgate + 1) + p            pn = l * (thgate + 1) + p;                        case(mode)                0: // 24 位模式                begin                    pra = pn[31:2] * 3;                    paa = pra + vbase; // 像素決定地址                                // 像素數據                case(pn[1:0])                    0:                    begin                        tmp = s0.mem[paa];                        pd = tmp[31:8];                    end                    1:                        begin                            tmp = s0.mem[paa];                            pd[23:16] = tmp[7:0];                            tmp = s0.mem[paa+1];                            pd[15:0] = tmp[31:16];                        end                    2:                        begin                            tmp = s0.mem[paa+1];                            pd[23:8] = tmp[15:0];                            tmp = s0.mem[paa+2];                            pd[7:0] = tmp[31:24];                        end                    3:                    begin                        tmp = s0.mem[paa+2];                        pd = tmp[23:0];                    end                endcase            end                        1: // 8 位灰度模式                begin                    pra = pn[31:2]; // 像素相對地址                    paa = pra + vbase; // 像素絕對地址                    case(pn[1:0])                        0:                            begin                                tmp = s0.mem[paa];                                pd = { tmp[31:24], tmp[31:24], tmp[31:24] };                            end                        1:                            begin                                tmp = s0.mem[paa];                                pd = { tmp[23:16], tmp[23:16], tmp[23:16] };                            end                        2:                            begin                                tmp = s0.mem[paa];                                pd = { tmp[15:8], tmp[15:8], tmp[15:8] };                            end                        3:                            begin                                tmp = s0.mem[paa];                                pd = { tmp[7:0], tmp[7:0], tmp[7:0] };                            end                    endcase                end            2: // 8 位偽彩色模式                begin                    pra = pn[31:2]; //像素相對地址                    paa = pra + vbase; //像素絕對地址                    case(pn[1:0])                        0:                            begin                                tmp = s0.mem[paa];                                tmp = s0.mem[cbase[31:2] + tmp[31:24]];                                pd = tmp[23:0];                            end                        1:                            begin                                tmp = s0.mem[paa];                                tmp = s0.mem[cbase[31:2] + tmp[23:16]];                                pd = tmp[23:0];                            end                        2:                            begin                                tmp = s0.mem[paa];                                tmp = s0.mem[cbase[31:2] + tmp[15:8]];                                pd = tmp[23:0];                            end                        3:                            begin                                tmp = s0.mem[paa];                                tmp = s0.mem[cbase[31:2] + tmp[7:0]];                                pd = tmp[23:0];                            end                    endcase                end                          3: // 16 位模式              begin                  pra = pn[31:1]; //像素相對地址                  paa = pra + vbase; //像素絕對地址                  case(pn[0])                      0:                          begin                              tmp = s0.mem[paa];                              tmp[15:0] = tmp[31:16];                              pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};                          end                      1:                          begin                              tmp = s0.mem[paa];                              pd = {tmp[15:11], 3'h0, tmp[10:5], 2'h0, tmp[4:0], 3'h0};                          end                  endcase              end      endcase      if(pd !== {red, green, blue} )          begin              $display("ERROR: Pixel Data Mismatch: Expected: %h, Got: %h %h %h",              pd, red, green, blue);              $display(" pixel=%0d, line=%0d, (%0t)",p,l,$time);              error_cnt = error_cnt + 1;          end                    @(posedge pclk);      end  end       show_errors;  $display("*****************************************************");  $display("*** Test DONE ... ***");  $display("*****************************************************

");   end        repeat(10) @(posedge clk);      $finish;  end    //同步監視    `ifdef VGA_12BIT_DVI    sync_check #(PCLK_C*2) ucheck(    `else    sync_check #(PCLK_C) ucheck(    `endif        .pclk( pclk ),        .rst( rst ),        .enable( scen ),        .hsync( hsync ),        .vsync( vsync ),        .csync( csync ),        .blanc( blanc ),        .hpol( hpol ),        .vpol( vpol ),        .cpol( cpol ),        .bpol( bpol ),        .thsync( thsync ),        .thgdel( thgdel ),        .thgate( thgate ),        .thlen( thlen ),        .tvsync( tvsync ),        .tvgdel( tvgdel ),        .tvgate( tvgate ),        .tvlen( tvlen ) );            // 視頻數據監視    wb_b3_check u_wb_check (        .clk_i ( clk ),        .cyc_i ( wb_cyc_o ),        .stb_i ( wb_stb_o ),        .cti_i ( wb_cti_o ),        .bte_i ( wb_bte_o ),        .we_i ( wb_we_o ),        .ack_i ( wb_ack_i ),        .err_i ( wb_err_i ),        .rty_i ( 1'b0 ) );
    //看門狗計數器    always @(posedge clk)        if(wb_cyc_i | wb_cyc_o | wb_ack_i | wb_ack_o | hsync)            wd_cnt <= #1 0;        else            wd_cnt <= #1 wd_cnt + 1;                always @(wd_cnt)        if(wd_cnt>9000)            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
    +關注

    關注

    1645

    文章

    22049

    瀏覽量

    618409
  • 控制器
    +關注

    關注

    114

    文章

    17106

    瀏覽量

    184273
  • lcd
    lcd
    +關注

    關注

    34

    文章

    4520

    瀏覽量

    171542

原文標題:系統設計精選 | 基于FPGA的VGA/LCD顯示控制器設計(附代碼)

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    中小尺寸彩屏TFT-LCD顯示控制器RA8889ML3N電路原理圖

    中小尺寸彩屏TFT-LCD顯示控制器RA8889ML3N電路原理圖,最高驅動1366*2048分辨率,支持并口/串口(SPI)主控接口,支持圖形繪圖引擎,支持JPEG視頻硬解碼. 原理圖和PCB圖資料如下:*附件:RA8889_
    發表于 04-03 14:33

    27FPGA實例源代碼

    本資料收集匯總了27FPGA實例源代碼,有需要的可以下載學習! 獲取完整文檔資料可下載附件哦?。。?!如果內容有幫助可以關注、點贊、評論支持下哦~
    發表于 03-14 17:31

    fpga實現NAND控制器的問題請教

    各位大佬好, 我目前正在使用xilinx 7系列fpga進行基于onfi4.0標準nv-ddr3接口的nand flash控制器的開發。目前在物理層接口上,特別是從nand讀取數據時,調試存在
    發表于 02-06 15:02

    基于FPGAVGA驅動設計(附源工程)

    標準對于現今的個人電腦市場已經十分過時。但在當時具有分辨率高、顯示速率快、顏色豐富等優點,在彩色顯示器領域取得了廣泛的應用,是眾多制造商所共同支持的低標準。 ? 設計原理
    的頭像 發表于 01-14 11:31 ?1057次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>VGA</b>驅動設計(附源工程)

    想用控制器來直接對TSB81BA3E的寄存進行讀寫,怎么實現

    大家好!我現在在使用TSB81BA3E 這個1394物理層芯片,我現在想用控制器來直接對這個芯片的寄存進行讀寫(不通過鏈路層)!請問我應該使用芯片的哪些引腳?
    發表于 12-17 07:08

    FPGA 與微控制器優缺點比較

    在現代電子設計領域,FPGA和微控制器(MCU)是兩種常用的計算平臺。它們各自具有獨特的優勢和局限性,適用于不同的應用場景。 性能 FPGA FPGA
    的頭像 發表于 12-02 09:58 ?1197次閱讀

    VGA轉成USB-C的方法

    VGA信號轉換成USB-C信號,通常需要使用專門的轉換或適配器。以下是實現轉換的具體
    的頭像 發表于 11-08 10:15 ?2143次閱讀

    基于FPGALCD1602液晶顯示模塊驅動設計

    本文通過以LCD1602液晶顯示模塊為基礎,介紹FPGA驅動LCD1602原理,詳細介紹硬件原理圖設計及FPGA驅動
    的頭像 發表于 10-24 14:42 ?4098次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>LCD</b>1602液晶<b class='flag-5'>顯示</b>模塊驅動設計

    vga接口怎么接線 vga接口轉換怎么用

    VGA接口,全稱為Video Graphics Array,是種模擬信號的顯示標準,廣泛應用于計算機顯示器、投影儀等設備。隨著技術的發展,VGA
    的頭像 發表于 10-21 09:53 ?4928次閱讀

    LCD控制器連接到DM642視頻端口

    電子發燒友網站提供《將LCD控制器連接到DM642視頻端口.pdf》資料免費下載
    發表于 10-17 10:42 ?0次下載
    將<b class='flag-5'>LCD</b><b class='flag-5'>控制器</b>連接到DM642視頻端口

    tft屏幕屬于lcd屏幕的種嗎

    TFT屏幕確實屬于LCD(液晶顯示器)屏幕的種。LCD屏幕是種廣泛使用的顯示技術,它通過液晶
    的頭像 發表于 10-12 10:31 ?3018次閱讀

    什么是LCD控制器?愛普生LCD控制器的作用和功能、概述和產品列表

    什么是LCD控制器LCD控制器的作用和功能LCD控制器(液晶
    的頭像 發表于 10-09 11:10 ?1164次閱讀
    什么是<b class='flag-5'>LCD</b><b class='flag-5'>控制器</b>?愛普生<b class='flag-5'>LCD</b><b class='flag-5'>控制器</b>的作用和功能、概述和產品列表

    德州儀器發布超小型DLP顯示控制器

    在追求極致便攜與高效顯示的科技浪潮中,德州儀器(TI)再次引領創新,近日正式推出了革命性的超小型DLP顯示控制器——DLPC8445。這款控制器以其前所未有的緊湊設計,標志著投影
    的頭像 發表于 09-02 16:15 ?940次閱讀

    S1D15K01是種混合LCD驅動IC

    S1D15K01是種混合LCD驅動IC,可以直接連接到微控制器,使分段和點陣顯示可以同時顯示
    的頭像 發表于 08-16 09:55 ?513次閱讀
    S1D15K01是<b class='flag-5'>一</b>種混合<b class='flag-5'>LCD</b>驅動<b class='flag-5'>器</b>IC

    新型微控制器S1C31W73非常適合帶LCD顯示器的可穿戴產品

    新型Arm?微控制器“S1C31W73”配備大容量閃存和高分辨率LCD驅動-非常適合辦公室、工業設備和帶LCD顯示器的可穿戴產品-精工愛普
    的頭像 發表于 08-13 15:08 ?657次閱讀
    新型微<b class='flag-5'>控制器</b>S1C31W73非常適合帶<b class='flag-5'>LCD</b><b class='flag-5'>顯示器</b>的可穿戴產品
    主站蜘蛛池模板: 婷婷四房综合激情五月性色 | 日日干狠狠操 | 在线色站| 四虎永久免费网站入口2020 | 中文字幕精品一区影音先锋 | www.狠狠操.com| 欧美成人 色 图 | 天天插狠狠干 | 日本色婷婷 | 国产精品亚洲色图 | 久久香蕉国产线看观看亚洲片 | 天天爽夜夜操 | 日韩av线观看 | 中文字幕精品一区二区三区视频 | 激情六月婷婷开心丁香开心 | 亚洲欧美色图 | 狠狠色影院 | 看片地址 | 亚洲精品一卡2卡3卡三卡四卡 | 亚洲国产福利精品一区二区 | 国产情侣出租屋露脸实拍 | 久久国产精品夜色 | sihu永久在线播放地址 | 在线亚洲成人 | 久久99久久99精品免观看 | 婷婷六月丁香午夜爱爱 | 国模论坛 | 日韩免费一区 | 手机看片免费永久在线观看 | 欧美美女被日 | 五月天丁香婷婷网 | 日日日日人人人夜夜夜2017 | www.黄黄黄 | 毛片大全高清免费 | 久久国产免费 | 奇米第四777 | 成人特黄午夜性a一级毛片 成人网18免费下 | 东北美女野外bbwbbw免费 | 久久成人综合网 | 又色又污又爽又黄的网站 | 5g影院欧美成人免费 |