fpga图像处理入门 ZYNQ7020 VDMA显示通路搭建


前言

使用block design配置vdma hdmi输出

一、img_gen模块

模拟视频输入 输出灰度条

module img_gen 
#(
	parameter ACTIVE_IW  =640,
	parameter ACTIVE_IH  =480,
	parameter TOTAL_IW   =800,
	parameter TOTAL_IH   =525,
	parameter H_START    =143, 
	parameter V_START    =34   
)
( 
	input 				clk		,
	input 				rst_n	, 
	output reg 			vs		, 
	output reg 			de		,
	output reg [7:0]	data	
);

参数默认640*480  vs为同步信号 de为使能信号

二、block design 搭建

输入信号依次为 

pre_clk            时钟信号 

pre_vs             同步信号 

pre_de            使能信号 

pre_data         数据信号 

clk_100m        全局时钟 

rst_n               复位信号

首先 使用 IP核转换为axi_stream形式

video_out 连接到 vdma的输入  S_AXIS_S2MM(S从机)

通过 M_AXIS_MM2S输出到video out 其中M_AXI为内存ddr交互 

到此为止数据流的搭建就完成了 接下来是时序

使用该ip核产生所需时序  本次使用1280*1080的大小

根据VSA时序 该大小需要108M时钟 和5倍时钟540M

使用该ip核完成输出 

对输出信号进行拼接

输出信号依次为

video_clk           108M时钟

video_clk_5        540M时钟

video_hs            同步信号

video_de           使能信号

video_vs            同步信号

video_data         数据信号

三、顶层文件

bd整个文件为一个ip核 

使用clk_global产生100M时钟

clk_global u1_clk_global (
	.clk_in1		(sys_clk	),
	.clk_out1		(clk_100M	), 
	.locked			(rst_n		) 
); 

img_gen模块参数配置

最后对hmdi进行配置 因为正点原子板载没有输出芯片 使用差分信号作为输出

DVI_Transmitter_0 your_instance_name (
  .pclk(vga_out_clk),                // input wire pclk
  .pclk_x5(vga_out_clk_5),          // input wire pclk_x5
  .reset_n(rst_n),          // input wire reset_n
  .video_din(vga_out_data),      // input wire [23 : 0] video_din
  .video_hsync(vga_out_hs),  // input wire video_hsync
  .video_vsync(vga_out_vs ),  // input wire video_vsync
  .video_de(vga_out_de	),        // input wire video_de
  .tmds_clk_p(tmds_clk_p),    // output wire tmds_clk_p
  .tmds_clk_n(tmds_clk_n),    // output wire tmds_clk_n
  .tmds_data_p(tmds_data_p),  // output wire [2 : 0] tmds_data_p
  .tmds_data_n(tmds_data_n),  // output wire [2 : 0] tmds_data_n
  .tmds_oen( )        // output wire tmds_oen
);

四、ps端配置

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#include "xil_printf.h"
#include "xil_io.h"

#define VDMA_BASEADDR	XPAR_AXI_VDMA_0_BASEADDR

#define VIDEO_BASEADDR0 0x01000000
#define VIDEO_BASEADDR1 0x02000000
#define VIDEO_BASEADDR2 0x03000000

#define H_ACTIVE	1280
#define V_ACTIVE	1024
#define H_STRIDE	1280

int main()
{

	Xil_Out32((VDMA_BASEADDR + 0x030), 0x108B);// enable circular mode
	Xil_Out32((VDMA_BASEADDR + 0x0AC), VIDEO_BASEADDR0);	// start address
	Xil_Out32((VDMA_BASEADDR + 0x0B0), VIDEO_BASEADDR1);	// start address
	Xil_Out32((VDMA_BASEADDR + 0x0B4), VIDEO_BASEADDR2);	// start address
	Xil_Out32((VDMA_BASEADDR + 0x0A8), (H_STRIDE*1));		// h offset 1280 bytes
	Xil_Out32((VDMA_BASEADDR + 0x0A4), (H_ACTIVE*1));		// h size 1280 bytes
	Xil_Out32((VDMA_BASEADDR + 0x0A0), V_ACTIVE);			// v size 1024
		/*****************从DDR读数据设置**********************/
	Xil_Out32((VDMA_BASEADDR + 0x000), 0x8B); 		// enable circular mode
	Xil_Out32((VDMA_BASEADDR + 0x05c), VIDEO_BASEADDR0); 	// start address
	Xil_Out32((VDMA_BASEADDR + 0x060), VIDEO_BASEADDR1); 	// start address
	Xil_Out32((VDMA_BASEADDR + 0x064), VIDEO_BASEADDR2); 	// start address
	Xil_Out32((VDMA_BASEADDR + 0x058), (H_STRIDE*1)); 		// h offset 1280 bytes
	Xil_Out32((VDMA_BASEADDR + 0x054), (H_ACTIVE*1)); 		// h size 1280 bytes
	Xil_Out32((VDMA_BASEADDR + 0x050), V_ACTIVE); 			// v size 1024

	while (1) ;

	return 0;

}

总结

简单介绍了使用bd搭建vdma的流程 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值