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 进而分析
评论