解析xfPackPixels和xfExtractPixels函数

一、xfPackPixels

1、函数功能

将多个一定位宽的像素数据打包成一个更高位宽的组合数据。

2、函数定义

cpp 复制代码
template <int NPC,   //每个时钟并行处理的像素数
          int WORDWIDTH,  //组合后数据的位宽
          int PIXELDEPTH> //输入像素的位宽
void xfPackPixels(
    XF_PTNAME(PIXELDEPTH) * tmp_buf, // 输入变量:像素数据

    XF_SNAME(WORDWIDTH) & val,    //输出变量:打包像素后新的变量

    uint16_t pos,//需要打包的像素在tmp_buf中的位置position

    int16_t loopIter, //迭代次数,确定打包的像素的数量

    uint16_t& shift)  //数据移位操作,指示移位计数

3、函数详细分析

cpp 复制代码
template <int NPC, int WORDWIDTH, int PIXELDEPTH>
void xfPackPixels(
    XF_PTNAME(PIXELDEPTH) * tmp_buf, XF_SNAME(WORDWIDTH) & val, uint16_t pos, int16_t loopIter, uint16_t& shift) {
// clang-format off
    #pragma HLS INLINE   //函数内连,移除函数层次,节省调用时间和资源利用率
    // clang-format on
    ap_uint<8> STEP = XF_PIXELDEPTH(PIXELDEPTH); //移位步长,设置为像素的宽度

    for (ap_int<9> i = 0; i < loopIter; i++) {  //迭代次数,即loopIter个像素拼接成一个数据
// clang-format off
        #pragma HLS unroll  //循环完全展开,减少耗时
        // clang-format on
        XF_PTUNAME(PIXELDEPTH) tmp = tmp_buf[pos]; //将tmp_buf对应位置的数据赋值给tmp
        val = val | (((XF_SNAME(WORDWIDTH))tmp) << (shift * STEP)); //将tmp赋值给val指定位置
        pos++;//pos累加,拼接下一个像素
        shift++; //shift累加,改变像素插入到val的位置
    }
}

xfPackPixels函数,将输入的像素按照先输入像素在低字节,后输入像素在高字节的小端模式进行保存。读取tmp_buf中的像素数据,按照小端模式拼接,拼成成需要的WORDWIDTH宽度的val,拼接完成后,输出val。拼接的次数为loopIter次。

需要注意的是,该函数可设置的参数很多,若参数不匹配,可能会导致输出数据异常。当然也可以根据此函数逻辑有规律的舍弃掉某些像素。需要根据实际项目决定。

还需要注意,val和shift为引用变量,每次调用此函数的时候,最好在父函数中,将val和shift变量赋值为0。(不是绝对的,根据逻辑决定)

二、xfExtractPixels

1、函数功能

将一定高位宽的组合数据拆包成多个低位宽的像素数据。

2、函数定义

cpp 复制代码
template <int NPC,   //每个时钟并行处理的像素数
          int WORDWIDTH,  //组合后数据的位宽
          int PIXELDEPTH> //输入像素的位宽
void xfExtractPixels(XF_PTNAME(PIXELDEPTH) * tmp_buf,  //拆包后的像素数据指针
                     XF_SNAME(WORDWIDTH) & val1,   //组合数据
                     int pos) //偏移tmp_buf的位置 比如pos=0,表示val1拆分后的数据直接赋值给tmp_buf

3、函数详细分析

cpp 复制代码
template <int NPC, int WORDWIDTH, int PIXELDEPTH>
void xfExtractPixels(XF_PTNAME(PIXELDEPTH) * tmp_buf, XF_SNAME(WORDWIDTH) & val1, int pos) {
// clang-format off 
    #pragma HLS inline off  //函数内连,移除函数层次,节省调用时间和资源利用率
    // clang-format on
    XF_SNAME(WORDWIDTH) v = val1; //组合数据赋值

    int shift = 0;  //偏移计数,初始值为0
    int STEP = XF_PIXELDEPTH(PIXELDEPTH); //移位数,为像素的位宽
Extract_pixels_loop:
    for (int i = 0; i < (1 << (XF_BITSHIFT(NPC))); i++) {  //循环此处为NPC,即拆分成每个时钟并行处理的像素数
// clang-format off
        #pragma HLS UNROLL //循环展开
        // clang-format on
        tmp_buf[pos + i] = v.range(shift + STEP - 1, shift); //将组合数据指定的bit写入到tmp_buf对应的顺序指针上
        shift = shift + STEP; //shift累加,用于切换读取v指定bit位置的数据
    }
}

xfExtractPixels函数,将输入的组合数据从低bit开始读取,并写入到tmp_buf指针对应的低地址位置,组合数据的高bit数据写入到顺序增加的高地址位置。完成数据的拆分。拆分的次数为NPC次。

相关推荐
不正经学生1 小时前
C语言大小端字节序:内存里字节的排列顺序
c语言·开发语言·arm开发·c++·算法·c#
小则又沐风a2 小时前
负载均衡式在线OJ---------第二幕
linux·c++·后端
a3535413822 小时前
C++项目如何架构优化
java·c++·架构
键盘会跳舞2 小时前
C++:智能指针源码级深度拆解——从 RAII 思想到引用计数的内存安全体系
c++·智能指针·unique_ptr·shared_ptr·weak_ptr
SNAKEpc121383 小时前
OpenGL(十三)- Mip贴图
c语言·c++·图形渲染·贴图
会周易的程序员16 小时前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图
wuminyu17 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
gumichef17 小时前
第二章:C/C++内存管理
c++·内存管理
程序员老陆20 小时前
如何使用FFmpeg6的API进行HLS开发呢?
ffmpeg·音视频·hls
小龙报21 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