본문 바로가기
Digital Design/논리회로

[논리회로] Decoder (Design with Verilog)

by 스테고사우르스 2023. 1. 2.

이번에 다룰 논리회로는 Decoder 입니다.

 

Decoder는 N개의 입력을 해독하여 2^N개의 출력으로 내보내는 역할을 합니다.

 

2 to 4 Decoder의 진리표부터 보겠습니다.

 

INPUT OUTPUT
A0 A1 D0 D1 D2 D3
0 0 1 0 0 0
0 1 0 1 0 0
1 0 0 0 1 0
1 1 0 0 0 1

D0 = A0'A1'

D1 = A0'A1

D2 = A0A1'

D3 = A0A1

 

 

위 결과를 게이트로 나타내면 다음과 같습니다.

 

2 to 4 Decoder

 

Decoder를 반대로 만들면 Encoder입니다.

Encoder는 2^N개의 신호를 N개로 만들어주는 역할을 합니다.

 

 


Verilog Code

Decoder를 Verilog로 설계하였습니다.

이번에는 이전과는 조금 다르게 clock을 이용하여 Synchronous하게 설계해보았습니다.

 

 

DUT

`timescale 1ns / 1ps

module decoder_2to4(
i_clk,
i_a,
o_d
    );

input             i_clk;
input       [1:0] i_a;
output reg  [3:0] o_d;

always @ (posedge i_clk) begin
    case (i_a)
        2'b00:   o_d = 4'b1000;
        2'b01:   o_d = 4'b0100;
        2'b10:   o_d = 4'b0010;
        2'b11:   o_d = 4'b0001;
        default: o_d = 4'b0000;
    endcase
end

endmodule

 

 

Testbench

`timescale 1ns / 1ps

module tb_decoder_2to4();

reg        i_clk;
reg  [1:0] i_a;
wire [3:0] o_d;

decoder_2to4 dec ( .i_clk  (i_clk)  ,
                   .i_a    (i_a)    ,
                   .o_d    (o_d)    );

always #5 i_clk = ~i_clk;
initial begin
    i_clk = 1'b0;
    i_a = 2'b00;  #10
    i_a = 2'b01;  #10
    i_a = 2'b10;  #10
    i_a = 2'b11;  #10
    $finish;
end

endmodule

 

 

Simulation

 

Waveform을 보면 5ns까지 o_d의 값이 정의되어 있지 않습니다.

이유는 always 블럭이 clock의 rising edge에서 동작하도록 설계하였기 때문입니다.

 

 


 

댓글