题解 | #求最小公倍数#
求最小公倍数
https://www.nowcoder.com/practice/ce067d6beee2413c8a26d37ca1a9431f
gcd算法
没办法通过结果标准波形,因为比标准波形快了几个周期
gcd算法就是反复迭代,比如8和6
gcd(8,6)-gcd(6,2(8%6))-gcd(2,0)
最大公倍数就是2
最小公约数=A*B/最大公倍数
`timescale 1ns/1ns
module lcm#(
parameter DATA_W = 8)
(
input [DATA_W-1:0] A,
input [DATA_W-1:0] B,
input vld_in,
input rst_n,
input clk,
output wire [DATA_W*2-1:0] lcm_out,
output wire [DATA_W-1:0] mcd_out,
output reg vld_out
);
//gcd
reg [DATA_W-1:0] tmp_m,tmp_n,reg_b,reg_s,mcd_out_r;
reg [DATA_W*2-1:0] lcm_out_r;
reg flag;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
reg_b <= 0;
reg_s <= 0;
vld_out <= 0;
lcm_out_r <= 0;
mcd_out_r <= 0;
flag <= 0;
end
else if(vld_in && A>B) begin
reg_b <= A;
reg_s <= B;
flag <= 1;
end
else if(vld_in) begin
reg_b <= B;
reg_s <= A;
flag <= 1;
end
else if(reg_b % reg_s != 0) begin
reg_b <= reg_s;
reg_s <= reg_b % reg_s;
end
else if(reg_b % reg_s == 0 && flag == 1) begin
vld_out <= 1;
mcd_out_r <= reg_s;
lcm_out_r <= tmp_m * tmp_n / reg_s;
flag <= 0;
end
else begin
vld_out <= 0;
mcd_out_r <= 0;
lcm_out_r <= 0;
end
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
tmp_m <= 0;
tmp_n <= 0;
end
else if(vld_in) begin
tmp_m <= A;
tmp_n <= B;
end
end
assign mcd_out = mcd_out_r;
assign lcm_out = lcm_out_r;
endmodule
查看1道真题和解析
