FPGA 双通道视频接口实战应用

FPGA 双通道视频接口实战应用

1 摘要

图像拼接及视频显示在医疗、军工以及汽车影像行业都有广泛的应用。视频采集及视频处理,在FPGA领域是典型设计。本文主要针对视频处理设计基础的处理框架,同时把握HDMI、VGA等最基础的接口时序,为后续视频拼接、图像处理提供基础。本设计主要涉及DDR、HDMI接口时序、AXI总线等知识。当然后续处理还包括了视频缩放,字符OSD等。在设计之初多通道视频采集,主要需要考虑视频带宽以及SDRAM带宽处理速度。

2 视频信号接口时序

视频信号时序接口可以参考VESA_VGA时序标准。时序接口主要包括行同步信号、场同步信号。显示器扫描方式分为逐行扫描,逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,在回到屏幕的左边下一行的起始位置,在这期间进行消隐,每行结束时,用行同步信号进行同步,当扫描完所有的行,形成一帧,用场同步信号进行场同步,并扫描回到屏幕左上方,同时进行场消隐,开始下一帧。简单的理解,即行同步统计了一行包括前沿、消隐等总像素个数。场同步统计了一帧视频图像包含多少行图像数据。
在这里插入图片描述

3 具体设计

1 、HDMI视频信号通过两个LINEBUFFER乒乓流水操作。ARB仲裁控制AXI SDRAM与LINEBUFFER之间数据交互。视频信号一直采集进入BUFFER中,一个BUFFER作为外部写入操作同时另外一个BUFFER作为SDRAM数据的读取,乒乓操作提高了数据流读写效率。采用四颗SDRAM颗粒组成一个大的缓存区间,对于视频采集视频输出的框架,同样SDRAM可以采用乒乓机制环入环出。

在这里插入图片描述

2、乒乓处理
具体步骤如下:
1、在第一个缓冲周期,输入数据流写入数据缓冲模块Memory0,写完后进入第二个缓冲周期。
2、在第二个缓冲周期,输入数据流写入数据缓冲模块Memory1,同时将数据缓冲模块Memory0中的数据读出。
3、在第三个缓冲周期,输入数据流再次写入数据缓冲模块Memory0,同时将数据缓冲模块Memory1中的数据读出。
在这里插入图片描述

