写在前面
本人是参考赛灵思官方文档核例程、网上相关教程和内容,所有参考、转载会标明出处,希望文章对大家有所帮助,感谢各位!
创建项目、添加示例代码和Project Settings等操作请参考本人其他文章,链接:https://blog.youkuaiyun.com/m0_49474265/article/details/123759085
使用到AXI,需要修改 xf_headers.h 和 xf_config_params.h 文件,可参考下载的xfopencv库里的HLS_Use_Model,或者参考本人的文章,链接:https://blog.youkuaiyun.com/m0_49474265/article/details/124106562
目的
介绍
工具
一、步骤
测试 meidian_blur_accel 函数
运行C Simulation
仿真结果
测试自己创建的函数
错误
error: invalid types ‘int[int]’ for array subscript
RGB[l].range(23,16) = BGR[l].range(7,0);
原因:是xf_config_param.h 文件里的宏定义里用的常量名和库文件里的常量名重复定义了。
解决办法:①如果已知读取的是非灰度图片,则注释掉xf_config_param.h 文件中的红色标记的宏定义。②将宏定义中的常量名换一个(本人未测试)
Create Block Design
Launch SDK
创建新项目,添加代码等不再赘述。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "display_ctrl_hdmi/display_ctrl.h"
#include "vdma_api/vdma_api.h"
#include "emio_sccb_cfg/emio_sccb_cfg.h"
#include "ov5640/ov5640_init.h"
#include "xmedian_blur_ip_accel.h"//****需要修改 by Du****改成IP核的名字
//宏定义
#define DYNCLK_BASEADDR XPAR_AXI_DYNCLK_0_BASEADDR //动态时钟基地址
#define VDMA_ID XPAR_AXIVDMA_0_DEVICE_ID //VDMA器件ID
#define DISP_VTC_ID XPAR_VTC_0_DEVICE_ID //VTC器件ID
//全局变量
//frame buffer的起始地址
unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR
+ 0x1000000);
XAxiVdma vdma;
DisplayCtrl dispCtrl;
VideoMode vd_mode;
XMedian_blur_ip_accel median_blur_ip_accel_inst;//***需要修改 by Du****
int main(void)
{
u32 status;
u16 cmos_h_pixel; //ov5640 DVP 输出水平像素点数
u16 cmos_v_pixel; //ov5640 DVP 输出垂直像素点数
u16 total_h_pixel; //ov5640 水平总像素大小
u16 total_v_pixel; //ov5640 垂直总像素大小
cmos_h_pixel = 1280; //设置OV5640输出分辨率为1280*720
cmos_v_pixel = 720;
total_h_pixel = 2570;
total_v_pixel = 980;
emio_init(); //初始化EMIO
status = ov5640_init( cmos_h_pixel, //初始化ov5640
cmos_v_pixel,
total_h_pixel,
total_v_pixel);
if(status == 0)
xil_printf("OV5640 detected successful!\r\n");
else
xil_printf("OV5640 detected failed!\r\n");
vd_mode = VMODE_1280x720;
//
XMedian_blur_ip_accel_Initialize(&median_blur_ip_accel_inst, XPAR_MEDIAN_BLUR_IP_ACCEL_0_DEVICE_ID);//****需要修改 by Du****ip核名称改大写
//配置的行数
XMedian_blur_ip_accel_Set_height(&median_blur_ip_accel_inst, vd_mode.height);
//配置的列数
XMedian_blur_ip_accel_Set_width(&median_blur_ip_accel_inst, vd_mode.width);
//配置VDMA
run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
frame_buffer_addr,0,0,BOTH);
//初始化Display controller
DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
//设置VideoMode
DisplaySetMode(&dispCtrl, &vd_mode);
DisplayStart(&dispCtrl);
return 0;
}
注意:
实验结果
medianblur
总结
实验比较顺利,继续…