首页 > 代码库 > 串行除法与并行除法
串行除法与并行除法
以下内容摘自《步步惊芯——软核处理器内部设计分析》一书
串行除法与并行除法
8.2.1 串行除法
OR1200中使用的串行除法算法是“试商法”。设被除数是m,除数是n,商保存在s中,被除数的位数是k,其计算步骤如下(为了便于说明,在此处所有数据的最低位称之为第1位,而不称为第0位):
(1)取出被除数的最高位m[k],使用被除数的最高位减去除数n,如果结果大于等于0,则商的s[k]为1,反之为0。
(2)如果上一步得出的结果是0,表示当前的被减数小于除数,则取出被除数m[k-1],与当前被减数组合为下一轮的被减数;如果上一步得出的结果是1,表示当前的被减数大于除数,则利用第2步中减法的结果与被除数剩下的值的最高位m[k-1]组合为下一轮的被减数。k等于k-1。
(3)新的被减数减去除数,如果结果大于等于0,则商的s[k]为1,否则s[k]为0,后面的步骤重复2-3,直到k等于1。
上述步骤可以使用图8.4描述。
图8.4 试商法的运算过程
以1101除以0010为例, 采用试商法时的计算步骤如表8.2所示。
试商法进行除法运算需要的时间与操作数的位数有关,对于32位的OR1200处理器而言,如果采用试商法进行除法运算,那么至少需要32个时钟周期才能得到除法结果。
并行除法
试商法需要的时间太长,在OR1200中还可以配置采用并行除法,直接使用除法运算符进行除法运算,所有的工作交给综合工具完成,其代码很简单,如下:
or1200_mult_mac.v always @(`OR1200_RST_EVENT rst or posedge clk) begin if (rst == `OR1200_RST_VALUE) begin div_quot_r <= 32‘d0; div_quot_generic <= 32‘d0; end else begin if (alu_op_udiv & !(|y)) // unsigned divide by 0 - force to MAX div_quot_generic[31:0] <= 32‘hffff_ffff; else if (alu_op_div) div_quot_generic[31:0] <= x / y; //直接使用除法运算符进行除法运算 end div_quot_r[31:0] <= div_quot_generic; end
使用并行除法虽然提高了除法运算速度,但速度的提高是以资源的消耗为代价的,图8.5、8.6分别给出了并行除法、串行除法两种实现方式在Altera器件上资源占用的比较,可见串行除法比并行除法要少用很多FPGA资源。用户需要根据自己的情况选择合适的除法算法。
图8.5 使用并行除法时OR1200在Altera器件上占用的资源
图8.6 使用串行除法时OR1200在Altera器件上占用的资源