VGA接口复习笔记(原理,时序)VGA接口FPGA实现

本文详细介绍了VGA显示器的工作原理,包括逐行和隔行扫描方式,以及行扫描时间、场扫描时间和带宽等概念。接着讲解了VGA时序,包括行数据时序和帧时序,以及行同步、场同步信号的产生。在FPGA实现部分,展示了如何通过视频PLL模块生成所需时钟,并利用彩条生成模块产生8种颜色的彩条图像,最后通过VGA显示模块在显示器上显示。程序中预设了多种分辨率的时序参数,以适应不同的显示需求。
摘要由CSDN通过智能技术生成

VGA接口复习笔记(原理,时序)VGA接口FPGA实现

一、显示器工作原理

显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一行,完成一屏后再返回来扫描剩下的行,隔行扫描的显示器闪烁的厉害,会让使用者的眼睛疲劳。
完成一行扫描的时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频率,即刷新一屏的频率,常见的有60Hz,75Hz等等。标准的VGA显示的场频60Hz,行频31.5KHz。
行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是一个道理。
显示带宽:带宽指的显示器可以处理的频率范围。显示带宽代表显示器显示能力的一个综合指标,指每秒钟所扫描的图素个数。计算公式:B= r(x) × r(y) × V。如果是60Hz刷新频率的VGA,其带宽达640x480x60=18.4MHz,70Hz的刷新频率1024x768分辨率的SVGA,其带宽达1024x768x70=55.1MHz。

二、VGA时序

行数据时序
VGA行数据时序
显示一行数据需要处理两件事:产生行同步信号HSYNC;产生显示的数据信号。
行同步是周期性脉冲信号,周期就是一行的时间e=a+b+c+d,因分辨率不同而有所差异; 而数据信号为模拟信号,当在显示有效数据(Active video)内,DATA信号为0-0.174Vpp的模拟电压(R、G、B)。
VGA需要的是模拟信号,而FPGA提供的是数字信号,因此还需要专用的DAC芯片进行数模转换。很多开发板为了节省成本,会选择用电阻网络R-2R作为视频DAC(黑金AX516开发板就是如此)。

AX516VGA电路图
在这里插入图片描述
帧时序
在这里插入图片描述
VESA中定义行时序和场时序都需要同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四部分。VGA工业标准显示模式要求:行同步,场同步都为负极性,即同步脉冲要求是负脉冲。

由VGA的行时序可知:每一行都有一个负极性行同步脉冲(Sync a),是数据行的结束标志,同时也是下一行的开始标志。在同步脉冲之后为显示后沿(Back porch b),在显示时序段(Display interval c)显示器为亮的过程,RGB数据驱动一行上的每一个像素点,从而显示一行。在一行的最后为显示前沿(Front porch d)。在显示时间段(Display interval c)之外没有图像投射到屏幕是插入消隐信号。同步脉冲(Sync a)、显示后沿(Back porch b)和显示前沿(Front porch d)都是在行消隐间隔内(Horizontal Blanking Interval),当消隐有效时,RGB信号无效,屏幕不显示数据。
VGA的场时序与行时序基本一样,每一帧的负极性脉冲(Sync a)是一帧的结束标志,同时也是下一帧的开始标志。而显示数据是一帧的所有行数据。

在这里插入图片描述在这里插入图片描述
三.其他显示器时钟分布情况
在这里插入图片描述
四FPGA时序实现
实现 VGA 输出显示,在 VGA 显示器里显示测试的彩条图像。程序由 2 个模块实现, 分别是时钟模块 vidio_pll, 彩条生成模块 color_bar。

逻辑框图
在这里插入图片描述
1. 顶层模块及VGA 时钟模块video_pll
video_pll 模块是倍频产生模块,通过输入的 clk 时钟产生 VGA 显示所需要的时钟信号, 模块中设置为 65MHz,用来满足 VGA 分辨率为 1024x768 的要求。

//
//  BISTU                                                 //
//                                                                              //
//  Author: 田彦祖    202.6.4
//                                                         //                                                                            //
//

//================================================================================

