NXP S32V234 的 ISP 模块 IPUS 指令集

1. ISP 模块介绍

图像信号处理器 (ISP) 模块由多个标量图像处理单元 (IPUS) 和矢量图像处理单元 (IPUV) 组成。 总的来说,所有模块都用于图像信号处理,主要用于处理原始相机输入数据,因此它们可以用于后续的图像分析步骤以及图像查看和视频编码。 为此,它包括八个 IPUS 处理引擎和四个 IPUV 处理引擎。每个处理引擎提供不同的处理能力,并且每个实例化引擎都带有一组流 DMA 单元,这些单元为数据流处理生成数据流。

 

 

2. Scalar Image Processing Unit (IPUS) 介绍

如下是一个标量图像处理单元 IPUS 的框图。

 

IPUS 内核是一个单处理器,用于对存储在系统内存中的图像行进行操作,而该内核使用流入和流出接口连接到内存。一个图像线是根据像素组件定义的,这些像素组件使用流接口提取到内核中,并作为 16 位操作数加载到 IPUS 内核中。

 

 

3. IPUS 核心流水线介绍

 

单个 IPUS 内核是具有 3 级流水线的单处理器,该流水线能够在每个时钟周期执行 1 条指令。IPUS 内核提供了多个算术模块作为执行指令的功能单元,并集成了 7 个加速器,这些加速器在流水线的末尾自动触发。除乘法和像素完成类型的指令外,所有指令均为 32 位宽,执行延迟为 1 个时钟周期。乘法指令的等待时间为 2 个时钟周期,而像素完成型指令的等待时间则从最小值 1 到最大值受流接口上的总线响控制。

 

 IPUS 核心流水线可细分为以下模块:

 

IF:instruction fetch unit                       指令取出单元

ID:instruction decode unit                  指令译码单元

Branch     unit                                       分支单元

Multiply   unit                                       乘法单元

Arithmetic logic unit(ALUs)                    算术逻辑单元

Shifter unit                                            移位器单元

Mask ALU unit for Mask bit manipulation       用于掩位操作的掩码算术逻辑单元

Accelerator Engine and load units                    加速器和负载单元

Debug      unit                                                     调试单元

4. Instruction set ( 指令集 ) 介绍

(1) IPUS指令集介绍

.global                                           定义一个全局变量或函数,后接变量或函数名

_start                                             是一个函数的起始地址,定义成全局方便加载器查找

bal             RADDR                       无条件跳转指令

bcc            RADDR                       进位消除

bcs             RADDR                       进位置位

beq            RADDR                       等于判断跳转

bge            RADDR                       大于或等于跳转

bgt             RADDR                       大于跳转

bhi             RADDR                       “高于”跳转

bls              RADDR                       小于等于跳转

blt              RADDR                       小于跳转

bmi            RADDR                       “负条件”跳转

bne            RADDR                       不等于跳转

bnv            RADDR                       不跳转,这个指令是个有效的 nop (一个时钟周期的延时)

boc            RADDR                       溢出清除跳转

bos            RADDR                       溢出置位跳转

bpl             RADDR                       计算正值跳转

halt           RADDR                          该指令停止流水线,并结束程序执行

CONFALU                                        算术逻辑单元配置寄存器 (Reset value:00 02h)

done         RADDR,    ixo             Pixel done 指令通过该流入和流出接口来控制流水线的像素组件,通过操作码中的“i”、“x”、“o”来更新水平位置计数器 XPOS

                                                  i: ① 当执行带“i”标志的指令时,它将完成“最古老”的移入像素组件的输入周期。

                                                     ② 在相应的通道配置寄存器中,“RPT”字段已经配置过了重复周期。

                                                     ③ 执行完成意味着下一个像素组件从 steamin 流入,并转移到输入矩阵中

                                                 x: ① 设置了“x”标志,“XPOS”计数器会按照“XSTEP”字段的配置递增。

                                                     ② 当 XPOS > XSIZE ,将停止执行的指令,停止将完成水平方向的执行周期。

                                                 o: ① 执行带“o”的Pixel done 指令后会通过输出矩阵的输出通道执行输出周期。

                                                     ② 执行输出周期之前已经经过了他们各自的“跳过”周期,这个跳过值由通道配置寄存器中的“SKIP”字段给出。

dout OP, RADDR, ixo                  执行 dout 指令和 Pixel done 指令差不多,但启动输出执

dout OP, RADDR                         行周期之前将通过 OP 字段指向的 SGPRS 值移动到OUT0 寄存器。

ldone        RADDR, ixo                循环计数器中的值 >1 ,执行分支,并减 1 ,直到值为 0 。

ldone        RADDR

ldout         OP, RADDR, ixo         与 ldone 类似,只是在输出之前 SGPRS 值会移动到 OUT0 寄存器。

ldout         OP, RADDR                

loop RADDR                                循环计数器的内容在被减为 0 之前,一直进行分支操作。

