题解 | #求最小公倍数#
求最小公倍数
https://www.nowcoder.com/practice/ce067d6beee2413c8a26d37ca1a9431f
我对1楼的代码进行仿真,他的代码有一定错误,判断的顺序不对,因为vld_in一直为1,就一直执行else if(vld_in),所以要把vld_in放在最后,先判断计算过程是否还在继续,再判断是否结束,最后判断是否开始计算。
这里放上仿真图和代码
`timescale 1ns/1ns
module tb#(parameter DATA_W='d8);
reg [DATA_W-1:0] A;
reg [DATA_W-1:0] B;
reg clk;
reg rst_n;
reg vld_in;
//parameter DATA_W = 'd8;
always #10 clk=!clk;
initial begin
clk <=0;
rst_n <=0;
vld_in <=0;
A <='d0;
B <='d0;
#40 rst_n <=1;
vld_in <=1;
A <=8'd40;
B <=8'd24;
#200 B <=8'd80;
#200 A <=8'd54;
B <=8'd18;
end
lcm
#( .DATA_W (DATA_W) )
u_lcm (
.A (A),
.B (B),
.vld_in (vld_in ),
.rst_n (rst_n ),
.clk (clk ),
.lcm_out (lcm_out),
.mcd_out (mcd_out),
.vld_out (vld_out)
);
endmodule
`timescale 1ns/1ns
module lcm#(
parameter DATA_W)
(
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 wire vld_out
);
reg [DATA_W-1:0] A_reg;
reg [DATA_W-1:0] B_reg;
wire [DATA_W-1:0] A_reg0;
wire [DATA_W-1:0] B_reg0;
wire [DATA_W-1:0] C_reg0;
reg [DATA_W*2-1:0] lcm_out_reg;
reg flag;
assign vld_out = flag && (A_reg==B_reg);
assign C_reg0 = A_reg - B_reg;
assign {A_reg0,B_reg0} = (C_reg0 >= B_reg)?{C_reg0,B_reg}:{B_reg,C_reg0};
assign mcd_out = vld_out?A_reg:0;
assign lcm_out = vld_out?lcm_out_reg/mcd_out:0;
always @ (posedge clk or negedge rst_n)begin
if(!rst_n)begin
A_reg <='d0;
B_reg <='d0;
flag <=0;
lcm_out_reg <='d0;
//vld_out <='d0;
end
else if(flag&&!vld_out) begin
A_reg <=A_reg0;
B_reg <=B_reg0;
//vld_out <= flag && (A_reg==B_reg);
end
else if(vld_out)begin
flag <='d0;
//vld_out <='d0;
end
else if(vld_in)begin
{A_reg,B_reg} <= (A>=B)?{A,B}:{B,A};
lcm_out_reg <=A * B;
flag <='d1;
//vld_out <='d0;
end
end
endmodule
华为HUAWEI成长空间 647人发布
