UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

取消
显示结果 
搜索替代 
您的意思是: 
Highlighted
Observer smileyoung
Observer
384 次查看
注册日期: ‎11-14-2018

vdma使用问题

转到解答

我通过调用HLS生成的Sobel算子的IP搭建一个sobel边缘检测的硬件平台,先通过 Image2LCD 对一幅图像进行取模,后期通过 SDK 来对取模的图像送 SOBEL 处理,然后将处理后的结果和原图像分别存放在对应的内存段中。我调用了一个VDMA,使用了读和写两个通道,负责将取模的数组送入内存和sobel处理后的数据缓存作用,设置了两块内存0x08000000和0x0A000000,将程序编译好下载到板子中,能在0x0A000000地址中成功看到取模的原图数组,但是在0x08000000段数组中没有得到相对应的处理后的数据,想请教一下这是什么原因,下图是我的block design:

20181227.png

附上我在sdk中的代码:


#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "xhls_sobel.h"
#include "sleep.h"
#include "xil_printf.h"

#define DDR_BASEADDR 0x00000000
//#define DISPLAY_VDMA XPAR_AXI_VDMA_0_BASEADDR + 0
#define SOBEL_VDMA XPAR_AXI_VDMA_0_BASEADDR + 0
#define DIS_X 1280
#define DIS_Y 720
#define SOBEL_ROW 512
#define SOBEL_COL 512
#define pi 3.14159265358
#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ)/64

#define SOBEL_S2MM 0x08000000
#define SOBEL_MM2S 0x0A000000
#define DISPLAY_MM2S 0x0C000000

u32 *BufferPtr[3];
static XHls_sobel sobel;

//函数声明
void Xil_DCacheFlush(void);
// 所有数据格式 为 RGBA,低位的透明度暂不起作用
extern const unsigned char gImage_lena[1048584];

void SOBEL_VDMA_setting(unsigned int width,unsigned int height,unsigned int s2mm_addr,unsigned int mm2s_addr)
{
//S2MM
Xil_Out32(SOBEL_VDMA + 0x30, 0x4); //reset S2MM VDMA Control Register
usleep(10);
Xil_Out32(SOBEL_VDMA + 0x30, 0x0); //genlock
Xil_Out32(SOBEL_VDMA + 0xAC, s2mm_addr);//S2MM Start Addresses
Xil_Out32(SOBEL_VDMA + 0xAC+4, s2mm_addr);
Xil_Out32(SOBEL_VDMA + 0xAC+8, s2mm_addr);
Xil_Out32(SOBEL_VDMA + 0xA4, width*4);//S2MM Horizontal Size
Xil_Out32(SOBEL_VDMA + 0xA8, width*4);//S2MM Frame Delay and Stride
Xil_Out32(SOBEL_VDMA + 0x30, 0x3);//S2MM VDMA Control Register
Xil_Out32(SOBEL_VDMA + 0xA0, height);//S2MM Vertical Size start an S2M
// Xil_DCacheFlush();

//MM2S
Xil_Out32(SOBEL_VDMA + 0x00,0x00000003); // enable circular mode
Xil_Out32(SOBEL_VDMA + 0x5c,mm2s_addr); // start address
Xil_Out32(SOBEL_VDMA + 0x60,mm2s_addr); // start address
Xil_Out32(SOBEL_VDMA + 0x64,mm2s_addr); // start address
Xil_Out32(SOBEL_VDMA + 0x58,(width*4)); // h offset
Xil_Out32(SOBEL_VDMA + 0x54,(width*4)); // h size
Xil_Out32(SOBEL_VDMA + 0x50,height); // v size
//Xil_DCacheFlush();
}

void SOBEL_DDRWR(unsigned int addr,unsigned int cols,unsigned int lows)
{
u32 i=0;
u32 j=0;
u32 r,g,b;
for(i=0;i<cols;i++)
{
for(j=0;j<lows;j++)
{
b= gImage_lena[(j+i*cols)*4+1];
g= gImage_lena[(j+i*cols)*4+2];
r= gImage_lena[(j+i*cols)*4+3];
Xil_Out32((addr+(j+i*cols)*4),((r<<24)|(g<<16)|(b<<8)|0x0));
}
}
Xil_DCacheFlush();
}

