일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 순서대로방문하기
- ISER
- DenseDepth
- DP
- 왕실의기사대결
- 나무박멸
- Calibration
- 싸움땅
- 마이크로프로세서
- 백준
- ICER
- 루돌프의반란
- dfs
- 시뮬레이션
- 포탑부수기
- 조합
- 이진탐색
- 구현
- 마법의숲탐색
- 소프티어
- 코드트리
- 수영대회결승전
- ros
- 코드트리빵
- BFS
- ARM
- 슈퍼컴퓨터클러스터
- 삼성기출
- 토끼와 경주
- 3Dreconstruction
Archives
- Today
- Total
from palette import colorful_colors
[verilog] 4:1 MUX 구현 (멀티플렉서, multiplexer) 본문
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
'EE 학부과목 > verilog' 카테고리의 다른 글
[verilog] 16bit ALU구현 (0) | 2023.03.13 |
---|---|
[verilog] 1:4 DEMUX 구현 (디멀티플렉서, Demultiplexer) (0) | 2023.03.13 |
[verilog] Full Adder, 4bit Adder 구현 (2) | 2023.03.13 |
[verilog] NAND 구현 (0) | 2023.03.13 |
[verilog] inverter(인버터), bufer(버퍼) (0) | 2023.03.13 |