题解 | #求最小公倍数#
求最小公倍数
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