描述
设计一个时序电路,输入2个无符号数,位宽可以通过参数DATA_W确定,输出这两个数的最小公倍数和最大公约数。
模块的接口信号图如下:
要求使用Verilog HDL语言实现,并编写testbench验证模块的功能。
输入描述:
clk::时钟信号
rst_n:复位信号,低电平有效
A:输入信号,位宽可以通过DATA_W指定
B:输入信号,位宽可以通过DATA_W指定
vld_in:输入数据有效的指示信号
输出描述:
lcm_out:输出最小公倍数
mcd_out:输出最大公约数
vld_out:输出数据有效的指示信号
参考代码
cpp
`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_r;
reg [DATA_W-1:0] b_r;
wire [DATA_W-1:0] a_w;
wire [DATA_W-1:0] b_w;
wire [DATA_W-1:0] res_w;
reg flag_r;
reg [DATA_W*2-1:0] lcm_out_r;
assign vld_out = flag_r && (a_r == b_r);
assign res_w = a_r - b_r;
assign {a_w, b_w} = res_w > b_r ? {res_w, b_r} : {b_r, res_w};
assign mcd_out = vld_out ? a_r : 'd0;
assign lcm_out = lcm_out_r/ mcd_out;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
a_r <= 'd0;
b_r <= 'd0;
flag_r <= 'd0;
end
else if (vld_in) begin
{a_r, b_r} <= A > B ? {A, B} : {B, A};
lcm_out_r <= A * B;
flag_r <= 'd1;
end
else if (vld_out) begin
flag_r <= 'd0;
end
else if (flag_r) begin
a_r <= a_w;
b_r <= b_w;
end
end
endmodule