3、仿真结果
AXI4 是一种 READY,VALID 握手通信机制。当主从模块进行数据通信前,根据操作对各所用到的数据、地址通道进行握手。传输发送方必须等到传输接受者的READY信号后,发送方将数据与VALID信号同时发送给接收者。简单理解主从双方进行数据通信前,有一个握手的过程。数据传输发送方产生 VLAID 信号来指明何时数据或控制信息有效。从目地接收者产生READY信号来指明已经准备好接受数据或控制信息。传输发生在VALID和 READY信号同时为高时有效。由于仲裁模块代码比较多,这里给出了模块的基本信号及接口定义。

    module ARB_2_AXI4 #
	(
	parameter APP_DATA_WIDTH  	= 512
	)
	(
	XRST					,
	CLK						,
	// Arbiter interface
	MEMW_REQ				,
	MEMW_ADR				,
	MEMW_CYC				,
	MEMW_ACK				,
	MEMW_WRVLD				,
	MEMW_WRDAT				,
	MEMW_WBE 				,
	MEMR_REQ				,
	MEMR_ADR				,
	MEMR_CYC				,
	MEMR_ACK				,
	MEMR_RDVLD				,
	MEMR_RDDAT				,
	MEMR_DATAEND			,
	// Slave Interface Write Address Ports
	AXI_AWID				,
	AXI_AWADDR				,
	AXI_AWLEN				,
	AXI_AWSIZE				,
	AXI_AWBURST				,
	AXI_AWLOCK				,
	AXI_AWCACHE				,
	AXI_AWPROT				,
	AXI_AWQOS				,
	AXI_AWVALID				,
	AXI_AWREADY				,
	//Slave Interface Write Data Ports
	AXI_WDATA				,
	AXI_WSTRB				,
	AXI_WLAST				,
	AXI_WVALID				,
	AXI_WREADY				,
	//Slave Interface Write Response Ports
	AXI_BID					,
	AXI_BRESP				,
	AXI_BVALID				,
	AXI_BREADY				,
	//Slave Interface Read Address Ports
	AXI_ARID				,
	AXI_ARADDR				,
	AXI_ARLEN				,
	AXI_ARSIZE				,
	AXI_ARBURST				,
	AXI_ARLOCK				,
	AXI_ARCACHE				,
	AXI_ARPROT				,
	AXI_ARQOS				,
	AXI_ARVALID				,
	AXI_ARREADY				,
	//Slave Interface Read Data Ports
	AXI_RID					,
	AXI_RDATA				,
	AXI_RRESP				,
	AXI_RLAST				,
	AXI_RVALID				,
	AXI_RREADY				

	);
	//---------------------------------------------------------------------
	// Defination of Port Signals
	//---------------------------------------------------------------------
	input								XRST				;
	input								CLK					;
    // Arbiter IF
    input		    					MEMW_REQ			;	// (i)	memory requeset
	input	[ 31:0] 					MEMW_ADR			;	// (i)	address
	input	[  9:0] 					MEMW_CYC			;	// (i)	cycle
	output		    					MEMW_ACK			;	// (o)	ACK
	output		    					MEMW_WRVLD			;	// (o)	write valid
	input	[(APP_DATA_WIDTH - 1):0]	MEMW_WRDAT			;	// (i)	write data
	input	[(APP_DATA_WIDTH/8-1):0]	MEMW_WBE 			;	// (i)	write data byte enable
                    					                	;
	input		    					MEMR_REQ			;	// (i)	memory requeset
	input	[ 31:0] 					MEMR_ADR			;	// (i)	address
	input	[  9:0] 					MEMR_CYC			;	// (i)	cycle
	output		    					MEMR_ACK			;	// (o)	ACK
	output		    					MEMR_RDVLD			;	// (o)	read valid
	output	[(APP_DATA_WIDTH - 1):0]	MEMR_RDDAT			;	// (o)	read data
	output		    					MEMR_DATAEND		; 	// (o)	data transform end
	// Slave Interface Write Address Ports
	output	[ 3:0]						AXI_AWID			;
	output	[31:0]						AXI_AWADDR			;
	output	[ 7:0]						AXI_AWLEN			;
	output	[ 2:0]						AXI_AWSIZE			;
	output	[ 1:0]						AXI_AWBURST			;
	output								AXI_AWLOCK			;
	output	[ 3:0]						AXI_AWCACHE			;
	output	[ 2:0]						AXI_AWPROT			;
	output	[ 3:0]						AXI_AWQOS			;
	output								AXI_AWVALID			;
	input 								AXI_AWREADY			;
	//Slave Interface Write Data Ports
	output	[(APP_DATA_WIDTH - 1):0] 	AXI_WDATA			;
	output 	[(APP_DATA_WIDTH/8-1):0]	AXI_WSTRB			;
	output								AXI_WLAST			;
	output								AXI_WVALID			;
	input 								AXI_WREADY			;
	//Slave Interface Write Response Ports
	input 	[ 3:0]						AXI_BID				;
	input	[ 1:0]						AXI_BRESP			;
	input								AXI_BVALID			;
	output								AXI_BREADY			;
	//Slave Interface Read Address Ports
	output	[ 3:0]						AXI_ARID			;
	output	[31:0]						AXI_ARADDR			;
	output	[ 7:0]						AXI_ARLEN			;
	output	[ 2:0]						AXI_ARSIZE			;
	output	[ 1:0]						AXI_ARBURST			;
	output								AXI_ARLOCK			;
	output 	[ 3:0]						AXI_ARCACHE			;
	output	[ 2:0]						AXI_ARPROT			;
	output	[ 3:0]						AXI_ARQOS			;
	output 								AXI_ARVALID			;
	input								AXI_ARREADY			;
	//Slave Interface Read Data Ports
	input 	[ 3:0]						AXI_RID				;
	input	[(APP_DATA_WIDTH - 1):0] 	AXI_RDATA			;
	input	[ 1:0]						AXI_RRESP			;
	input								AXI_RLAST			;
	input								AXI_RVALID			;
	output								AXI_RREADY			;

从仿真结果看DDR初始化完成大概需要在55us左右才能完成,本次采用彩条进行试验,从仿真结果看视频输入数据和axi写入数据一致。
在这里插入图片描述
为了验证DDR读写是否正确,ARB_AXI仲裁时序是否正确我们可以进行环出试验,从仿真结果分析,输入HDMI彩条数据数据和输出的HDMI彩条数据一致,基于AXI的DDR模型数据存储输出正确。
在这里插入图片描述在这里插入图片描述

4 总结

开发不易珍惜每一分原创和劳动成果,同时注意平时开发过程中的经验积累总结。该工程已经在现有的工程项目中得到了应用和验证。如需要了解详细的设计可以联系 QQ:309967512

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值