chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

FPGA實現(xiàn)一個VGA/LCD顯示控制器的實例

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

掃碼添加小助手

加入工程師交流群

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

導讀

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

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

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

第三篇內容摘要:本篇會介紹程序的仿真與測試以及總結等相關內容。

四、程序的仿真與測試

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


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                // 測試區(qū)域    $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    //同步監(jiān)視    `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 ) );            // 視頻數據監(jiān)視    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 顯示的相關知識,然后介紹了程序的主要結構和主要功能模塊的實現(xiàn)過程。最后用一個測試程序驗證程序的功能是否滿足要求。本章為各位大俠設計自己的 VGA/LCD 顯示控制器提供了一個可以使用的方案。

審核編輯 :李倩


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

    關注

    1645

    文章

    22046

    瀏覽量

    618266
  • 控制器
    +關注

    關注

    114

    文章

    17100

    瀏覽量

    184220
  • lcd
    lcd
    +關注

    關注

    34

    文章

    4520

    瀏覽量

    171512

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    27FPGA實例源代碼

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

    fpga實現(xiàn)NAND控制器的問題請教

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

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

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

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

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

    FPGA 與微控制器優(yōu)缺點比較

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

    VGA轉成USB-C的方法

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

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

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

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

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

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

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

    tft屏幕屬于lcd屏幕的種嗎

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

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

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

    德州儀器發(fā)布超小型DLP顯示控制器

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

    S1D15K01是種混合LCD驅動IC

    S1D15K01是種混合LCD驅動IC,可以直接連接到微控制器,使分段和點陣顯示可以同時顯示
    的頭像 發(fā)表于 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驅動-非常適合辦公室、工業(yè)設備和帶LCD顯示器的可穿戴產品-精工愛普
    的頭像 發(fā)表于 08-13 15:08 ?655次閱讀
    新型微<b class='flag-5'>控制器</b>S1C31W73非常適合帶<b class='flag-5'>LCD</b><b class='flag-5'>顯示器</b>的可穿戴產品