3to8 Decoder

김동현·2025년 4월 7일

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

Enable 단자가 0일때 decoder off
Enable 단자가 1일때 decoder on

3to8 decoder source code

`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 

3to8 Decoder testbench code

`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

Simulation result

Schematic

0개의 댓글