摘要:本文从移位器的功能描述、结构分析入手,并详细阐述了一款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位输入中提取指数的功能,这个指数可看作冗余符号位数,它等于前导相同位数减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中保存的就是各输入数据的指数的最大值。
2. 具体实现
硬件实现采用自顶向下(Top-Down)的设计思想,用Verilog HDL对这个移位器进行RTL描述。根据以上的结构分析,硬件实现的整个Shifter模块由三个子模块组成:移位器阵列(shifter_array)、指数检测器(exponent_detector)和指数比较器(compare)。另外的OR/PASS逻辑的功能在移位器阵列中实现。下面分别介绍各子模块的具体实现[4]。
2.1.移位器阵列模块
为了实现三种类型的移位操作,移位器阵列[5]设计采用了一个移位链结构。
这个移位链由6个分别为1、2、4、8、16、32位的双向移位寄存器组成。这些移位寄存器的移位方向由移位码的最高位(即符号位)控制,如果最高位为1,左移,最高位为0时右移。而它们移位与否则分别由移位控制码的第0到5位控制。如果相应的位为1,则移位,否则不移位,结果按原值输出。前面提到,移位器阵列要实现-128-127范围内的移位功能,而此处设计的移位链能够实现的各种移位组合只是在-63-63范围内。实质上,从移位器阵列的输入(16位)和输出(40位)的分析可看出:移位的有效范围是比较小的,当高位移位时,左移超过24位或右移超过32位时,最后结果是一样的,就是全为0或全为1;同样,低位移位时,左移超过40位或右移超过16位时,最后结果也是一样的,就是全为0或全为1,所以设计时,在移位前进行了一次范围判断和缩减,使得实际的移位操作只需在-40-32之间就可以了,且能达到-128-127范围的移位效果。这样的设计节省了两个移位寄存器(否则需要8个移位寄存器),既减小了面积,又降低了功耗。同时数据通路也变短了,大大提高了执行速度。这个移位器阵列还要判断移位溢出标志位SV。只有当输出的高9位全为1或全为0时,结果没有溢出;否则,结果溢出,SV置为0。
2.2.指数检测器模块
指数检测器的实现一般可以采用常见的序列检测逻辑,即采用计数器行为的描述方式,从最高位依次检测。但这种结构的实现一般面积、功耗都比较大,不宜采用。也可以采用有限状态机来实现,但在我们的设计中有限状态机的状态数量太多,导致硬件实现面积过大,所以这种实现方法也不可取。从指数检测器的功能分析和各种可能实现方式的比较可知,采用一个带优先级的多路选择器可以较为有效地实现指数检测,而功耗和面积却大大减小。由于这个检测器只检测前导连续相同符号位,各种输入数据都可归纳为32种情况,所以只要一个32选1的多路选择器就可以实现指数检测功能。除了提取指数的操作外,指数检测器还需要判断移位器输入符号标志位SS作为输出信号。这个标志位,它是提供低位(LO)方式指数检测时使用的,为了判断32位数据的低16位的符号位是否与高16位相同,高16位的符号位必须在高位(HI)或高位扩展(HIX)方式的指数检测时保存到标志位SS中。所以,移位器输入符号标志位的判断只在高位或高位扩展方式的指数检测操作进行。
2.3.指数比较器模块
指数比较器逻辑比较简单,采用一般的有符号数据比较器即可实现。比较的对象是这次指数提取操作提取的指数值与SB寄存器中保存的上次提取的指数值。两者中较大的那个指数值作为结果输出到SB中。
3.模拟和综合结果
完成RTL描述后,采用Modelsim对整个移位器模块进行模拟仿真[6],模拟结果表明设计完全正确。接着采用Synopsys公司的Physical Compiler用SIMC(中芯国际)的0.18工艺库对设计进行综合,整个移位器的最长路径延时为2.5ns,面积为1200门左右,在400M的频率下功耗大约为13mw。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』