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

查看9道真题和解析