基于FPGA的實時圖像處理系統(2)——VGA顯示彩條和圖片

VGA顯示彩條和圖片

文章目錄

  • VGA顯示彩條和圖片
    • 一、VGA簡介
    • 二、功能設計
      • 1、彩條設計
      • 2、圖片設計
    • 三、結果展示
    • 四、代碼

一、VGA簡介

VGA(Video Graphics Array)是IBM在1987年隨PS/2機?起推出的?種視頻,具有分辨率?、顯?速率快、顏?豐富等優點,在彩 ?顯?器領域得到了?泛的應?。不?持熱插拔,不?持?頻傳輸。對于?些嵌?式VGA顯?系統,可以在不使?VGA顯?卡和計算機的 情況下,實現VGA圖像的顯?和控制。VGA顯?器具有成本低、結構簡單、應?靈活的優點。

VGA的顯示原理是:CRT (陰極射線管)以“Z”型掃描的方式將陰極射線槍發出的電子束打在涂有熒光粉的災光屏上,廣土RUD 4日方換行的過程中,電下L一行,電子槍都要回到屏幕的下一行左邊的起始位置,并且在換行的過程中,電子槍需要消隱,避免破壞已經成像的像素。

在這里插入圖片描述
標準的VGA接口是15針的D型接口,分成3排,每排5個孔,是顯卡上應用最為廣泛的接口類型,絕大多數顯卡都帶有此種接口。它傳輸紅、綠、藍模擬信號以及同步信號(水平同步信號和垂直同步信號)。

在這里插入圖片描述
VGA的時序包括同步信號、消隱區,還有顏色數據的輸出。行場時序均可分為4部分:同步脈沖、顯示后沿、顯示時序、顯示前沿。

行掃描時序:

在這里插入圖片描述
同步脈沖a:代表新一行像素掃描的開始,同時也是上一行掃描的結束。
顯示時序c:是真正圖像的顯示區域,在此階段,像素逐個顯示出來,即在這一階段控制紅、綠、藍三基色信號輸出對應像素的 RGB值。
顯示后沿b和顯示前沿d:這兩個階段是消隱時刻,消隱區紅、綠、藍三基色信號都為0(黑色)或根據實際情況處理。

**場掃描時序:**時序與行掃描相同。

在這里插入圖片描述
有效區域

在這里插入圖片描述

常見VGA分辨率參數表

分辨率像素時鐘 (MHz)Active行有效區 (Pixels)Front Porch行顯示前沿 (Pixels)Sync Pulse行有效 (Pixels)Back Porch行顯示后沿 (Pixels)Total 行總像素(Pixels)Active 場有效區(Lines)Front Porch 場顯示前沿(Lines)Sync Pulse 場有效區(Lines)Back Porch 場顯示后沿(Lines)Total 場總像素(Lines)
640×480@6025.17564016964880048010233525
800×600@6040.000800401288810566001423628
1280×720@6074.25012801104022016507205520750
1024×768@6065.00010242413616013447683629806
1920×1080@60148.50192088441482200108045361125

本次運用的開發板通過權電阻網絡進行數模轉換

在這里插入圖片描述
可知采用的為RGB565格式。

二、功能設計

在了解了VGA時序之后,即可設計出完整的流程。
通過sw開關控制顯示彩條還是顯示圖片,VGA通過轉接線連至PC進行顯示。

在這里插入圖片描述

1、彩條設計

//colorbar(8個橫條紋)
always @(posedge clk or negedge rst_n)begin if(!rst_n)colorbar <= 16'h0000;else beginif((cnt_vsync >= `V_SP + `V_BP) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>3)))colorbar <= 16'hf8_00;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>2)))colorbar <= 16'hff_e0;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'h04_00;else if((cnt_vsync >= `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1)))colorbar <= 16'h80_10;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)))colorbar <= 16'h00_1f;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)))colorbar <= 16'hfd_20;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'hf7_be;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + `V_AV))colorbar <= 16'h80_10;else colorbar <= 16'h00_00;end
end

