被除数8位;除数6位;可以看出,商最多8位,余数最多6位;
怎么来让
FPGA做除法呢?有一种方法就是模拟手工计算。先分析一下代码的思路吧。
1. 第一步就假设商q(8位)是0,余数r(扩展到14位)是被除数,这是除数比被除数d大的情况的结果;
2. 第二步被除数左移7位,为什么这么做呢?写一个1110_1010 除以1的例子就清楚了,最多要移7位。所以不管除数是几位,都扩展到14位,然后移位吧。
3. 第三步 执行r-d;如果是负数,把r还原,q左移1位;如果是正的,q左移1位并+1,这时候r已经变小了;
上面判断完成后,都要执行d右移;右移的原因,也是因为仿手工计算,手工计算时,商是从最高位逐步往下确定的;
4. 什么时候结束,输出结果呢?进行了8次比较后;
module div_res(clk, n_in, d_in, r_out, q_out);
input clk;
input [7:0] n_in;
input [5:0] d_in;
output [5:0] r_out;
reg [5:0] r_out;
output [7:0] q_out;
reg [7:0] q_out;
parameter s0=0, s1=1, s2=2, s3=3;
always @(posedge clk)
begin : States
reg [3:0] count;
reg [1:0] state;
reg [13:0] r, d; //扩充位数
reg [7:0] q;
state <= s0;
case (state)
s0 : begin
state <= s1;
count = 0;
q <= 0;
d <= d_in << 7;
r <= {6'B0, n_in};
end
s1 : begin
r <= r - d;
state <= s2;
end
s2 : begin
if (r[13] == 1) begin
r <= r + d;
q <= q << 1;
end
else begin
q <= (q << 1) + 1;
end
count = count + 1;
d <= d >> 1;
if (count == 8) // Division ready ?
state <= s3;
else
state <= s1;
end
s3 : begin // Output of result
q_out <= q[7:0];
r_out <= r[5:0];
state <= s0; // Start next division
end
endcase
end
endmodule