求最小公倍数

求两个数的最大公约数和最小公倍数

两个数互相减,知道两者相等即最大公约数,两数相乘/最大公约数即最小公倍数

对于状态变换,但是变量的值保持不变,可以不进行赋值

但是result状态vld_out为1,idle不能保持为1

`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
);
    reg [DATA_W-1:0] buf1,buf2;
    reg [DATA_W*2-1:0] mult;
    parameter idle=  2'd0;
    parameter jian=  2'd1;
    parameter result=2'd2;
    reg [DATA_W-1:0]mcd;
    reg [1:0]c_state,n_state;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            c_state<=idle;
        else
            c_state<=n_state;
    end
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            n_state<=idle;
            buf1    <=0;
            buf2    <=0;
            mcd     <=0;
            vld_out <=0;
            mult    <=0;
        end
        else begin
            case(c_state)
                idle:begin
                    vld_out<=0;  //result状态vld_out为1,idle不能保持
                    if(vld_in)begin
                        n_state<=jian;
                        buf1    <=A;
                        buf2    <=B;
                        mult    <=A*B;
                    end
                    else begin
                        n_state<=idle;
                    end
                end
                jian:begin
                    if(buf1>buf2)begin
                       buf1<=buf1-buf2;
                       buf2<=buf2;
                       n_state<=jian;
                    end
                    else if(buf1<buf2)begin
                       buf2<=buf2-buf1;
                       buf1<=buf1;
                       n_state<=jian;
                    end
                    else 
                        n_state<=result;
                end
                result:begin
                    mcd<=buf1;
                    n_state<=idle;
                    vld_out<=1;
                end
                default:begin
                    n_state<=idle;
                    vld_out<=0;
                end
            endcase
        end
    end
    assign lcm_out=mult/mcd;
    assign mcd_out=mcd;                        
                        
                            
endmodule

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值