16位DSP处理器的移位器的研究
扫描二维码
随时随地手机看文章
曾瑞淮,钟冬庆 摘要:本文从移位器的功能描述、结构分析入手,并详细阐述了一款16位dsp处理器的高频率低功耗移位器的三个模块的设计。
关键词:移位器;dsps;设计 在一般的微处理器中,没有单独设计的移位器,移位功能在算术逻辑单元中实现。但由于dsp处理器对运算速度要求较高,通过alu来实现一些移位功能无法满足其要求,所以在dsp中一般设有专门的移位器。移位器不仅可以提高一般移位功能的速度,还可以更加高速地实现与2的n次幂的乘法运算。因此对dsp处理器的移位器(shifter)的研究很有必要的。 移位器是是执行单元的重要组成部分,所有算法的实现都是由执行单元的基本功能组合而成,所有的其他单元例如控制、数据通路都是为执行单元服务的,控制执行部件的具体动作,为执行部件提供充分的数据。嵌入式定点16位dsp的执行单元结构如图1所示。dsp执行单元包含3个子单元:16位(结果为40位)移位单元(shift)、16位算术逻辑单元(alu)和16位(结果为40位)乘法累加单元(mac)。并行的对数据寄存器堆(dreg)进行数据的存取。dreg包含16个16位的通用寄存器,流水线的最后一级从dreg中读取数据,将指令执行的结果,写回到dreg中,而所有的这些运算操作在一个时钟周期内完成[1]。 16位dsp处理器的移位器主要执行的是两类功能:一是实现移位操作,它的输入是16位,移位后的输出是40位。二是指数检测,即从16位的输入数据中检测出前导冗余位的位数(从高位起),作为结果指数输出到寄存器。 移位操作主要有三种:逻辑移位,算术移位和规格化操作。它们都可以在左右两个方向进行,但不能进行循环移位。执行逻辑移位时,它的输入看作是无符号数,移位后左右两边的空位均用0填充;算术移位时,输入看作有符号补码数,移位后左边的空位填充符号位,右边补0;规格化操作和上述两种移位操作相似,但扩展位情况比较复杂一些,移位后右边填0,左边的空位要根据移位控制信号的不同情况填充0、符号位或算术状态寄存器中的进位标志位ac。三种移位操作中移出边界(sr39或sr0)的位都被舍弃。 指数检测的目的是进行类似于定点到浮点的数据转换。一个定点数,可以用一个包含尾数和指数(也称阶码)的浮点数来表示,这样可以提高数据的表数范围,同时使得我们的定点dsp能在不增加浮点算法开销的情况下获得浮点dsp的某些运算能力。指数检测(也称为指数提取)的结果就作为指数,然后用这个指数作为移位控制码对输入数据进行规格化操作,就得到了尾数。也可以采用这个方法使一串数据(数据块)共用同一个指数,只是各自的尾数不同,这种数据格式称为块浮点格式。1. 结构分析 移位器阵列是一个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位输入中提取指数的功能,这个指数可看作冗余符号