题解 | #求最小公倍数#

求最小公倍数

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

全部评论

相关推荐

Wy_m:只要不是能叫的上名的公司 去实习没有任何意义 不如好好沉淀自己
点赞 评论 收藏
分享
04-17 10:16
门头沟学院 Java
不河狸啊:为什么我的是已送达,连已读都没有
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务