Verilog实现计算最大公约数和最小公倍数

设计一个时序电路,输入2个无符号数,位宽可以通过参数DATA_W确定,输出这两个数的最小公倍数和最大公约数。

解:在求解最大公约数与最小公倍数时,通常使用辗转相除法计算得到最大公约数,然后利用两数之积除最大公约数得到最小公倍数;

举例如下:
34 与 20;

(1)34 - 20 = 14;

(2)20 - 14 = 6;

(3)14 - 6 = 8;

(4)8 - 6 =2;

(5)6 - 2 = 4;

(6)4 - 2 = 2;

(7)2 - 2 = 0;

所以最大公约数为2;

则最小公倍数 = 34 * 20 /2 =340;

module 1cm#(
parameter DATA_W=8
)(
input rstn,
input clk,
input valid_in, 
input [DATA_W-1:0] A,
input [DATA_W-1:0] B,


output wire [DATA_W*2-1:0] 1cm_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] 1cm;
reg [DATA_W*2-1:0] 1cm_reg;
reg [DATA_W*2-1:0] mcd_reg;
reg [1:0] state;
parameter IDLE=2'b01,st_1 = 2'b01,st_2 = 2'b01;
always @(posedge clk, negedge rstn) begin
	if(!rstn) begin
	A_REG<='b0;
	A_REG<='b0;
	1cm<='b0;
	1cm_reg<='b0;
	mcd_reg<='b0;
	state<=IDLE;
	end
	else begin
		case(state) 
			IDLE: begin
				vld_out<='b0;
				if(valid_in) begin
					A_REG<=A;
				    B_REG<=B;
					1cm_reg<=A*B;
					state<=st_1;
				end
			end
			st_1:begin
				if(A_REG==B_REG)
					state<=st_2;
				else begin
					if(A_REG>B_REG)
						A_REG<=A_REG-B_REG;
					else
						B_REG<=B_REG-A_REG;
				end
			end
			st_2:begin
				vld_out<='b1;
				mcd_out<=A_REG;
				1cm_reg<=1cm_reg/A_REG;
				state<=IDLE;	
			end
		endcase
	end
end
endmodule
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值