牛客Verilog刷题

8

`timescale 1ns/1ns
module gen_for_module( 
    input [7:0] data_in,
    output [7:0] data_out
);
genvar i;
generate
	for(i=0;i<8;i=i+1)begin
		assign data_out[i]=data_in[7-i];
	end
endgenerate
endmodule

75

`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] A0,B0;
reg [DATA_W*2-1:0] lcm_out_temp;
reg flag;
always@(posedge clk,negedge rst_n)begin
    if(~rst_n)begin
        A0<='d0;
        B0<='d0;
        lcm_out_temp<='d0;
        vld_out<='d0;
        flag<='d0;
    end
    else begin
        if(vld_in)begin
            {A0,B0}<=A>B?{A,B}:{B,A};
            lcm_out_temp<=A*B; 
            flag<='d1; 
        end
        else begin
            A0<=flag ? ((A0>B0)?A0-B0:B0):'d0;
            B0<=flag ? ((A0>B0)?B0:A0):'d0; 
          // B0<=flag ? ((A0>B0)?B0:A0-B0):'d0; 
            lcm_out_temp<=lcm_out_temp;
            flag=vld_out?'d0:flag;
        end      
        vld_out<=flag && (A0==B0);
    end
end
assign mcd_out=vld_out?A0:'d0;
//assign lcm_out=vld_out?lcm_out_temp/A0:'d0;
assign lcm_out=lcm_out_temp/mcd_out;


endmodule
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]A0,B0;
reg [DATA_W*2-1:0] lcm_out_temp;
reg flag;
always@(posedge clk,negedge rst_n)begin
	if(!rst_n)begin
		A0<='d0;
		B0<='d0;
		flag<='d0;
		lcm_out_temp<='d0;
		vld_out<='d0;
	end
	else if(vld_in)begin
		A0<=A;
		B0<=B;
		flag<='d1;
		lcm_out_temp<=A*B;
		vld_out<='d0;
	end
	else if(flag)begin
		A0<=(A0>B0)?A0-B0:B0;
		B0<=(A0>B0)?B0:A0;
		flag<=(A0==B0)?'d0:'d1;
		lcm_out_temp<=lcm_out_temp;
		vld_out<= A0==B0;
	end
	else begin
		A0<=A0;
		B0<=B0;
		flag<=flag;
		lcm_out_temp<=lcm_out_temp;
		vld_out<='d0;
	end
end

assign  mcd_out=(A0==B0 && flag)?A0:mcd_out;
assign lcm_out=lcm_out_temp/mcd_out;

endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值