题解 | #求最小公倍数#

求最小公倍数

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

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 12:01
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 20:12
点赞 评论 收藏
分享
真烦好烦真烦:豆包润色了自己没看看吗,再说了,都说豆包是愚蠢且勤快的大学生,ds才是聪明的研究生,怎么敢让豆包写论文的
你们的毕业论文什么进度了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务