risclite/R8051

除法器实现问题请教

lalalasolo opened this issue · 1 comments

您好,我正在阅读您写的书籍,但是对于代码中的除法器的实现,您的书里面并没有详细的解释,可否指教一下?或者告诉我算法的名字,我自行查阅.您可以发到下面的邮箱,谢谢.
wangjiaqi_work@outlook.com

你说的是下面这个函数实现吗?

这个计算方法就如同拿张纸出来,写出被除数,然后对除数进行移位相减。
x7/6/5/4/3/2/1/0表示当前的被除数, ans[n]表示当前的商。

第一步: x7 = a。
ans[7] = (|b[7:1])? 1'b0 : x7[7];
如果要得到有效的ans[7],那么b[7:1]必须等于0。也就是只有除数b等于1,那么ans[7]才有意义,否则一定等于0。

第二步:x6 = {(~ans[7])&a[7],a[6:0]};
ans[6] = (|b[7:2])? 1'b0 : (x6[7:6]>=b[1:0]);
在得到了ans[7]后,减掉运算ans[7]的除数,那么这个差就是第二步的被除数。
同理,如果想得到ans[6],那么b[7:2]也必须等于0。在等于0的情况下,用被除数减去除数移位后的结果:x6[7:6]-b[1:0]。如果够减,也就是x[7:6]大于b[1:0],那么ans[6]也就得到了计算结果。

第三步:y5 = ans[6] ? (x6[7:6]-b[1:0]) : x6[7:6];
x5 = { y5, a[5:0] };
ans[5] = (|b[7:3])? 1'b0 : ( x5[7:5]>=b[2:0] );
x5还是减去得到前面商数后的被减数。y5只不过是一个中间变量。想想我们计算除法,都是先试商,如果某一个商位为1,那么被除数减去移位后的除数,作为下一次运算的被除数。
得到ans[5]的逻辑还是同样的。必须是b[7:3]等于0,否则ans[5]就得为0。在这个条件下,判断x5[7:5]和b[2:0]的大小,也就是够不够减。

后面的过程推演相同。最后得到x0和ans[0]后,rem = ans[0] ? (x0-b) : x0; 那么最后余数也就有了。

整个过程来源于用笔算除法运算。

function [15:0] divide ( input [7:0] a, input [7:0] b);
reg [7:0] ans;
reg [7:0] rem;
reg [7:0] x7;
reg [7:0] x6;
reg [7:0] x5;
reg [7:0] x4;
reg [7:0] x3;
reg [7:0] x2;
reg [7:0] x1;
reg [7:0] x0;

reg [1:0] y5;
reg [2:0] y4;
reg [3:0] y3;
reg [4:0] y2;
reg [5:0] y1;
reg [6:0] y0;
begin

x7 = a;
ans[7] = (|b[7:1])? 1'b0 : x7[7];

x6 = {(~ans[7])&a[7],a[6:0]};
ans[6] = (|b[7:2])? 1'b0 : (x6[7:6]>=b[1:0]);

y5 = ans[6] ? (x6[7:6]-b[1:0]) : x6[7:6];
x5 = { y5, a[5:0] };
ans[5] = (|b[7:3])? 1'b0 : ( x5[7:5]>=b[2:0] );

y4 = ans[5] ? (x5[7:5]-b[2:0]) : x5[7:5];
x4 = { y4, a[4:0]};
ans[4] = (|b[7:4])? 1'b0 : ( x4[7:4]>=b[3:0] );

y3 = ans[4] ? (x4[7:4]-b[3:0]) : x4[7:4];
x3 = {y3, a[3:0]};
ans[3] = (|b[7:5])? 1'b0 : ( x3[7:3]>=b[4:0] );

y2 = ans[3] ? (x3[7:3]-b[4:0]) : x3[7:3];
x2 = {y2,a[2:0]};
ans[2] = (|b[7:6])? 1'b0 : ( x2[7:2]>=b[5:0] );

y1 = ans[2] ? (x2[7:2]-b[5:0]) : x2[7:2];
x1 = {y1,a[1:0]};
ans[1] = (|b[7]) ? 1'b0 : ( x1[7:1]>=b[6:0] );

y0 = ans[1] ? (x1[7:1]-b[6:0]) : x1[7:1];
x0 = {y0,a[0]};
ans[0] = (x0>=b);

rem = ans[0] ? (x0-b) : x0;

divide = {rem,ans};
end

endfunction