按照vga顯示時序,在有效區分成8個等分的區域,顯示八個彩條。

2、圖片設計

采用一個ROM,將圖片數據存入ROM,由于開發板資源有限,圖片只能采用一個極小的格式進行存儲。

ken_rom	ken_rom_inst (.address ( address ),.clock ( clk ),.q ( data ));always @( posedge clk or negedge rst_n ) beginif ( !rst_n ) beginaddress <= 0;// 復位時清零ROM地址endelse if ( flag_clear_rom_address ) begin //計數滿清零address <= 0;endelse if (( (cnt_hsync >= 144) && (cnt_hsync < 233) ) && ((cnt_vsync >= 35) && (cnt_vsync < 161)))begin  //在有效區域內+1address <= address + 1;endelse begin  //無效區域保持address <= address;end
end
assign flag_clear_rom_address = ((address == 11214 - 1) );

(ps:本次主要為驗證VGA功能,ROM的地址選擇和圖片的位圖有些缺點)

三、結果展示

開關為01,顯示圖片(地址有誤導致圖片錯位)

在這里插入圖片描述

開關撥到其他位置顯示彩條

在這里插入圖片描述

四、代碼

1、top

module top (input           clk      ,input           rst_n    ,input    [1:0]  sw       ,output          hsync    ,output          vsync    ,output   [15:0] vga_data
);wire  [15:0]  colorbar;
wire  [10:0]  cnt_hsync;
wire  [10:0]  cnt_vsync;
wire  [15:0]  ken_data;color_bar       inst_color_bar(.clk        (clk      ),.rst_n      (rst_n    ),.cnt_hsync  (cnt_hsync),.cnt_vsync  (cnt_vsync),.colorbar   (colorbar )
);vga_driver      inst_vga_driver(.clk        (clk      ),.rst_n      (rst_n    ),.sw         (sw       ),.ken_data   (ken_data ),.colorbar   (colorbar ),.hsync      (hsync    ),.vsync      (vsync    ),.cnt_hsync  (cnt_hsync),.cnt_vsync  (cnt_vsync),.h_vld      (h_vld    ),.v_vld      (v_vld    ),.vga_data   (vga_data )
);picture inst_picture(.clk        (clk),.rst_n      (rst_n),.sw         (sw),.cnt_hsync  (cnt_hsync),.cnt_vsync  (cnt_vsync),.data       (ken_data)
);endmodule

2、color_bar

`include "param.v"   module color_bar( input               clk      ,input               rst_n    ,input       [10:0]	cnt_hsync,input       [10:0]	cnt_vsync,output reg  [15:0]  colorbar      
);//colorbar(8個橫條紋)
always @(posedge clk or negedge rst_n)begin if(!rst_n)colorbar <= 16'h0000;else beginif((cnt_vsync >= `V_SP + `V_BP) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>3)))colorbar <= 16'hf8_00;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>2)))colorbar <= 16'hff_e0;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'h04_00;else if((cnt_vsync >= `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1)))colorbar <= 16'h80_10;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)))colorbar <= 16'h00_1f;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)))colorbar <= 16'hfd_20;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'hf7_be;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + `V_AV))colorbar <= 16'h80_10;else colorbar <= 16'h00_00;end
endendmodule

3、picture

`include "param.v"module picture(input           clk,input           rst_n,input   [1:0]   sw,input   [10:0]  cnt_hsync,input   [10:0]  cnt_vsync,output  [15:0]  data
);wire    flag_clear_rom_address;reg   [14:0]  address;ken_rom	ken_rom_inst (.address ( address ),.clock ( clk ),.q ( data ));always @( posedge clk or negedge rst_n ) beginif ( !rst_n ) beginaddress <= 0;// 復位時清零ROM地址endelse if ( flag_clear_rom_address ) begin //計數滿清零address <= 0;endelse if (( (cnt_hsync >= 144) && (cnt_hsync < 233) ) && ((cnt_vsync >= 35) && (cnt_vsync < 161)))begin  //在有效區域內+1address <= address + 1;endelse begin  //無效區域保持address <= address;end
end
assign flag_clear_rom_address = ((address == 11214 - 1) );
endmodule