//================================================================================
//  Revision History:
//  Date          By            Revision    Change Description
//--------------------------------------------------------------------------------
//2017/7/20                    1.0          Original
//*******************************************************************************/
module top
(
	        input                       clk,
	        input                       rst_n,
	        //vga output        
	        output                      vga_out_hs, //vga horizontal synchronization   行同步	      
	        output                      vga_out_vs, //vga vertical synchronization     场同步      
	        output[4:0]                 vga_out_r,  //vga red	红
	        output[5:0]                 vga_out_g,  //vga green	绿
	        output[4:0]                 vga_out_b   //vga blue  蓝
);

wire                            video_clk;
wire                            video_hs;
wire                            video_vs;
wire                            video_de;
wire[7:0]                       video_r;
wire[7:0]                       video_g;
wire[7:0]                       video_b;

wire                            osd_hs;
wire                            osd_vs;
wire                            osd_de;
wire[7:0]                       osd_r;
wire[7:0]                       osd_g;
wire[7:0]                       osd_b;


assign vga_out_hs = osd_hs;
assign vga_out_vs = osd_vs;
assign vga_out_r  = osd_r[7:3]; //discard low bit data读取数据位
assign vga_out_g  = osd_g[7:2]; //discard low bit data读取数据位
assign vga_out_b  = osd_b[7:3]; //discard low bit data读取数据位

//generate video pixel clock
//生成视频像素时钟
IBUFG IBFG_INST
(     .O(clk_bufg),
      .I(clk)
);

video_pll video_pll_m0
(
	.clk_in(clk_bufg),
	.video_clk(video_clk),
	.reset(~rst_n),
	.locked(locked)
);
//	彩条产生模块
color_bar color_bar_m0
(
	.clk(video_clk),
	.rst(~rst_n),
	.hs(video_hs),
	.vs(video_vs),
	.de(video_de),
	.rgb_r(video_r),
	.rgb_g(video_g),
	.rgb_b(video_b)
);
//VGA显示窗口
osd_display  osd_display_m0
(
	.rst_n                 (rst_n                      ),//系统复位
	.pclk                  (video_clk                  ),//时钟输入
	.i_hs                  (video_hs                   ),//行同步
	.i_vs                  (video_vs                   ),//场同步
	.i_de	                 (video_de                   ),//像素数据有效
	.i_data                ({video_r,video_g,video_b}  ),//rgb像素数据输出
	.o_hs                  (osd_hs                     ),//输出行同步
	.o_vs                  (osd_vs                     ),//输出场同步
	.o_de                  (osd_de                     ),//输出像素数据有效
	.o_data                ({osd_r,osd_g,osd_b}        )//输出像素数据
);

endmodule 

2. 彩条产生模块color_bar.v
color_bar.v 是产生 8 种颜色的 VGA 格式的彩条,彩条分别为白、黄、青、绿、紫、红、蓝和 黑。针对 VGA 的时序,行同步和场同步各使用一个计数器,行同步计数器用于产生行同步,行有 效像素,场同步计数器用于产生场同步,场有效像素。同时根据计数器的值可以产生水平(X) 和垂直(Y)坐标,通过坐标信息,可以实时显示一些图形。程序中预设了几种分辨率的时序参数, 包括 2 款 LCD 液晶屏的,为后续的 LCD 验证试验做准备。

//
//  BISTU                                                 //
//                                                                              //
//  Author: 田彦祖    202.6.4
//                                                         //                                                                            //
//

//================================================================================

