from palette import colorful_colors

[verilog] 4:1 MUX 구현 (멀티플렉서, multiplexer) 본문

EE 학부과목/verilog

[verilog] 4:1 MUX 구현 (멀티플렉서, multiplexer)

colorful-palette 2023. 3. 13. 12:17

mux41.v 파일 (같은 역할을 하지만, 각기 다른 버전들로  mux들 4가지를 구현했다.)

참고: always문 안에 쓰이는 output변수는 reg여야한다.

//1. case를 사용한 mux(가장 대표적)
module mux41_1(y, a, b, c, d, sel);	
	
	input [3:0] a, b, c, d;	//4bit 입력 4개 선언
	input [1:0]sel; //2bit select 선언
	output reg [3:0]y; //4bit 출력 하나 선언	
 
	always @(*) begin	//case로 mux4 to 1 구성
		case(sel)
			2'b00 : y = a; 
			2'b01 : y = b; 
			2'b10 : y = c; 
			2'b11 : y = d; 
		endcase
	end
endmodule


//2. 3중 연산자와 assign문을 이용해 한 줄로 짠 mux
module mux41_2(y, a, b, c, d, sel);	//using ternary operator
	input [3:0] a, b, c, d;
	input [1:0] sel;
	output [3:0] y;
	
	assign y = (sel == 0) ? a : (sel == 1) ? b : (sel == 2) ? c : d;
endmodule


// 3. 비트 연산자를 이용해 한 줄로 짠 mux
module mux41_3(y, a, b, c, d, sel);
	input [3:0] a, b, c, d;
	input [1:0] sel;
	output [3:0] y;
	
	assign y = (a&~sel[1]&~sel[0])|(b&~sel[1]&sel[0])|(a&sel[1]&~sel[0])|(a&sel[1]&sel[0]);
endmodule


//4. 기본 제공되는 and, or 모듈을 이용한 mux
module mux41_4(y, a, b, c, d, sel);
	input [3:0] a, b, c, d;
	input [1:0] sel;
	output [3:0] y;

	wire a0, a1, a2, a3;
		and u1 (a0, i0, ~s1, ~s0), 
			u2 (a1, i1, ~s1, s0),
			u3 (a2, i2, s1, ~s0),
			u4 (a3, i3, s1, s0);
		or u5 (y, a0, a1, a2, a3);
endmodule

 
 
mux_tb.v 파일

`timescale 1ns / 1ns
module mux41_tb;  
	reg [3:0] a, b, c, d; 
	reg [1:0] sel;
	wire [3:0] z_0609;
	integer i;	//for문을 위해 integer 변수 선언

mux41_1 u1 (.y(z_0609), .a(a), .b(b), .c(c), .d(d), .sel(sel)); 
mux41_2 u1 (.y(z_0609), .a(a), .b(b), .c(c), .d(d), .sel(sel));
mux41_3 u1 (.y(z_0609), .a(a), .b(b), .c(c), .d(d), .sel(sel));


initial begin 
    a = $random; b = $random; c = $random; d = $random; 
    sel =$random;	
    //input들의 initial value: a~b는 0000~1111로 할당, sel은 00~11로 할당

    for(i = 1 ;i<20; i=i+1)	//for 문을 이용해서 sel값이 2ns마다 random하게 변하도록 했다.
        #2 sel = $random;	//2초마다 00~11중 random값 배정

end 

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

endmodule