FPGA-VGA成像原理與時序

什么是VGA:

VGA, Video Graphics Array。即視頻圖形陣列,具有分辨率高、顯示速率快、顏色豐富等優點。VGA接口不但是CRT顯示設備的標準接口,同樣也是LCD液晶顯示設備的標準接口,具有廣泛的應用范圍。在FGPA中,常廣泛用于圖像處理等領域。

VGA 顯示器成像原理

在 VGA 標準剛興起的時候,常見的 VGA 接口彩色顯示器一般基于 CRT(陰極射線管) 實現,色彩由 RGB 三基色組成,顯示是用逐行掃描的方式。下圖為基于 CRT 的顯示器實物圖。

陰極射線槍發出的電子束打在涂有熒光粉的熒光屏上,產生 RGB 三基色,合成一個彩 色像素,掃描從屏幕的左上方開始,從左到右,從上到下進行掃描,每掃完一行,電子束都 回到屏幕的下一行左邊的起始位置。

在回掃的過程中,電子槍不能發射電子,否則會影響熒光屏上既有圖像的顏色,所以 回掃期間,需要進行行消隱,簡單來說就是關閉電子槍。每行結束時,用行同步信號進行行 同步,圖中從右上方向左下方的斜向虛線就是其回行掃示意圖。

當整個屏幕的所有行都掃描完后,使用場同步信號進行場同步,并使掃描回到屏幕的 左上方。同樣的,為了避免電子槍在回到左上方的過程中發出的電子破壞熒光屏上既有的圖 像內容,這個回掃的過程也需要關閉電子槍,即場消隱。

隨著顯示技術的發展,出現了液晶顯示器,液晶顯示器讓顯示設備徹底擺脫了厚重的 機身,也為便攜式計算機的出現創造了可能。

液晶顯示器的成像原理與 CRT 不同。液晶顯示器是通過改變對液晶像素點單元施加電 壓的電壓大小,來改變液晶單元的透光性。在液晶單元背后發射白光,并添加三色濾光片, 分別使 R、G、B 這 3 種光線透過濾光片,最后通過 3 個像素點合成一個彩色像素點,從而 實現彩色顯示。

由于液晶技術晚于 CRT 顯示技術誕生,在液晶顯示器出現的時候,計算機顯示接口已 經確定,很難再突然改變。所以為了能夠兼容傳統的顯示接口,液晶顯示器通過內部電路實 現了對 VGA 接口的完全兼容。因此,在使用顯示器時,只要該顯示器帶有標準的 VGA 接口, 就不用去關注其成像原理,直接使用標準的 VGA 時序即可驅動。

當使用 VGA 接口傳輸圖像時,顯示驅動芯片(如顯卡)輸出的 RGB 數據先要經過 DAC 轉換為 3 路分別代表 R、G、B 顏色分量的模擬信號,送到 VGA 接口,這些模擬信號經由 VGA 線纜到達顯示器的 VGA 接口,對于模擬的 CRT 顯示器,這些信號會直接被放大后用于驅動 電子槍發射電子,而對于液晶顯示器,則需要顯示器使用專門的模擬數字轉換芯片將模擬信 號再轉換為數字信號后,去驅動 RGB 接口的液晶顯示屏顯示圖像。

VGA 時序

CRT 行掃描過程

對于 CRT 顯示器,雖然掃描的時候是按照一行一行的方式進行的,但不是掃描完一行 有效數據段之后就立馬返回,而是會繼續向右掃描一段區域,這個區域稱為右邊界區域 (horizontal right border),該區域已經不在有效的顯示范圍內,如果從物理結構的角度來說, 這一段對應的熒光屏玻璃上就不再有熒光粉了,但是電子槍還在繼續向右走,可以形象理解為顯示器右邊的黑邊。同樣的,顯示器左邊也有這樣一段黑邊,在開始顯示有效數據之 前,電子槍掃描到的這段區域同樣也是沒有熒光粉的,不會顯示圖像, 這個區域稱為左邊界區域(horizontal left border)

