新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于STEP FPGA的8色VGA功能驅動

        基于STEP FPGA的8色VGA功能驅動

        作者: 時間:2023-12-04 來源:電子森林 收藏

        硬件說明

        VGA(video graphics array)即視頻圖形陣列,是IBM在1987年隨PS/2一起推出的使用模擬信號的一種視頻傳輸標準。VGA接口分公口和母口,如下圖:

        本文引用地址:http://www.104case.com/article/202312/453513.htm

        VGA接口引腳定義如下:

        一個標準的VGA接口應該有以下端口:

        • 紅綠藍三色信號(RGB)
        • 行場同步信號(HSVS)
        • 以及很多的地屏蔽;

        三色信號都是模擬信號,行場同步信號都是數字信號;
        對于VGA的接口模擬電壓,為0~0.714V,0代表無色,0.714代表滿色,FPGA輸出3.3V,所以還必須要經過DAC的轉換。現今有兩種比較成熟的方法:電阻分壓方式和DAC轉換方式。
        我們的底板上就是采用的電阻分壓的方式,因VGA顯示器端有75歐的下拉電阻,為了得到0.714V的電壓我們給RGB信號線上串入270歐的電阻,3.3V*75/(270+75)=0.717V。如下

        VGA驅動顯示器用的是掃描的方式,逐行掃描the HS (Horizontal Synchronization)逐行掃描是掃描從屏幕的左上角一點開始,由左向右逐點掃描,每掃描完一行,電子束回到屏幕的左邊下一行的起始位置,在這期間CRT(陰極射線顯像管)對電子束進行消隱,每行結束時,用行同步信號進行同步;當掃描完所有行之后形成一幀,用場同步信號進行同步,并使掃描回到屏幕左上方,同時進行場消隱,開始下一幀。VGA一直在掃描,每一場的掃描包括了若干行掃描,依次循環;
        VGA顯示時序如下:
        VGA顯示區域和消隱區域:
        常見的VGA顯示模式:


        Verilog代碼

        // --------------------------------------------------------------------
        // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
        // --------------------------------------------------------------------
        // Module: Param_define
        // 
        // Author: Step
        // 
        // Description: Param_define
        //
        // --------------------------------------------------------------------
        // Code Revision History :
        // --------------------------------------------------------------------
        // Version: |Mod. Date:   |Changes Made:
        // V1.1     |2016/10/30   |Initial ver
        // --------------------------------------------------------------------
        `timescale 1ns / 1ns 
        //VGA顯示器驅動只需要5個信號即可(行同步、場同步、紅色、綠色、藍色信號)
        //紅綠藍三色信號為模擬信號,輸入電壓范圍為0.0V~0.7V
        //VGA時序中行同步和場同步都分為四個階段(同步脈沖、后廊、有效線數、前廊)
        //VGA顯示有很多模式,每種模式都是有固定的時鐘和時序參數,需要根據要求控制 
        `ifdef VGA_800X600_60Hz	
        //不同VGA顯示模式相應的參數
        //---------------------------------------------------------------------------
        //-- Horizonal timing information`define HSYNC_A   16'd128	
        // 128`define HSYNC_B   16'd216	
        // 128 + 88	`define HSYNC_C   16'd1016	
        // 128 + 88 + 800`define HSYNC_D   16'd1056	
        // 128 + 88 + 800 + 40 
        //行同步脈沖+后廊+有效線數+前廊
        //-- Vertical  timing information`define VSYNC_O   16'd4		
        // 4 `define VSYNC_P   16'd27	
        // 4 + 23`define VSYNC_Q   16'd627	
        // 4 + 23 + 600`define VSYNC_R   16'd628	
        // 4 + 23 + 600 + 1 //場同步脈沖+后廊+有效線數+前廊
        //---------------------------------------------------------------------------
        `endif `ifdef VGA_640X480_85Hz	
        //不同VGA顯示模式相應的參數
        //---------------------------------------------------------------------------
        //-- Horizonal timing information`define HSYNC_A   16'd48	
        // 48`define HSYNC_B   16'd160	
        // 48 + 112`define HSYNC_C   16'd800	
        // 48 + 112 + 640`define HSYNC_D   16'd832	
        // 48 + 112 + 640 + 32 
        //行同步脈沖+后廊+有效線數+前廊
        //-- Vertical  timing information`define VSYNC_O   16'd3		
        // 3 `define VSYNC_P   16'd28	
        // 3 + 25`define VSYNC_Q   16'd508	
        // 3 + 25 + 480`define VSYNC_R   16'd509	
        // 3 + 25 + 480 + 1 
        //場同步脈沖+后廊+有效線數+前廊
        //---------------------------------------------------------------------------
        `endif
        // --------------------------------------------------------------------
        // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
        // --------------------------------------------------------------------
        // Module: Vga_Module
        // 
        // Author: Step
        // 
        // Description: Vga_Module
        // 
        // --------------------------------------------------------------------
        // Code Revision History :
        // --------------------------------------------------------------------
        // Version: |Mod. Date:   |Changes Made:
        // V1.1     |2016/10/30   |Initial ver
        // --------------------------------------------------------------------
        `define		VGA_800X600_60Hz	
        //定義使用的VGA顯示模式 
        `ifdef		VGA_800X600_60Hz	//根據VGA顯示模式的定義調用相應的參數
        `include	"Param_define.v"	//調用Param_define.v文件中的全局定義
        `endif	 
        module Vga_Module
        (
        input 					clk_in,				//40MHz系統時鐘
        input 					rst_n_in,			//系統復位,低有效
        output 	reg				sync_v,				//VGA場同步sync_v
        output 	reg				sync_h,				//VGA行同步sync_h
        output  reg		[2:0]	vga_data			//VGA數據MSB~LSB = {R,G,B}
        ); 
        reg 			[15:0] 	x_cnt;
        reg 			[15:0] 	y_cnt;
        reg 					vga_valid;	 //對時鐘計數標識VGA一次行掃描需要的時間
        always @ (posedge clk_in or negedge rst_n_in)
        	if(!rst_n_in) x_cnt <= 16'd0;	//復位時初始值
        	else if(x_cnt >= `HSYNC_D) x_cnt <= 16'd0;	//一次行掃描需要1056個時鐘(128+88+800+40)
        	else x_cnt <= x_cnt + 1'b1; //對行掃描計數標識VGA一次場掃描需要的時間
        	always @ (posedge clk_in or negedge rst_n_in)
        	if(!rst_n_in) y_cnt <= 16'd0;	//復位時初始值
        	else if(x_cnt == `HSYNC_D) begin	//每次行掃描時
        		if(y_cnt >= `VSYNC_R) y_cnt <= 16'd0;	//每次場掃描包含628次行掃描
        		else y_cnt <= y_cnt + 1'b1;
        	end else y_cnt <= y_cnt;	
        	//在每次行掃描過程中場掃描計數器保持不變 
        	//按照顯示模式的參數產生行同步掃描的脈沖
        	always @ (posedge clk_in or negedge rst_n_in)
        	if(!rst_n_in) sync_h <= 1'b1;
        	else if(x_cnt < `HSYNC_A) sync_h <= 1'b0;	
        	else sync_h <= 1'b1;	 //按照顯示模式的參數產生場同步掃描的脈沖
        	always @ (posedge clk_in or negedge rst_n_in)
        	if(!rst_n_in) sync_v <= 1'b1;
        	else if(y_cnt < `VSYNC_O) sync_v <= 1'b0;
        	else sync_v <= 1'b1;	 //根據行場同步信號的有效線數確定有效顯示區域
        	always @ (posedge clk_in or negedge rst_n_in)
        	if(!rst_n_in) 
        		vga_valid <= 1'b0;
        	else if((x_cnt > `HSYNC_B) && (x_cnt <`HSYNC_C) && (y_cnt > `VSYNC_P) && (y_cnt < `VSYNC_Q))
        		vga_valid <= 1'b1; //有效顯示區域中vga_valid標志為1
        	else
        		vga_valid <= 1'b0;	 //在VGA有效顯示區域不同的段顯示不同的顏色
        		always @ (posedge clk_in or negedge rst_n_in)begin
        	if(!rst_n_in) vga_data = 3'b111;
        	else if(vga_valid)begin	//在有效顯示區域內
        		if((x_cnt > `HSYNC_B) && (x_cnt <= `HSYNC_B + 10'd100))					
        			vga_data = 3'b100;			//紅色
        		else if((x_cnt > `HSYNC_B + 10'd100) && (x_cnt <= `HSYNC_B + 10'd200))	
        			vga_data = 3'b010;			//綠色
        		else if((x_cnt > `HSYNC_B + 10'd200) && (x_cnt <= `HSYNC_B + 10'd300))	
        			vga_data = 3'b001;			//藍色
        		else if((x_cnt > `HSYNC_B + 10'd300) && (x_cnt <= `HSYNC_B + 10'd400))	
        			vga_data = 3'b110;			//黃色
        		else if((x_cnt > `HSYNC_B + 10'd400) && (x_cnt <= `HSYNC_B + 10'd500))	
        			vga_data = 3'b101;			//紫色
        		else if((x_cnt > `HSYNC_B + 10'd500) && (x_cnt <= `HSYNC_B + 10'd600))	
        			vga_data = 3'b011;			//青色
        		else if((x_cnt > `HSYNC_B + 10'd600) && (x_cnt <= `HSYNC_B + 10'd700))	
        			vga_data = 3'b111;			//白色
        		else if((x_cnt > `HSYNC_B + 10'd700) && (x_cnt <= `HSYNC_B + 10'd800))	
        			vga_data = 3'b000;			//黑色
        		else
        			vga_data = 3'b111;			//白色
        	end else
        		vga_data = 3'b111;				//白色end endmodule

        小結

        本節主要為大家講解了VGA顯示的原理、時序及軟件設計,需要大家掌握的同時自己創建工程,通過整個設計流程,生成FPGA配置文件加載測試。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 望谟县| 海林市| 鹿邑县| 浪卡子县| 彩票| 琼结县| 新丰县| 藁城市| 金溪县| 平凉市| 邮箱| 舒城县| 武宁县| 慈利县| 宁强县| 黄陵县| 栾城县| 平乡县| 调兵山市| 修文县| 大竹县| 德钦县| 扶风县| 延安市| 安岳县| 淮北市| 海原县| 重庆市| 临海市| 罗城| 沅江市| 沈阳市| 大埔县| 新沂市| 贵州省| 麻江县| 酒泉市| 涿鹿县| 盖州市| 东安县| 衡东县|