//*******************************************************************************/
`include "video_define.v"
module color_bar(
	input                 clk,           //pixel clock  像素时钟
	input                 rst,           //reset signal high active  复位信号高电平有效
	output                hs,            //horizontal synchronization  行同步
	output                vs,            //vertical synchronization	场同步
	output                de,            //video valid						视频信号可用
	output[7:0]           rgb_r,         //video red data				红色像素数据	
	output[7:0]           rgb_g,         //video green data			绿色像素数据
	output[7:0]           rgb_b          //video blue data			蓝色像素数据
);
//video timing parameter definition  视频时序参数定义 参照显示器时钟分布表
`ifdef  VIDEO_1280_720
parameter H_ACTIVE = 16'd1280;           //horizontal active time (pixels)  行视频有效像素
parameter H_FP = 16'd110;                //horizontal front porch (pixels)	行显示前沿
parameter H_SYNC = 16'd40;               //horizontal sync time(pixels)		行同步脉冲
parameter H_BP = 16'd220;                //horizontal back porch (pixels)	行显示后沿
parameter V_ACTIVE = 16'd720;            //vertical active Time (lines)		场视频有效像素
parameter V_FP  = 16'd5;                 //vertical front porch (lines)		场显示前沿
parameter V_SYNC  = 16'd5;               //vertical sync time (lines)		场同步脉冲
parameter V_BP  = 16'd20;                //vertical back porch (lines)		场显示后沿
parameter HS_POL = 1'b1;                 //horizontal sync polarity, 1 : POSITIVE,0 : NEGATIVE; 行同步脉冲极性设置
parameter VS_POL = 1'b1;                 //vertical sync polarity, 1 : POSITIVE,0 : NEGATIVE;	场同步脉冲极性设置
`endif

//480x272 9Mhz
`ifdef  VIDEO_480_272
parameter H_ACTIVE = 16'd480; 
parameter H_FP = 16'd2;       
parameter H_SYNC = 16'd41;    
parameter H_BP = 16'd2;       
parameter V_ACTIVE = 16'd272; 
parameter V_FP  = 16'd2;     
parameter V_SYNC  = 16'd10;   
parameter V_BP  = 16'd2;     
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//640x480 25.175Mhz
`ifdef  VIDEO_640_480
parameter H_ACTIVE = 16'd640; 
parameter H_FP = 16'd16;      
parameter H_SYNC = 16'd96;    
parameter H_BP = 16'd48;      
parameter V_ACTIVE = 16'd480; 
parameter V_FP  = 16'd10;    
parameter V_SYNC  = 16'd2;    
parameter V_BP  = 16'd33;    
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//800x480 33Mhz
`ifdef  VIDEO_800_480
parameter H_ACTIVE = 16'd800; 
parameter H_FP = 16'd40;      
parameter H_SYNC = 16'd128;   
parameter H_BP = 16'd88;      
parameter V_ACTIVE = 16'd480; 
parameter V_FP  = 16'd1;     
parameter V_SYNC  = 16'd3;    
parameter V_BP  = 16'd21;    
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//800x600 40Mhz
`ifdef  VIDEO_800_600
parameter H_ACTIVE = 16'd800; 
parameter H_FP = 16'd40;      
parameter H_SYNC = 16'd128;   
parameter H_BP = 16'd88;      
parameter V_ACTIVE = 16'd600; 
parameter V_FP  = 16'd1;     
parameter V_SYNC  = 16'd4;    
parameter V_BP  = 16'd23;    
parameter HS_POL = 1'b1;
parameter VS_POL = 1'b1;
`endif

