16位DSP处理器的移位器功能及结构分析
来源: kaiyun平台官网登录 处理器的移位器主要执行的是两类 功能:一是实现移位操作,它的输入是16位,移位后的输出是40位。二是指数检测,即从16位的输入数据中检测出前导冗余位的位数(从高位起),作为结果指数输出到寄存器。移位操作主要有三种:逻辑移位,算术移位和规格化操作。它们都可以在左右两个方向进行,但不能进行循环移位。执行逻辑移位时,它的输入看作是无符号数,移位后左右两边的空位均用0填充;算术移位时,输入看作有符号补码数,移位后左边的空位填充符号位,右边补0;规格化操作和上述两种移位操作相似,但扩展位情况比较复杂一些,移位后右边填0,左边的空位要根据移位控制信号的不同情况填充0、符号位或算术状态寄存器中的进位标志位AC。三种移位操作中移出边界(SR39或SR0)的位都被舍弃。
指数检测的目的是进行类似于定点到浮点的数据转换。一个定点数,可以用一个包含尾数和指数(也称阶码)的浮点数来表示,这样可以提高数据的表数范围,同时使得我们的定点DSP能在不增加浮点算法开销的情况下获得浮点DSP的某些运算能力。指数检测(也称为指数提取)的结果就作为指数,然后用这个指数作为移位控制码对输入数据进行规格化操作,就得到了尾数。也可以采用这个方法使一串数据(数据块)共用同一个指数,只是各自的尾数不同,这种数据格式称为块浮点格式。
结构分析
移位器阵列是一个16×40的桶形移位器[2]。它用于实现各种移位功能:逻辑移位,算术移位和规格化操作。输入数据都是16位宽,移位后的40位结果分为三部分分别送到三个移位结果寄存器(统称为SR):SR2,SR1,SR0。移位操作由一个移位控制码(SHIFT_CODE)和一个参考信号 (HI/LO) 来控制。移位控制码是一个8位的有符号数,它表示移位的方向和位数,当它为正时左移,为负时右移。根据不同的移位操作,它的来源有4个:移位器指数寄存器SE的内容,SE寄存器的内容的相反数,来自指令的立即数,指令立即数的相反数。对于算术移位和逻辑移位,移位控制码来自移位器指数寄存器SE或指令中的立即数;对于规格化操作,移位控制码为移位器指数寄存器SE内容或指令中立即数取反。移位器阵列可实现-128-127范围内任意位数的移位。参考信号(HI/LO)决定移位操作相对于输出域的参考点,它主要是为了实现32位双精度数据移位操作而设的。当参考信号为HI时,认为输入是32位数据的高16位,移位以40位输出域的高16位为参考点;当参考信号为LO时,认为输入是32位数据的低16位,移位的参考点为输出域的低16位。连续进行两次不同参考点的16位输入的移位操作,然后把两个结果相“或”,就可实现一个双精度32位数据的移位操作。移位扩展位(X)就是移位操作后左边的填充位,根据不同的移位操作,这个扩展位可以是0、输入数的符号位或ASTAT中的进位标志位AC。若为逻辑移位,扩展位为0;若为算术移位,扩展位为输入符号位;若是规格化操作,情况较为复杂,又分3种情况[3]:如果是高位规格化,即参考信号为HI时,左移时扩展位为符号位,右移时扩展位为进位标志位AC;如果是低位规格化,无论左移还是右移,扩展位都为0。
OR/PASS逻辑就可实现上述的“或”操作。它根据SR_OR控制信号决定是否对结果进行“或”操作,如果是普通的16位操作或32位双精度数移位的第一次操作,就不需要进行“或”操作,移位结果直接输出到结果寄存器;若进行的是32位操作的第2次16位移位操作,移位结果就要和第1次操作的结果相“或”后送到结果寄存器。
指数检测器实现的是从16位输入中提取指数的功能,这个指数可看作冗余符号位数,它等于前导相同位数减1。为实现一个32位双精度数的操作,指数提取要受到HIX_HI_LO信号的控制,这个信号表示三种不同的操作方式:高位(HI)、高位扩展(HIX)、低位(LO)。若为HI操作方式,则认为输入是32位数据的高16位,提取出的结果直接输出到移位器指数寄存器SE或移位器块指数寄存器SB;若为HIX方式,输入就被认为可能是执行ALU操作后已溢出的数据,所以指数检测器要考虑AV标志位,如果AV位为1,表示数据已溢出,指数就为+1,否则,和(HI)选项的操作一样;若为LO方式,输入就是32位数据的低16位,这时的检测结果只有在高16位全为0或全为1、且低16位的冗余符号位和高16位相同时才有效,此时,结果为低16位的指数加上16,否则结果不输出。由此可见,这里需要比较两次输入的符号位,所以在提取指数的同时可能还要更新移位输入符号标志位SS。实质上,由于规格化时的移位控制码是SE寄存器的内容的相反数,为实现左移,在上述HI和LO操作方式中,提取出的结果要取相反数才输出到SE或SB寄存器。
指数比较逻辑用于找出输入数据块中各指数的最大值,实现块浮点格式。如果要实现1个16位输入的指数提取操作,只要把结果直接送到SE即可,不经过比较逻辑;如果要实现一串数据的块指数提取操作,则每次提取结果都要进行一次比较,把较大的指数值保存在SB中,当全部提取和比较完成后,SB中保存的就是各输入数据的指数的最大值。