4、vga_driver

`include "param.v"   module vga_driver( input               clk      ,input               rst_n    ,input        [1:0]  sw       ,input       [15:0]  colorbar ,   //RGB565   input       [15:0]  ken_data , output              hsync    ,output              vsync    ,output  reg [10:0]	cnt_hsync,output  reg	[10:0]	cnt_vsync,output              h_vld    ,output              v_vld    ,output  reg [15:0]  vga_data
);wire			add_cnt_vsync;
wire			end_cnt_vsync;wire			add_cnt_hsync;
wire			end_cnt_hsync;//行同步always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_hsync <= 'd0;end else if(add_cnt_hsync)begin if(end_cnt_hsync)begin cnt_hsync <= 'd0;endelse begin cnt_hsync <= cnt_hsync + 1'b1;end end
end assign add_cnt_hsync = 1;
assign end_cnt_hsync = add_cnt_hsync && cnt_hsync == `H_TOTAL -1;//場同步always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_vsync <= 'd0;end else if(add_cnt_vsync)begin if(end_cnt_vsync)begin cnt_vsync <= 'd0;endelse begin cnt_vsync <= cnt_vsync + 1'b1;end end
end assign add_cnt_vsync = end_cnt_hsync;
assign end_cnt_vsync = add_cnt_vsync && cnt_vsync == `V_TOTAL - 1;//hsync
assign  hsync   =   (cnt_hsync < `H_SP  )? 1'b0 : 1'b1;
//vsync
assign  vsync   =   (cnt_vsync < `V_SP  )? 1'b0 : 1'b1;//h_vld
assign  h_vld   =   (cnt_hsync >= `H_SP + `H_BP) && (cnt_hsync < `H_TOTAL - `H_FP);
//v_vld
assign  v_vld   =   (cnt_vsync >= `V_SP + `V_BP) && (cnt_vsync < `V_TOTAL - `V_FP);//vga_dataalways @(*)begincase(sw)2'b01 : vga_data = (( (cnt_hsync >= 144) && (cnt_hsync < 233) ) && ((cnt_vsync >= 35) && (cnt_vsync < 161))) ? ken_data : 16'h0000;default:vga_data = (h_vld && v_vld) ? colorbar : 16'd0;endcase
endendmodule

5、param

`define PIXEL_640_480
// `define PIXEL_800_600
// `define PIXEL_1920_1080`ifdef PIXEL_640_480
//行同步信號`define H_SP    96`define H_BP    48  //顯示后沿`define H_AV    640 //有效區域`define H_FP    16  //顯示前沿`define H_TOTAL 800 //總像素//場同步信號`define V_SP    2`define V_BP    33  //顯示后沿`define V_AV    480 //有效區域`define V_FP    10  //顯示前沿`define V_TOTAL 525 //總像素`elsif PIXEL_800_600
//行同步信號`define H_SP    128`define H_BP    88  //顯示后沿`define H_AV    800 //有效區域`define H_FP    40  //顯示前沿`define H_TOTAL 1056 //總像素//場同步信號`define V_SP    4`define V_BP    23  //顯示后沿`define V_AV    600 //有效區域`define V_FP    1  //顯示前沿`define V_TOTAL 628 //總像素`elsif PIXEL_1920_1080
//行同步信號`define H_SP    44`define H_BP    148  //顯示后沿`define H_AV    1920 //有效區域`define H_FP    88  //顯示前沿`define H_TOTAL 2200 //總像素//場同步信號`define V_SP    5`define V_BP    36  //顯示后沿`define V_AV    1080 //有效區域`define V_FP    4  //顯示前沿`define V_TOTAL 1125 //總像素
`endif

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

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

相關文章

【網絡運維】Linux 文本處理利器:sed 命令

Linux 文本處理利器&#xff1a;sed 命令 sed 簡介 sed&#xff08;Stream Editor&#xff09;是一款非交互式的流編輯器&#xff0c;誕生于 1973–1974 年間的貝爾實驗室&#xff0c;由 McMahon 開發。它專為文本處理而生&#xff0c;功能強大&#xff0c;是 Linux 文本處理常…

week2-[一維數組]出現次數

week2-[一維數組]出現次數 題目描述 給定 NNN 個整數A1,A2,…,ANA_1,A_2,\ldots,A_NA1?,A2?,…,AN?。請求出這 NNN 個數中出現次數最多的數的出現次數&#xff0c;以及出現次數最少的數的出現次數。 輸入格式 讀入包括 222 行。第一行只有 111 個整數 NNN&#xff0c;表示數…

力扣 hot100 Day79

215. 數組中的第K個最大元素 給定整數數組 nums 和整數 k&#xff0c;請返回數組中第 k 個最大的元素。 請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 你必須設計并實現時間復雜度為 O(n) 的算法解決此問題。 class…

C++圍繞音視頻相關的資料都有哪些?如何進行學習

音視頻技術涉及的內容廣泛而深入。我會根據自己的知識給你提供一個系統性的音視頻相關資料梳理&#xff0c;主要分為學習路徑與核心知識、開源項目與實戰、開發者資源以及熱點與趨勢幾個方面&#xff0c;希望能幫助你高效地學習和探索。 先用一個表格來概覽主要的學習方向和資…

AI自動化測試,解決傳統自動化測試中??腳本維護成本高、用例覆蓋不全、缺陷發現滯后??等痛點

AI自動化測試&#xff0c;解決傳統自動化測試中??腳本維護成本高、用例覆蓋不全、缺陷發現滯后??等痛點AI自動化測試通過機器學習&#xff08;ML&#xff09;、自然語言處理&#xff08;NLP&#xff09;、計算機視覺&#xff08;CV&#xff09;等技術&#xff0c;解決了傳統…

Laravel 事件與監聽器

下面是一個完整的用戶注冊事件和監聽器的實現示例&#xff0c;包含事件、監聽器、注冊、觸發等完整流程。一、軟件版本 php: 8.2.20laravel: 11mysql: 8.0.29 二、完整實現過程 1.創建事件 1.1 首先創建用戶注冊事件 php artisan make:event UserRegistered1.2 編輯app/Events/…

前端 React 實現數據懶加載-滾動觸底加載數據

在 React 中使用 Intersection Observer API 實現觸底加載分頁&#xff08;無限滾動&#xff09;1.基本實現思路 在列表底部放置一個 哨兵元素&#xff08;Sentinel&#xff09;&#xff08;如 <div>&#xff09;。使用 IntersectionObserver 監聽該元素是否進入視口&…

MySQL 50 道經典練習題及答案

目錄 一、數據表設計與初始化 1. 數據表結構說明 2. 建表語句 3. 插入測試數據 二、練習題及答案 1. 查詢 "01" 課程比 "02" 課程成績高的學生的信息及課程分數 2. 查詢同時存在 "01" 課程和 "02" 課程的情況 3. 查詢存在 &qu…

電競護航小程序搭建三角洲俱樂部護航派單小程序開發游戲派單系統定制開發

成品系統&#xff0c;可以快速搭建。功能概述&#xff1a;商家入駐、老板點單、快捷發單、自定義發單、發單列表、管事入駐、訂單審核裁決、打手入駐、打手排行榜、邀請排行榜、賬戶充值、余額提現、成為客服等

MYSQL-增刪查改CRUD

目錄 &#x1f33f;前言&#xff1a; &#x1f33f;增-C-Create-新增 &#x1f9ca;單行數據全列插入 &#x1f34b;?&#x1f7e9;語法&#xff1a; &#x1f34b;?&#x1f7e9;演示&#xff1a; &#x1f9ca;指定列插入 &#x1f34b;?&#x1f7e9;語法&#xf…

【Loss學習筆記】Focal loss、QFL、DFL、VFL——目標檢測定位損失函數詳解

文章目錄Focal loss&#xff08;2018 ICCV &#xff0c;RetinaNet&#xff09;1、Focal Loss 提出背景問題一&#xff1a;正負樣本數量不均衡問題問題二&#xff1a;難分類/易分類樣本數量不均衡問題對兩個問題的解決2、正負樣本數量不均衡問題的解決&#xff1a;Focal loss 的…

nertctl使用了解

測試了幾個容器&#xff0c;似乎未對k8s的containerd產生影響&#xff0c;都能訪問 再次測試&#xff0c;containerd發生了重啟&#xff0c;nrtdctl啟動的容器都沒了 #### sealos 創建containerd集群 sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29…

三、k8s 1.29 之 資源清單

一、什么是資源 資源(Resources) 是指集群中可被分配、管理和調度的各種實體,既包括計算、存儲、網絡等基礎設施資源,也包括 K8s 自身定義的 API 對象(如 Pod、Deployment 等)。這些資源是 K8s 調度和管理工作負載的核心基礎。 Kubernetes 中的資源本質上是 “可被操作的…

React中常用的Hook(useEffect、useRef、useMemo、useNavigate、useParams)

React hook1&#xff1a;useEffect 在編程中&#xff0c;副作用是指函數或表達式在執行過程中對外部環境產生影響的行為。例如&#xff1a; 修改外部變量&#xff08;如全局變量、DOM、API 請求、設置定時器等&#xff09; 什么是純函數&#xff1f; // 純函數&#xff1a;輸入…

關聯規則挖掘1:Apriori算法

目錄 一、Apriori算法核心原理 1. 基本概念 2. Apriori性質 二、完整案例計算&#xff08;超市購物數據&#xff09; ?步驟1&#xff1a;按字母序重排每筆交易? ?步驟2&#xff1a;統計頻繁1-項集&#xff08;min_support40%&#xff09;?? ?步驟3&#xff1a;生成…

基于 C++ 線程池的多線程目標檢測后處理系統設計與實現

在實際的智能視頻分析系統中,目標檢測(如 YOLOv5)只是第一步。檢測結果往往需要進行后續處理:畫框、報警、推流、日志記錄等。這些操作如果在檢測主線程中同步執行,會嚴重拖慢整體推理速度。 本文將帶你從零實現一個基于 C++ 模板線程池的異步后處理系統,實現“檢測與后…

Java并發容器詳解

1. JUC并發容器概述 Java集合容器框架主要有四大類別&#xff1a;List、Set、Queue、Map。常見的ArrayList、LinkedList、HashMap等容器都是非線程安全的。 Java提供了同步容器&#xff08;如Vector、Hashtable、SynchronizedList&#xff09;通過synchronized實現同步&#xf…

SpringAI系列---【SpringA集成OllamaI如何先調用向量庫,再把查到的結果一起傳給大模型?】

SpringAI如何先調用向量庫&#xff0c;再把查到的結果一起傳給大模型&#xff1f; 1.引入pom <dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></depend…

告別“測試滯后”:AI實時測試工具在敏捷開發中的落地經驗

告別“測試滯后”&#xff1a;AI實時測試工具在敏捷開發中的落地經驗 在敏捷開發的“快速迭代”節奏中&#xff0c;測試環節常常成為“拖后腿”的短板。某互聯網公司的敏捷團隊曾陷入這樣的循環&#xff1a;2周迭代周期中&#xff0c;開發用10天完成功能&#xff0c;留給測試的…

K8S-Pod資源對象

一、K8S架構與組件1、K8S架構k8s 總體架構采用了經典的 maste/slave 架構模式&#xff0c;分 master 節點和 worker 節點&#xff0c;節點可以是虛擬機也可以是物理機。K8S組件 master 節點組件Kube-apiserver 用于暴露 Kubernetes API&#xff0c;任何資源請求或調用操作都是通…