题解 | 求最小公倍数
求最小公倍数
https://www.nowcoder.com/practice/ce067d6beee2413c8a26d37ca1a9431f
`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] A_reg;
reg [DATA_W-1:0] B_reg;
reg [DATA_W*2-1:0] 	lcm;
reg [DATA_W-1:0]	mcd;
 
reg [1:0] current_state,next_state;
always@(posedge clk or negedge rst_n)
if(!rst_n)
  current_state <= 2'd0;
else
  current_state <= next_state;
always@(posedge clk) begin
    case(current_state)
    2'd0: next_state <= vld_in ? 2'd1:2'd0;
    2'd1: next_state <= (A_reg==B_reg) ? 2'd2 : 2'd1;
    2'd2: next_state <= 2'd0;
    default:next_state <= 2'd0;
    endcase
end
always@(posedge clk or negedge rst_n)
if(!rst_n) begin
  A_reg <= 0;
  B_reg <= 0;
  mcd <= 0;
  lcm <= 0;
  vld_out <= 0;
  end
else begin
    case(current_state)
    2'd0:begin
        if(vld_in) begin
        A_reg <= A;
        B_reg <= B;
        lcm <= A*B;
        vld_out <= 0;
        end
        else
          vld_out <= 0;
    end
    2'd1:begin
          vld_out <= 0;
        if(A_reg != B_reg)
          {A_reg,B_reg} <= (A_reg > B_reg) ? {(A_reg - B_reg),B_reg} : {(B_reg - A_reg),A_reg};
        else 
          {A_reg,B_reg} <= {A_reg,B_reg};
    end 
    2'd2:begin
        mcd <= B_reg;
        vld_out <= 1;
        end
    default: begin
          vld_out <= 0;
        A_reg <= A_reg;
        B_reg <= B_reg;
        mcd <= mcd;
        lcm <= lcm;
    end
    endcase 
end
// always@(posedge clk or negedge rst_n)
// if(!rst_n) 
//   vld_out <= 0;
// else 
//   vld_out <= (current_state==2'd2) ? 1 : 0;
assign mcd_out = mcd;
assign lcm_out =lcm/mcd;
endmodule
 查看5道真题和解析
查看5道真题和解析