那么,電子槍什么時候會到最左側準備開始新一行圖像的掃描呢?當電子槍掃描一行 圖像到達熒光屏的最右端后,其并不會自動回到最左邊準備下一行,而是需要有一個通知信 號,通知其回去,這個通知信號就是行同步信號脈沖(horizontal sync pulse)。行同步信號是 一個脈沖,當該脈沖出現后,電子槍的指向會在一定時間內從最右側回到顯示屏的最左側。 而這個回去的過程需要耗費一定的時間,這個時間就稱為 horizontal back porch。這也是這個名詞中 back 的意義所在,即出現行同步信號后,電子槍從顯示屏最右側回到最左側的時間。?

當電子槍掃描過了右側沒有熒光粉的區域后,還沒有收到回到最左側的命令(行同步信號脈沖)之前,電子槍需要關閉以實現消隱,這個消隱的時間段就稱為 horizontal front porch, 直觀一點理解就是完成了一行圖像的掃描,但還沒收到回到最左側命令之前的一段時間。這也是這個名詞中 front 的意義所在。

CRT 場掃描過程

一幅完整的圖像可以看作是多行圖像平鋪構成的,所以理解了行掃描的過程中每個時間段對應的時間參數名稱之后,再來理解場掃描中的名詞就非常簡單了。

首先來講,CRT 在掃描一行圖像的時候,電子槍的水平位置是保持穩定不變的,而當一 行圖像掃描完成,開始掃描下一行圖像的時候,電子槍的水平位置會向下調整一定的值。因此,我們可以認為,場時序就是在垂直方向上從上往下依次掃描。

其次來說,對于 CRT 顯示器來說,其不是掃描完所有行的圖像后就立馬返回最上方, 而是會繼續向下掃描一段區域,這個區域稱為下邊界區域(vertical bottom border),該區域 已經不在有效的顯示范圍內,如果從物理結構的角度來說,這一段對應的熒光屏玻璃上就不 再有熒光粉了,但是電子槍還在繼續向下走,大家可以形象理解為顯示器下邊的黑邊。同樣 的,顯示器上邊也有這樣一段黑邊,在開始顯示有效數據之前,電子槍掃描到的這段區域同 樣也是沒有熒光粉的,不會顯示圖像, 這個區域稱為上邊界區域(vertical top border)

再來說說,電子槍什么時候會到最上方準備開始新一場圖像的掃描。當電子槍掃描一場圖像到達熒光屏的最下方后,其并不會自動回到最上邊準備下一場,而是需要有一個通知 信號,通知其回去,這個通知信號就是場同步信號脈沖(vertical sync pulse)。場同步信號是 一個脈沖,當該脈沖出現后,電子槍的指向會在一定時間內從最下方回到顯示屏的最上方。 而這個回去的過程需要耗費一定的時間,這個時間就稱為 vertical back porch。即出現場同步信號后,電子槍從顯示屏最下方回到最上方的時間。

當電子槍掃描過了下方沒有熒光粉的區域后,還沒有收到回到最上方的命令(場同步信號脈沖)之前,電子槍需要關閉以實現消隱,這個消隱的時間段就稱為 vertical front porch, 直觀一點理解就是完成了一場圖像的掃描,但還沒收到回到最上方命令之前的一段時間。、

行掃描時序圖?

場掃描時序圖

上述兩幅圖中,都只給出了時序參數的名稱,并沒有給出每個參數具體的值是多少。 而每個參數具體的值是多少,并不是固定的,而是根據需要掃描的有效圖像區域的大小確定 的。需要掃描的有效圖像區域的大小,一般用分辨率來表示。

?下表給出了若干個常見分辨率對應的行場時序中各個參數的具體數值,注意,這些參 數值中,行相關的參數都是以像素的更新頻率,也就是像素時鐘作為單位而場相關的參數, 則是以行作為單位。

分析

以800x480為例? 行同步信號分析

場同步信號分析

編寫邏輯代碼:

