3to8 디코더는 input 3개와 Enable 단자 8개의 output 으로 이루어져있다.

Enable 단자가 0일때 decoder off
Enable 단자가 1일때 decoder on
`timescale 1ns/1ps
module decoder_3to8(
input [2:0] in, //3비트 입력
input en, // 디코더 활성화 신호
output reg [7:0] out
);
always @(*) // 입력신호에 따라 동작하는 조합 논리
begin
if(!en) // en이 0일때의 가정
begin
out = 8'h0; //output은 0
end
else
begin
case(in)
3'd0 : out= 8'h01;
3'd1 : out= 8'h02;
3'd2: out= 8'h04;
3'd3 : out= 8'h08;
3'd4 : out= 8'h10;
3'd5 : out= 8'h20;
3'd6 : out= 8'h40;
3'd7 : out= 8'h80; //8비트 16진수 값을 나타냄.
endcase
end
end
endmodule
`timescale 1ns/1ps
module tb_decoder_3to8;
reg [2:0] in;//reg 테스트 벤치 안에서 값을 줄 수 있는 입력신호
reg en; //enable 단자
wire [7:0] out; // wire: 테스트 대상 모듈로부터 나오는 출력
decoder_3to8 dut ( // 테스트할 디코더 모델을 dut 라는 이름으로 인스턴스 화 진행
.in(in), //디코더의 in에 테스트벤치의 in 연결
.en(en), // en에 테스트벤치의 en 연결
.out(out) // out에 테스트벤치의 out 연결
);
initial begin //테스트가 실행되면 한번 실행하는 블록
$display("Time\t en in | out");
$display("-------------------------");
en = 0; in = 3'b000; #10; //enable단자가 0이면 디코더가 실행하지 않는다.
$display("%4t\t %b %b | %b", $time, en, in, out);
en = 1; in = 3'b000; #10; //enable 단자를 한번 1로 입력하면 0으로 바꾸기 전까지 enable 값을 다시 바꿀 필요가 없다.
$display("%4t\t %b %b | %b", $time, en, in, out);
in = 3'b001; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
in = 3'b010; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
in = 3'b011; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
in = 3'b100; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
in = 3'b101; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
in = 3'b110; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
in = 3'b111; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
en = 0; in = 3'b101; #10;
$display("%4t\t %b %b | %b", $time, en, in, out);
$finish;
end
endmodule

