刚刚学习SOC不久。这几天在DE1-SoC上编译和运行了友晶提供的一些sample,初步学习了一些相关代码,把自己的理解写下来,希望各位大侠不吝赐教。1. 硬件(HPS-FPGA)架构在Qsys中连接h2f_ axi_master(而不是h2f_lw_axi_master)到sdram,作为数据输出的FIFO
同时也连接到alt_vip_vfr_0,读出进行图像处理。
经过alt_vip_mix_0进行处理后,最后通过alt_vip_itc_0 alt_vip_itc_0_clocked_video_vid_data输出到VGA接口进行显示。
2. HPS侧软件打开内存设备
main.c
if( ( fd = open("/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
printf("ERROR: could not open \"/dev/mem\"...\n" );
return( 1 );
}
然后进行地址映射
axi_virtual_base=mmap(NULL,HW_FPGA_AXI_SPAN,(PROT_READ|PROT_WRITE),MAP_SHARED, fd,ALT_AXI_FPGASLVS_OFST );
通过H2F bridge 映射到连接frame buffer
h2p_vip_frame_reader0_addr=virtual_base + ( ( unsigned long )(ALT_LWFPGASLVS_OFST + ALT_VIP_VFR_0_BASE ) & ( unsigned long)( HW_REGS_MASK) );
其中ALT_VIP_VFR_0_BASE 对应于Qsys中定义的地址
hps_0.h(80):#define ALT_VIP_VFR_0_BASE 0x100
把h2p_memory_add映射到FPGA侧的SDRAM(0x0000_0000 -0x03ff_ffff)
h2p_memory_addr=axi_virtual_base
+ ((unsigned long)(DEMO_VGA_FRAME0_ADDR)& (unsigned long)(HW_FPGA_AXI_MASK));
配置Frame buffer的位置,图像大小
VIP_FR_Config(VIDEO_WIDTH, VIDEO_HEIGHT);
把frame0/frame1映射到h2p_memory_addr上:
thread_data0.frame0=(volatile unsigned long *)((char*)h2p_memory_addr+FR0_FRAME0_ OFFSET);
thread_data0.frame1=(volatile unsigned long *)((char*)h2p_memory_addr +FR0_FRAME1_ OFFSET);
创建mpg_decode_thread线程
ret0=pthread_create(&id0,NULL,(void *)mpg_decode_thread,&thread_data0);
在mpg_decode_thread函数中,解码后的RGB数据轮流写入frame0和frame1
void mpg_decode_thread(void *ptr)
{
…
mpg_decode(mpgfile,data->ID, data->frame0,data->frame1);
fclose(mpgfile);
…
}
在mpg_decode函数中,使用memcpy将解码后的数据写入frame0和frame1,即直接写入FPGA侧的SDRAM:
void mpg_decode (FILE * mpgfile, const int ID, volatile unsignedlong *frame0,volatile unsigned long *frame1)
{
…
if (nActiveFrame == 0x00)
memcpy((void *)frame0, (void *)pFrame_xRGB, nFrameSize);
else
memcpy((void *)frame1, (void *)pFrame_xRGB, nFrameSize);
…
}
本文来自论坛,点击查看完整帖子内容。