//1024x768 65Mhz
`ifdef  VIDEO_1024_768
parameter H_ACTIVE = 16'd1024;
parameter H_FP = 16'd24;      
parameter H_SYNC = 16'd136;   
parameter H_BP = 16'd160;     
parameter V_ACTIVE = 16'd768; 
parameter V_FP  = 16'd3;      
parameter V_SYNC  = 16'd6;    
parameter V_BP  = 16'd29;     
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//1920x1080 148.5Mhz
`ifdef  VIDEO_1920_1080
parameter H_ACTIVE = 16'd1920;
parameter H_FP = 16'd88;
parameter H_SYNC = 16'd44;
parameter H_BP = 16'd148; 
parameter V_ACTIVE = 16'd1080;
parameter V_FP  = 16'd4;
parameter V_SYNC  = 16'd5;
parameter V_BP  = 16'd36;
parameter HS_POL = 1'b1;
parameter VS_POL = 1'b1;
`endif
parameter H_TOTAL = H_ACTIVE + H_FP + H_SYNC + H_BP;//horizontal total time (pixels) 行序列全部时间
parameter V_TOTAL = V_ACTIVE + V_FP + V_SYNC + V_BP;//vertical total time (lines)场同步全部时间
//define the RGB values for 8 colors
parameter WHITE_R       = 8'hff;
parameter WHITE_G       = 8'hff;
parameter WHITE_B       = 8'hff;
parameter YELLOW_R      = 8'hff;
parameter YELLOW_G      = 8'hff;
parameter YELLOW_B      = 8'h00;                                
parameter CYAN_R        = 8'h00;
parameter CYAN_G        = 8'hff;
parameter CYAN_B        = 8'hff;                                
parameter GREEN_R       = 8'h00;
parameter GREEN_G       = 8'hff;
parameter GREEN_B       = 8'h00;
parameter MAGENTA_R     = 8'hff;
parameter MAGENTA_G     = 8'h00;
parameter MAGENTA_B     = 8'hff;
parameter RED_R         = 8'hff;
parameter RED_G         = 8'h00;
parameter RED_B         = 8'h00;
parameter BLUE_R        = 8'h00;
parameter BLUE_G        = 8'h00;
parameter BLUE_B        = 8'hff;
parameter BLACK_R       = 8'h00;
parameter BLACK_G       = 8'h00;
parameter BLACK_B       = 8'h00;
reg hs_reg;                      //horizontal sync register 行同步寄存器
reg vs_reg;                      //vertical sync register		场同步寄存器
reg hs_reg_d0;                   //delay 1 clock of 'hs_reg'	行同步延迟寄存器 产生脉冲
reg vs_reg_d0;                   //delay 1 clock of 'vs_reg'	场同步延迟寄存器 产生脉冲
reg[11:0] h_cnt;                 //horizontal counter 			行同步计数器
reg[11:0] v_cnt;                 //vertical counter				场同步计数器
reg[11:0] active_x;              //video x position 				x视频位置计数	
reg[11:0] active_y;              //video y position 				y轴视频位置计数
reg[7:0] rgb_r_reg;              //video red data register		红色像素寄存器
reg[7:0] rgb_g_reg;              //video green data register	绿色像素寄存器
reg[7:0] rgb_b_reg;              //video blue data register		蓝色像素寄存器
reg h_active;                    //horizontal video active		
reg v_active;                    //vertical video active
wire video_active;               //video active(horizontal active and vertical active)
reg video_active_d0;             //delay 1 clock of video_active
assign hs = hs_reg_d0;
assign vs = vs_reg_d0;
assign video_active = h_active & v_active;
assign de = video_active_d0;
assign rgb_r = rgb_r_reg;
assign rgb_g = rgb_g_reg;
assign rgb_b = rgb_b_reg;
always@(posedge clk or posedge rst)//延迟一拍赋值
begin
	if(rst == 1'b1)
		begin
			hs_reg_d0 <= 1'b0;
			vs_reg_d0 <= 1'b0;
			video_active_d0 <= 1'b0;
		end
	else
		begin
			hs_reg_d0 <= hs_reg;
			vs_reg_d0 <= vs_reg;
			video_active_d0 <= video_active;
		end
end

always@(posedge clk or posedge rst)//行同步周期计数
begin
	if(rst == 1'b1)
		h_cnt <= 12'd0;
	else if(h_cnt == H_TOTAL - 1)//horizontal counter maximum value
		h_cnt <= 12'd0;
	else
		h_cnt <= h_cnt + 12'd1;
end

always@(posedge clk or posedge rst)//有效像素数据时间计数
begin
	if(rst == 1'b1)
		active_x <= 12'd0;
	else if(h_cnt >= H_FP + H_SYNC + H_BP - 1)//horizontal video active
		active_x <= h_cnt - (H_FP[11:0] + H_SYNC[11:0] + H_BP[11:0] - 12'd1);
	else
		active_x <= active_x;
end

always@(posedge clk or posedge rst)//行同步周期计数
begin
	if(rst == 1'b1)
		v_cnt <= 12'd0;
	else if(h_cnt == H_FP  - 1)//horizontal sync time
		if(v_cnt == V_TOTAL - 1)//vertical counter maximum value
			v_cnt <= 12'd0;
		else
			v_cnt <= v_cnt + 12'd1;
	else
		v_cnt <= v_cnt;
end

always@(posedge clk or posedge rst)//行同步脉冲产生
begin
	if(rst == 1'b1)
		hs_reg <= 1'b0;
	else if(h_cnt == H_FP - 1)//horizontal sync begin
		hs_reg <= HS_POL;
	else if(h_cnt == H_FP + H_SYNC - 1)//horizontal sync end
		hs_reg <= ~hs_reg;
	else
		hs_reg <= hs_reg;
end

always@(posedge clk or posedge rst)//行有效像素数据产生
begin
	if(rst == 1'b1)
		h_active <= 1'b0;
	else if(h_cnt == H_FP + H_SYNC + H_BP - 1)//horizontal active begin
		h_active <= 1'b1;
	else if(h_cnt == H_TOTAL - 1)//horizontal active end
		h_active <= 1'b0;
	else
		h_active <= h_active;
end

always@(posedge clk or posedge rst)//场同步脉冲产生
begin
	if(rst == 1'b1)
		vs_reg <= 1'd0;
	else if((v_cnt == V_FP - 1) && (h_cnt == H_FP - 1))//vertical sync begin
		vs_reg <= HS_POL;
	else if((v_cnt == V_FP + V_SYNC - 1) && (h_cnt == H_FP - 1))//vertical sync end
		vs_reg <= ~vs_reg;  
	else
		vs_reg <= vs_reg;
end

always@(posedge clk or posedge rst)//场有效像素数据产生
begin
	if(rst == 1'b1)
		v_active <= 1'd0;
	else if((v_cnt == V_FP + V_SYNC + V_BP - 1) && (h_cnt == H_FP - 1))//vertical active begin
		v_active <= 1'b1;
	else if((v_cnt == V_TOTAL - 1) && (h_cnt == H_FP - 1)) //vertical active end
		v_active <= 1'b0;   
	else
		v_active <= v_active;
end

always@(posedge clk or posedge rst)//有效像素显示阶段分为八段分别显示不同彩条
begin
	if(rst == 1'b1)
		begin
			rgb_r_reg <= 8'h00;
			rgb_g_reg <= 8'h00;
			rgb_b_reg <= 8'h00;
		end
	else if(video_active)
		if(active_x == 12'd0)
			begin
				rgb_r_reg <= WHITE_R;
				rgb_g_reg <= WHITE_G;
				rgb_b_reg <= WHITE_B;
			end
		else if(active_x == (H_ACTIVE/8) * 1)
			begin
				rgb_r_reg <= YELLOW_R;
				rgb_g_reg <= YELLOW_G;
				rgb_b_reg <= YELLOW_B;
			end         
		else if(active_x == (H_ACTIVE/8) * 2)
			begin
				rgb_r_reg <= CYAN_R;
				rgb_g_reg <= CYAN_G;
				rgb_b_reg <= CYAN_B;
			end
		else if(active_x == (H_ACTIVE/8) * 3)
			begin
				rgb_r_reg <= GREEN_R;
				rgb_g_reg <= GREEN_G;
				rgb_b_reg <= GREEN_B;
			end
		else if(active_x == (H_ACTIVE/8) * 4)
			begin
				rgb_r_reg <= MAGENTA_R;
				rgb_g_reg <= MAGENTA_G;
				rgb_b_reg <= MAGENTA_B;
			end
		else if(active_x == (H_ACTIVE/8) * 5)
			begin
				rgb_r_reg <= RED_R;
				rgb_g_reg <= RED_G;
				rgb_b_reg <= RED_B;
			end
		else if(active_x == (H_ACTIVE/8) * 6)
			begin
				rgb_r_reg <= BLUE_R;
				rgb_g_reg <= BLUE_G;
				rgb_b_reg <= BLUE_B;
			end 
		else if(active_x == (H_ACTIVE/8) * 7)
			begin
				rgb_r_reg <= BLACK_R;
				rgb_g_reg <= BLACK_G;
				rgb_b_reg <= BLACK_B;
			end
		else
			begin
				rgb_r_reg <= rgb_r_reg;
				rgb_g_reg <= rgb_g_reg;
				rgb_b_reg <= rgb_b_reg;
			end         
	else
		begin
			rgb_r_reg <= 8'h00;
			rgb_g_reg <= 8'h00;
			rgb_b_reg <= 8'h00;
		end
end

endmodule 

3.VGA显示模块


```c
//
//  BISTU                                                 //
//                                                                              //
//  Author: 田彦祖    202.6.4
//                                                         //                                                                            //
//

