队伍编号:CICC3280 团队名称:芯新星队
e203内部除法操作使用加减交替迭代法进行运算,除几个特殊运算外,正常的除法操作需要33个周期才能输出运算结果,极大程度地影响了系统的性能。我们对e203的除法器进行了新的算法实现并改进。目前高性能的除法运算大多使用SRT-4算法进行设计。以下是我们针对除法器进行改进的算法。
为了加快除法的运算过程,通常采用前导零预处理的方法对除数以及被除数预处理。在处理期间必须保证结果的正确性(即确定整数除法计算的次数)。
在进行前导零预处理前,需要对操作数进行有符号数至无符号数的转换,转换后只需要在预处理时考虑前导零的情况,而不需要额外考虑前导一的情况,此方法可以大大降低硬件资源开销,并且在预处理之前将除数与被除数的符号位保留,最终求得的商和余数只需要进行符号位的添加即可。
前导零的预处理过程:主要的核心思想是采用移位的方法,并且保证在移位完之后除数的最高位为1,被除数的最高位为0(SRT算法的思想需要将被除数与除数当作小数看待)。由于双快速SRT-4算法单个周期可以同时计算出四个商,因此在进行前导零预处理时,需要保证移位过程中除数与被除数之间存在有4n个零的差值。为增强代码的可读性,整个前导零预处理的过程采用casex语句,代码示例如下:
casex(divisor) //除数的前导零预处理
32'b1xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx :
begin
divisor_temp = divisor; //奇数时补3‘b0或5’b0,偶数时补2’b0或4’b0
dividend_temp = {4'b0 , dividend , 1'b0 }; //扩展到37位
iterations_temp = 1; //需要迭代计算的次数
recovery_temp = 30; //得到最终余数需要移位的次数
end
经过前导零预处理,可以将除法功能模块的执行周期由原来的33的固定周期压缩至1~9的可变周期。