from palette import colorful_colors

[verilog] 16bit ALU구현 본문

EE 학부과목/verilog

[verilog] 16bit ALU구현

colorful-palette 2023. 3. 13. 14:34

add, sub, mux, div, mux41 모듈을 각각 구현하고 최종적으로 alu16 모듈에 합친 파일. 

add, sub, mux, div, mix41이 alu16의 하위 모듈에 해당한다.

module add(out, a, b);	//adder 모듈
	input [15:0] a, b;	 
	output [15:0] out;
	assign out = a + b;
endmodule


module sub(out, a, b); //subtractor 모듈
	input [15:0] a, b;	 
	output [15:0] out;
	assign out = a - b;
endmodule


module mul(out, a, b);	//multiplyer 모듈
	input [15:0] a, b;	 
	output [15:0] out;
	assign out = a * b;
endmodule


module div(out, a, b);	//divider 모듈
	input [15:0] a, b;	 
	output [15:0] out;
	assign out = a / b;
endmodule


module mux41(out, in0, in1, in2, in3, sel);

	input [15:0] in0, in1, in2, in3;
	input [1:0]sel;
	output reg [15:0] out; 

	always @(*) begin //always문 안에는 모듈이 들어갈 수 없음!!!
		case(sel)	
			2'b00 : out = in0;
			2'b01 : out = in1;
			2'b10 : out = in2;
			2'b11 : out = in3;	
		endcase
	end
endmodule

module test(out, ov, a, b);
	input [3:0] a, b;
	output [3:0] out;
	output ov;
	assign {ov, out} = a * b;
	
	endmodule
	
	
	
module alu16 (out, a, b, sel); 
	
	input [15:0] a, b;	
	input [1:0] sel; 
	output [15:0] out;
	wire [15:0] out0, out1, out2, out3;	//add, sub, mul, div와 mux를 연결해줄 wire 선언

	add u1 (.out(out0), .a(a), .b(b));	//
	sub u2 (.out(out1), .a(a), .b(b));	//out1
	mul u3 (.out(out2), .a(a), .b(b));	
	div u4 (.out(out3), .a(a), .b(b));
	
	mux41 u5 (.out(out), .in0(out0), .in1(out1), .in2(out2), .in3(out3), .sel(sel)); 
	// mux41 u5 (out, out0, out1, out2, out3, sel); 요렇게 불러와도 된다.
	
	
	/* mux 모듈을 사용하지 않을 경우 (add~ div모듈만)
		always @(*) begin //	
		!!!!!!always문 안에는 모듈이 들어갈 수 없음 참고!!!
		
		case(sel)	
			2'b00 : out = out0;
			2'b01 : out = out1;
			2'b10 : out = out2;
			2'b11 : out = out3;	
		endcase
	end
	*/
	
endmodule


/* //모듈들 없이 alu16만으로 코드 만드는 경우
	always @(*) begin	
		case(sel)	
			2'b00 : out = a + b;
			2'b01 : out = a - b;
			2'b10 : out = a * b;
			2'b11 : out = a / b;
		endcase
	end
*/

 

alu16_tb.v 파일

`timescale 1ns / 1ns
module alu16_tb;  

	integer i;	//for문을 위해 integer 변수 선언

	reg [3:0] a, b;	
	reg [1:0] sel; 
	wire [3:0] out;
	wire ov;

//alu16 alu (.out(out), .a(a), .b(b), .sel(sel));
test u1 (out, ov, a, b);

	initial begin 
		a = 16'd3; b = 16'd3; sel = 0;
		
		
		#10 $finish;
		//for(i = 1 ;i<20; i=i+1)	#2 sel = $random;	
		
	end 

initial begin
	$dumpfile("output.vcd");
	$dumpvars(0);
end

endmodule