前言
使用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的流程