//================================================================================

//================================================================================
//  Revision History:
//  Date          By            Revision    Change Description
//--------------------------------------------------------------------------------
//2017/8/20                    1.0          Original
//*******************************************************************************/
module osd_display(
	input                       rst_n,   
	input                       pclk,
	input[23:0]                 wave_color,
	input                       adc_clk,
	input                       adc_buf_wr,
	input[11:0]                 adc_buf_addr,
	input[7:0]                  adc_buf_data,
	input                       i_hs,    
	input                       i_vs,    
	input                       i_de,	
	input[23:0]                 i_data,  
	output                      o_hs,    
	output                      o_vs,    
	output                      o_de,    
	output[23:0]                o_data
);
parameter OSD_WIDTH   =  12'd336;
parameter OSD_HEGIHT  =  12'd48;

wire[11:0] pos_x;
wire[11:0] pos_y;
wire       pos_hs;
wire       pos_vs;
wire       pos_de;
wire[23:0] pos_data;
reg[23:0]  v_data;
reg[11:0]  osd_x;
reg[11:0]  osd_y;
reg[15:0]  osd_ram_addr;
wire[7:0]  q;
reg        region_active;
reg        region_active_d0;
reg        region_active_d1;
reg        region_active_d2;

reg        pos_vs_d0;
reg        pos_vs_d1;