`timescale 1ns / 1ps
//800x480
//H_Right_Borde = 0      V_Bottom_Bord   =  8
//H_Front_Porch = 40     V_Front_Porch   =  2
//H_Sync_Time   = 128    V_Sync_Time     =  2
//H_Back_Porch  = 88     V_Back_Porch    =  25
//H_Left_Border = 0      V_Top_Border    =  8
//H_Data_Time   = 800    V_Data_Time     =  480
//H_Total_Time  = 1056   V_Total_Time    =  525module VGA_CTRL(Clk_33M   ,Reset_n   ,Data_in   ,hcount    ,   //行掃描位置(顯示圖像行掃描地址)vcount    ,   //場掃描位置(顯示圖像場掃描地址)VGA_HS    ,   //行同步信號VGA_VS    ,   //場同步信號VGA_BLK   ,   //有效數據輸出 VGA_CLK   ,   VGA_DATA      //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0]  );input            Clk_33M;input            Reset_n;input   [23:0]   Data_in;output  [10:0]   hcount;output  [10:0]   vcount;output           VGA_HS;output           VGA_VS;output           VGA_BLK;output           VGA_CLK;output  [23:0]   VGA_DATA;  //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0]  parameter  VGA_HS_end = 11'd127  ,hdat_begin = 11'd216  ,hdat_end   = 11'd1016 ,hpixel_end = 11'd1055 ,VGA_VS_end = 11'd1    , vdat_begin = 11'd35   ,vdat_end   = 11'd515  ,vline_end  = 11'd524  ;reg [10:0] hcount_r;reg [10:0] vcount_r;always@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)hcount_r <= 0; else if(hcount_r == hpixel_end )hcount_r <= 0;elsehcount_r <= hcount_r + 1'b1;always@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)vcount_r <= 0; else if(hcount_r == hpixel_end) if(vcount_r == vline_end )vcount_r <= 0;elsevcount_r <= vcount_r + 1'b1;elsevcount_r <= vcount_r;assign  VGA_BLK  =  ((hcount_r >= hdat_begin) && (hcount_r < hdat_end)&&(vcount_r >= vdat_begin) && (vcount_r < vdat_end)) ? 1'b1 : 1'b0;  assign  hcount   =   VGA_BLK ? (hcount_r - hdat_begin) : 10'd0;  assign  vcount   =   VGA_BLK ? (vcount_r - vdat_begin) : 10'd0;               assign  VGA_HS   =  (hcount_r > VGA_HS_end)? 1'b1 :1'b0;   assign  VGA_VS   =  (vcount_r > VGA_VS_end)? 1'b1 :1'b0;  assign  VGA_DATA =  (VGA_BLK) ? Data_in : 24'h000000;assign  VGA_CLK  =  ~Clk_33M;
endmodule

編寫測試程序:

`timescale 1ns / 1ps
module VGA_CTRL_tb;reg            Clk_33M;reg            Reset_n;reg   [23:0]   Data_in;wire  [10:0]   hcount;wire  [10:0]   vcount;wire           VGA_HS;wire           VGA_VS;wire           VGA_BLK;wire           VGA_CLK;wire  [23:0]   VGA_DATA;  //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0]  VGA_CTRL VGA_CTRL(.Clk_33M  (Clk_33M ) ,.Reset_n  (Reset_n ) ,.Data_in  (Data_in ) ,.hcount   (hcount  ) ,   //行掃描位置(顯示圖像行掃描地址).vcount   (vcount  ) ,   //場掃描位置(顯示圖像場掃描地址).VGA_HS   (VGA_HS  ) ,   //行同步信號.VGA_VS   (VGA_VS  ) ,   //場同步信號.VGA_BLK  (VGA_BLK ) ,   //有效數據輸出 .VGA_CLK  (VGA_CLK ) ,   .VGA_DATA (VGA_DATA)     //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0]  );initial Clk_33M = 1;always #15 Clk_33M = ~ Clk_33M;initial beginReset_n = 0;#201;Reset_n = 1;#200000000;$stop;  endalways@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)Data_in <= 1'b0;else if(!VGA_BLK)Data_in <= Data_in;elseData_in <= Data_in + 1'b1;
endmodule