void SOBEL_Setup()
{
//const int cols = 512;
//const int rows = 512;
SOBEL_VDMA_setting(SOBEL_ROW,SOBEL_COL,SOBEL_S2MM,SOBEL_MM2S);
XHls_sobel_SetRows(&sobel, SOBEL_COL);
XHls_sobel_SetCols(&sobel, SOBEL_ROW);
XHls_sobel_DisableAutoRestart(&sobel);
XHls_sobel_InterruptGlobalDisable(&sobel);
SOBEL_DDRWR(SOBEL_MM2S,SOBEL_ROW,SOBEL_COL);
//init_hls_sobel_dma(cols,rows, VIDEO_BASEADDR, HLS_VDMA_MM2S_ADDR);
//DDRVideoWr(HLS_VDMA_MM2S_ADDR, cols,rows);
XHls_sobel_Start(&sobel);

Xil_DCacheFlush();
}

void show_img(u32 x, u32 y, u32 disp_base_addr, const unsigned char * addr, u32 size_x, u32 size_y,u32 type)
{
//计算图片 左上角坐标
u32 i=0;
u32 j=0;
u32 r,g,b;
u32 start_addr=disp_base_addr;
start_addr = disp_base_addr + 4*x + y*4*DIS_X;
for(j=0;j<size_y;j++)
{
for(i=0;i<size_x;i++)
{
if(type==0)
{
b = *(addr+(i+j*size_x)*4+2); //08
g = *(addr+(i+j*size_x)*4+1); //60
r = *(addr+(i+j*size_x)*4); //01
}
else
{
b = *(addr+(i+j*size_x)*4+1); //08
g = *(addr+(i+j*size_x)*4+2); //60
r = *(addr+(i+j*size_x)*4+3); //01
}
Xil_Out32((start_addr+(i+j*DIS_X)*4),((r<<16)|(g<<8)|(b<<0)|0x0));
}
}
Xil_DCacheFlush();
}

//#define VIDEO_BASEADDR0 0xA000000

int main(void){
xil_printf("Starting the first VDMA \n\r");

for (int i = 0; i<2455753; i++)
{
Xil_Out32(0xA000000 + i, 0);
Xil_Out32(0xC000000 + i, 0);
Xil_Out32(0x8000000 + i, 0);
}

int status = XHls_sobel_Initialize(&sobel, XPAR_HLS_SOBEL_0_S_AXI_CONTROL_BUS_BASEADDR);
if(0 != status)
{
xil_printf("XHls_Sobel_Initialize failed \n");
}
SOBEL_Setup();

 

return 0;
}

0 项奖励
1 个已接受解答

已接受的解答
Moderator
Moderator
351 次查看
注册日期: ‎05-23-2018

回复: vdma使用问题

转到解答

Hi, @smileyoung

一般来讲,如果您希望获得高带宽数据传输的话,这两个接口与PS端的S_AXI_HP端口相连。

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
6 条回复
Moderator
Moderator
377 次查看
注册日期: ‎05-23-2018

回复: vdma使用问题

转到解答

Hi, @smileyoung

VDMA IP的M_AXI_MM2S和M_AXI_S2MM两个端口为什么都没有连接?

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Observer smileyoung
Observer
362 次查看
注册日期: ‎11-14-2018

回复: vdma使用问题

转到解答

额,请问这两个端口应该和什么端口相连?

0 项奖励
Moderator
Moderator
352 次查看
注册日期: ‎05-23-2018

回复: vdma使用问题

转到解答

Hi, @smileyoung

一般来讲,如果您希望获得高带宽数据传输的话,这两个接口与PS端的S_AXI_HP端口相连。

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Xilinx Employee
Xilinx Employee
321 次查看
注册日期: ‎06-02-2017

回复: vdma使用问题

转到解答

Hi @smileyoung,

如Weiyil所说,需要了解VDMA的基本使用方法。直接看文档可能有些抽象,建议参考XAPP742或者XAPP1218参考设计,可以看下VDMA基本的连接以及使用方法,再配合VDMA文档会比较快的了解。

-------------------------------------------------------------------------------------------------------------------------------------------
Kindly note- Please mark the Answer as "Accept as solution" if information provided is helpful.

Give Kudos to a post which you think is helpful and reply oriented.
--------------------------------------------------------------------------------------------------------------------------------------------
0 项奖励
Observer smileyoung
Observer
306 次查看
注册日期: ‎11-14-2018

回复: vdma使用问题

转到解答

好的谢谢了

0 项奖励
Observer smileyoung
Observer
304 次查看
注册日期: ‎11-14-2018

回复: vdma使用问题

转到解答

谢谢你的建议

0 项奖励