assign o_data = v_data;
assign o_hs = pos_hs;
assign o_vs = pos_vs;
assign o_de = pos_de;
//delay 1 clock 
always@(posedge pclk)
begin
	if(pos_y >= 12'd9 && pos_y <= 12'd9 + OSD_HEGIHT - 12'd1 && pos_x >= 12'd9 && pos_x  <= 12'd9 + OSD_WIDTH - 12'd1)
		region_active <= 1'b1;
	else
		region_active <= 1'b0;
end

always@(posedge pclk)
begin
	region_active_d0 <= region_active;
	region_active_d1 <= region_active_d0;
	region_active_d2 <= region_active_d1;
end

always@(posedge pclk)
begin
	pos_vs_d0 <= pos_vs;
	pos_vs_d1 <= pos_vs_d0;
end

//delay 2 clock
//region_active_d0
always@(posedge pclk)
begin
	if(region_active_d0 == 1'b1)
		osd_x <= osd_x + 12'd1;
	else
		osd_x <= 12'd0;
end

always@(posedge pclk)
begin
	if(pos_vs_d1 == 1'b1 && pos_vs_d0 == 1'b0)
		osd_ram_addr <= 16'd0;
	else if(region_active == 1'b1)
		osd_ram_addr <= osd_ram_addr + 16'd1;
end


always@(posedge pclk)
begin
	if(region_active_d0 == 1'b1)
		if(q[osd_x[2:0]] == 1'b1)
			v_data <= 24'h000000;
		else
			v_data <= pos_data;
	else
		v_data <= pos_data;
end

osd_rom osd_rom_m0
(
	.addra(osd_ram_addr[15:3]),
	.clka(pclk),
	.douta(q)
);
timing_gen_xy timing_gen_xy_m0
(
	.rst_n    (rst_n    ),
	.clk      (pclk     ),
	.i_hs     (i_hs     ),
	.i_vs     (i_vs     ),
	.i_de     (i_de     ),
	.i_data   (i_data   ),
	.o_hs     (pos_hs   ),
	.o_vs     (pos_vs   ),
	.o_de     (pos_de   ),
	.o_data   (pos_data ),
	.x        (pos_x    ),
	.y        (pos_y    )
);
endmodule 

仿真结果

在这里插入图片描述
结果演示

在这里插入图片描述源码工程地址
源码下载地址
参考地址
添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值