仿真波形:

第一行開始時波形:

第一行結束時波形:

具體分析波形還需要從行同步脈沖時間,場同步脈沖時間,行消隱時間,場消隱時間,行數據傳輸時間,場數據傳輸結束時間等等,分析波形驗證邏輯代碼的正確性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 vs Rust應該學習哪個?

C語言 vs Rust應該學習哪個&#xff1f; 在開始前我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「C語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&am…

bun 文件類型

Typescript Bun 原生支持開箱即用的 TypeScript。所有文件在執行之前都由 Bun 的快速本機轉譯器即時轉譯。與其他構建工具類似&#xff0c;Bun 不執行類型檢查;它只是從文件中刪除類型注釋。 bun index.js bun index.jsx bun index.ts bun index.tsxBun 運行時行為的某些方面…

linux系統如何安裝nginx

首先下載nginx安裝包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解壓安裝包 tar -zxvf nginx-1.23.1.tar.gz如果服務器沒有wget&#xff0c;可以安裝一下&#xff0c;有的話可以跳過 yum install -y wget 然后安裝相關依賴 yum install -y gcc-c zlib zl…

最新企微hook開源版

免費的企微框架 支持文本消息&#xff0c;圖片消息&#xff0c;視頻消息&#xff0c;文件消息。 其他可自行下載測試。 有興趣可以進群交流。720192224 。群內不定期開源氣味hook源碼 BOOL WxWorkSendData(string data) { WX_GETOBJDATA obj { 0 }; //參數結構…

MATLAB練習題:排隊論問題的模擬

?講解視頻&#xff1a;可以在bilibili搜索《MATLAB教程新手入門篇——數學建模清風主講》。? MATLAB教程新手入門篇&#xff08;數學建模清風主講&#xff0c;適合零基礎同學觀看&#xff09;_嗶哩嗶哩_bilibili 下面我們來看一道排隊論的題目。假設某銀行工作時間內只有一個…

Kubernetes/k8s的核心概念

一、什么是 Kubernetes Kubernetes&#xff0c;從官方網站上可以看到&#xff0c;它是一個工業級的容器編排平臺。Kubernetes 這個單詞是希臘語&#xff0c;它的中文翻譯是“舵手”或者“飛行員”。在一些常見的資料中也會看到“ks”這個詞&#xff0c;也就是“k8s”&#xff…

如何解決代理ip服務器連接問題

在當今的數字化時代&#xff0c;互聯網連接已成為生活和工作中不可或缺的一部分。然而&#xff0c;在嘗試訪問互聯網資源時&#xff0c;用戶有時會遇到“代理服務器可能有問題&#xff0c;或地址不正確(你尚未連接)”的錯誤提示。這種情況通常表明計算機的網絡設置存在問題&…

自然語言處理之語言模型(LM):用c++通過自然語言處理技術分析語音信號音高

要通過自然語言處理技術分析語音信號音高&#xff0c;我們可以采用以下步驟&#xff1a; 首先&#xff0c;我們需要獲取語音信號的原始音頻數據。可以使用C中的音頻處理庫&#xff08;例如PortAudio或ALSA&#xff09;來捕獲音頻輸入并將其轉換為數字音頻數據。 接下來&#x…

python統計分析——廣義線性模型的評估

參考資料&#xff1a;用python動手學統計學 殘差是表現數據與模型不契合的程度的重要指標。 1、導入庫 # 導入庫 # 用于數值計算的庫 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 導入繪圖的庫 import matplotlib.pyplot as plt i…

mybatis中if的test如何判斷雙等號(==)

我們在寫mybatis.xml時往往會寫!&#xff0c;如&#xff1a; <if test"validType ! null and validType ! "> </if>當時如何判斷等于某一個值呢&#xff0c;如下將test的雙引號改為單引號&#xff0c;值用雙引號&#xff1a; <if testvalidType &q…

面經 | Java創建線程的三種方式

