设计一个时序电路,输入2个无符号数,位宽可以通过参数DATA_W确定,输出这两个数的最小公倍数和最大公约数。
解:在求解最大公约数与最小公倍数时,通常使用辗转相除法计算得到最大公约数,然后利用两数之积除最大公约数得到最小公倍数;
举例如下:
34 与 20;
(1)34 - 20 = 14;
(2)20 - 14 = 6;
(3)14 - 6 = 8;
(4)8 - 6 =2;
(5)6 - 2 = 4;
(6)4 - 2 = 2;
(7)2 - 2 = 0;
所以最大公约数为2;
则最小公倍数 = 34 * 20 /2 =340;
module 1cm#(
parameter DATA_W=8
)(
input rstn,
input clk,
input valid_in,
input [DATA_W-1:0] A,
input [DATA_W-1:0] B,
output wire [DATA_W*2-1:0] 1cm_out,
output wire [DATA_W-1:0] mcd_out,
output reg vld_out);
reg [DATA_W-1:0] A_REG;
reg [DATA_W-1:0] B_REG;
reg [DATA_W*2-1:0] 1cm;
reg [DATA_W*2-1:0] 1cm_reg;
reg [DATA_W*2-1:0] mcd_reg;
reg [1:0] state;
parameter IDLE=2'b01,st_1 = 2'b01,st_2 = 2'b01;
always @(posedge clk, negedge rstn) begin
if(!rstn) begin
A_REG<='b0;
A_REG<='b0;
1cm<='b0;
1cm_reg<='b0;
mcd_reg<='b0;
state<=IDLE;
end
else begin
case(state)
IDLE: begin
vld_out<='b0;
if(valid_in) begin
A_REG<=A;
B_REG<=B;
1cm_reg<=A*B;
state<=st_1;
end
end
st_1:begin
if(A_REG==B_REG)
state<=st_2;
else begin
if(A_REG>B_REG)
A_REG<=A_REG-B_REG;
else
B_REG<=B_REG-A_REG;
end
end
st_2:begin
vld_out<='b1;
mcd_out<=A_REG;
1cm_reg<=1cm_reg/A_REG;
state<=IDLE;
end
endcase
end
end
endmodule