nop                                                  Nop 指令在流水线中进行一个空的循环。

abd            RT, IM16                     RT 中的值与保存值 M16 之间差的绝对值被放回 RT 中。

add            RT, IM16                     RT <- RT + IM6 , 两值相加结果存入 RT。

and            RT, IM16                     RT <- RT & IM6 , 两值相与结果存入 RT。

 

算术位移:

asl              RT, RA, IM4                寄存器 RA 的内容向左移位 IM4 位。右侧空出的位位置用

                                                         0 填充。如果位通过位置 15 移出并且位置 15 的最后位

                                                         不同,则当饱和使能 CONFALU 寄存器的 CONFSAT 位时,

                                                         移位结果饱和。 最终结果放入寄存器 RT。移位量为零会

                                                         导致 RT 被设置为等于 RA 寄存器中保存的值。

 

算术位移:

asr             RT, RA, IM4                寄存器 RA 的内容向右移位 IM4 位。从位置 0 移出的位

                                                        丢失,而 RA 的位 15 被复制以填充左侧的空出位置。结

                                                        果放入寄存器 RT 。移位量为零会导致 RT 被设置为等于

                                                        RA 寄存器中保存的值。

clz              RT, RA                          从寄存器 RA 的位 15 开始的连续零位数的计数被置于

                                                           RT 中。此数字的范围为 0 到 16 (包括 0 和 16)。当

                                                           计数的连续零的数量是 16 时,则负标志被设置为 1 。当

                                                           计数的连续零的数量是 0 时,零标志被设置为 1 。

 

逻辑位移:

lsl               RT, RA, IM4                RA 的内容左移 IM4 位,移出 15 位的位丢失,右补 0 ,结果存入 RT 。

 

逻辑位移:

lsr              RT, RA, IM4                RA 的内容右移 IM4 位,移出最低位的位丢失,左补 0 ,结果存入 RT 。

max           RT, IM16                     比较得到最大值保存至 RT 。

min            RT, IM16                     比较得到最小值保存至 RT 。

mov           RT, IM16                     16 位立即数放入 RT 寄存器。

mulh         RT, IM16                     RT 的值与 16 位立即数相乘,结果放入 RT 。

or               RT, IM16                     RT <- RT | IM16 ,两个值相或,结果存入 RT 。

sub            RT, IM16                     RT <- RT + ~IM16+1 , 16 位立即数按位取反加上 RT ,再加上 1 ,结果存入 RT 。

xor             RT, IM16                     RT <- RT ^ IM16 ,两个值按位异或,结果存入 RT 。

gpr0-gpr31                                   通用寄存器,且能识别 0x00 格式表示的 16 进制数。

sacc0                                            设置累加寄存器。

 

 

(2) 具体算子的分析

算子在官方提供 SDK 的 s32v234_sdk\isp\kernels 目录下,这里讲两个简单算子来看 IPUS 指令集的使用。

 




① copy_1to1_ipus.ipus

 

[作用]:把输入的数据不做任何处理 copy 到输出

[核心语句]:

copy_1to1_ipus_loop:

dout ina0,copy_1to1_ipus_loop,ixo

把输入矩阵 ina0 的数据输出 --> 输出矩阵 out0 ,并跳转到

copy_1to1_ipus_loop ,进行循环,直至处理完所有的数据。

 

② bayer2display.ipus

 

[ 作用 ]:把 Rawdata 数据以 RGB 格式显示,每个 pixel 缺失的颜色用 0 补全,

假如 SONY224 的 bayer 阵列中第一个传感器是红色 (R) ,值为 255 ,那

显示的第一个像素的数据为 R(255)G(0)B(0) ,通过这样的方式把原数据

Rawdata 以 RGB 格式显示出来。

[核心语句]:

bayer2display_even_b0:

                           dout zero,bayer2display_even_g0,o

bayer2display_even_g0:

                           dout zero,bayer2display_even_r0,o

bayer2display_even_r0:

                           mulh out0,ina0,gpr0

 

把 0 输出,填充蓝色 (B) 数据,把 0 输出,填充红色 (R) 数据,把输入矩阵 ina0 乘以 gpr0 寄存器的值输出到输出矩阵 out0(out0 = ina0 * gpr0) 填充红色 (R) 数据,该像素则由 R(ina0 * gpr0)G(0)B(0) 组成,即只有红色为有效值。 gpr0 是预先赋值的一个寄存器,用来给红色和蓝色一个增益,因为人眼对绿色较为敏感,相对于红色和蓝色较为迟钝,所以给红色和蓝色一个增益,以达到对三个颜色视觉上的平衡。

 

 


参考资料
[1] S32V234RM_Rev2.1.pdf

 

上一篇:S32V234 ISP 静态编译和算子性能计数器 (IPUsv engines performance counters) 信息打印

下一篇:NXP S32V234 如何抓取图像的 Buffer 进而分析

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论