利用JUC包創建線程的三種方式&#xff1a; 通過繼承Thread類創建線程類實現Runnable接口創建線程類通過Callable和Future接口創建線程 繼承Thread類創建線程 class Thread1 extends Thread {Overridepublic void run() {System.out.println("啟動線程1");} }實現R…

第七篇:微信小程序的跳轉頁面

前提&#xff1a;建議還沒學HTML、CSS、JavaScript、JSON、vue、Ajax的兄弟姐妹們&#xff0c;先去把這些基礎補好過一遍&#xff0c;不然不好理解微信小程序 前面這一篇已經講過一次<navigator>跳轉頁面的用法了&#xff0c;今天詳細講解一下 回顧&#xff1a; 小程序…

Lesson 1 introduction of machine /deep learning

聽課&#xff08;李宏毅老師的&#xff09;筆記&#xff0c;方便梳理框架&#xff0c;以作復習之用。本節課主要介紹了什么是機器學習&#xff0c;機器學習的類型和流程&#xff0c;用一個現實中的例子詳細地展示了整個工作流程。 1. 機器學習的定義 2. 不同的函數類型 預測數…

MyBatis 學習(四)之 SQL 映射文件

目錄 1 SQL 映射文件介紹 2 select 元素 3 insert 元素 4 update 和 delete 元素 5 sql 元素 6 parameterType 元素 7 resultType 元素 8 resultMap 元素&#xff08;重要&#xff09; 9 參考文檔 1 SQL 映射文件介紹 映射器是 MyBatis 中最復雜并且是最重要的…

【軟考中級】系統集成項目管理工程師—案例分析基礎

軟考中級——系統集成項目管理工程師 案例分析基礎 考試時間及要求 中級考試案例分析5道題&#xff0c;時間150分鐘&#xff0c;時間充裕。&#xff08;高級考試案例分析3道題【高級一般第一題都是找錯、第二題改錯、第三題默寫】&#xff0c;時間90分鐘、平均每道題花30分鐘…

Vue(3.3.4)+three.js(0.161.0)實現3D可視化地圖

一.前言 由于最近在學習three.js,所以觀摩了一下掘金&#xff0c;csdn等網站上的有關這部分的內容&#xff0c;剛好看到一個帶你入門three.js——從0到1實現一個3d可視化地圖 - 掘金 (juejin.cn)&#xff0c;再加上我的專業屬性是地理相關&#xff0c;可以說是專業對口&#xf…

Java使用ffmpeg指令實現音頻格式轉換

針對Linux環境下如何安裝ffmpeg請看上一篇文章Linux上搭建并使用ffmpeg&#xff08;Java&#xff09;-CSDN博客 public static void voiceChangeFormat(String localPath, String targetPath) {List<String> command new ArrayList<>();command.add("ffmpeg…

存儲xss實現獲取cookie(本地實戰)

實戰更能體驗收獲&#xff01;&#xff01;&#xff01; 環境準備&#xff1a; 1.phpstudy 2.dvwa靶場 實戰 首先我們在phpstudy指定的localhost網站目錄下編寫一個xss.php文件&#xff0c;內容如下&#xff1a; <?php $cookie $_GET[cookie]; $ip getenv (REMOTE_…

electron+vue3全家桶+vite項目搭建【28】封裝窗口工具類【2】窗口組,維護窗口關系

文章目錄 引入實現效果思路主進程模塊渲染進程模塊測試效果 引入 demo項目地址 窗口工具類系列文章&#xff1a; 封裝窗口工具類【1】雛形 我們思考一下窗口間的關系&#xff0c;窗口創建和銷毀的一些動作&#xff0c;例如父子窗口&#xff0c;窗口組合等等&#xff0c;還有…

【前端素材】推薦優質在線高端家具電商網頁Classi平臺模板(附源碼)

一、需求分析 1、系統定義 在線高端家具商城是一個專門銷售高端家具產品的電子商務平臺&#xff0c;旨在為消費者提供購買高品質家具的便捷渠道。 2、功能需求 在線高端家具商城是一個專門銷售高端家具產品的電子商務平臺&#xff0c;旨在為消費者提供購買高品質家具的便捷…