本帖最后由 GoldSunMonkey 于 2013-3-9 21:53 编辑
module math1(num, den, res);
parameter N = 8;
input [N-1 : 0] num, den;
output [N-1 : 0] res;
reg [N-1 : 0] res;
reg [N-1 : 0] den_buf[N : 0], rem_buf[N : 0];
reg [N-1 : 0] num_buf;
integer i1, i2, i3;
always @(num, den) begin
i1 = 0;
repeat(N + 1) begin
if(i1 <= N) begin
num_buf = 0;
for(i3 = N-1; i3 >= 0; i3 = i3 - 1) begin
if({num_buf, num[i3]} >= {'b0, den}) begin
num_buf = {num_buf[N-2 : 0], num[i3]} - den;
end
else begin
num_buf = {num_buf[N-2 : 0], num[i3]};
end
end
rem_buf[0] = num_buf;
den_buf[0] = den;
den_buf[1] = rem_buf[0];
for(i2 = 1; i2 <= N; i2 = i2 + 1) begin
num_buf = 0;
for(i3 = N-1; i3 >= 0; i3 = i3 - 1) begin
if({num_buf, den_buf[i2 - 1][i3]} >= {'b0, den_buf[i2]}) begin
num_buf = {num_buf[N-2 : 0], den_buf[i2 - 1][i3]} - den_buf[i2];
end
else begin
num_buf = {num_buf[N-2 : 0], den_buf[i2 - 1][i3]};
end
end
rem_buf[i2] = num_buf;
if(i2 < N) begin
den_buf[i2 + 1] = rem_buf[i2];
end
end
if(rem_buf[i1] == 0) begin
res = den_buf[i1];
i1 = N + 1;
end
else begin
i1 = i1 + 1;
end
end
end
end
endmodule
测试:
15, 6: 最大公约数是3
12, 30: 最大公约数是6
255, 130: 最大公约数是5
:lol
|