반응형

디코더와 인코더

대부분의 시스템 설계에서 디코더와 인코더의 사용을 경험합니다.

시스템 설계에서 대부분의 경우 디코더를 사용하여 메모리 또는 IO 장치 중 하나를 선택합니다.

 

디코더

디코더에는 n개의 선택 라인 또는 입력 라인과 m개의 출력 라인이 있으며 high 활성 또는 low 활성 출력을 생성하는 데 사용됩니다. 선택 라인과 출력 라인 사이의 관계는 m = 2n으로 주어진다. 한 번에 n개의 입력 라인의 논리 상태에 따라 출력 라인 중 하나가 하이 또는 로우가 됩니다.

 

다음 그림은 3:8 디코더를 나타냅니다. 그림과 같이 X2, X1, X0은 선택 입력이고 Y0 ~ Y7은 하이 활성 출력 라인입니다.

 

다음 표는 디코더의 진리표입니다. 하이 활성 출력 디코더의 경우 한 번에 출력 라인 중 하나가 하이 활성됩니다.

 

X2 X1 X0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
0 0 0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 1 0 0 0
1 0 0 0 0 0 1 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 0 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0

 

다음 그림은 하이 활성 인에이블 입력 en을 갖는 3:8 디코더의 상징적 표현입니다. 표시된 진리표는 활성 하이 활성화 en = 1을 갖는 디코더에 대해 양호합니다. en = 0일 때 디코더는 비활성화되고 출력 Y = 8'b0000_0000입니다.

 

 

다음은 3:8 디코더의 코딩 예제입니다.

 

//Verilog RTL for 3 to 8 decoder
module decoder_3to8 (X,en,Y) ;
input [2:0] X;
input en;
output [7:0] Y;
reg [7:0] Y;

// Functionality of design
always @ (X or en)
begin
  if (en)
    case(X)
      3'b000 : Y= 8'b0000_0001;
      3'b001 : Y= 8'b0000_0010;
      3'b010 : Y= 8'b0000_0100;
      3'b011 : Y= 8'b0000_1000;
      3'b100 : Y= 8'b0001_0000;
      3'b101 : Y= 8'b0010_0000;
      3'b110 : Y= 8'b0100_0000;
      3'b111 : Y= 8'b1000_0000;
    endcase
  else
    Y=8'b0000_0000;
  end
endmodule

 

case 구성을 사용하는 1 라인에서 2 디코더로

1 라인 대 2 또는 (1:2) 디코더에는 하나의 선택 입력 Sel과 두 개의 출력 라인 Out_Y0 Out_Y1이 있습니다.

입력 sel_in, 하이 활성화 입력 enable_in 및 출력 y_out[0], y_out[1]이 있는 1:2 디코더 입니다.

 

Sel Out_Y1 Out_Y0
0 0 1
1 1 0

 

module decoder_1to2 ( input sel_in, input enable_in, output reg [1:0] y_out );
always @*
begin
  if
(enable_in)
    case ( sel_in )
      1'b0 : y_out = 2'b01;
      1'b1 : y_out = 2'b10;
    endcase
  else
    y_out = 2'b00;
  end
endmodule

 

1 Line to 2 Decoder 사용 사례

1 라인 대 2 또는 1:2 디코더에는 1개의 선택 입력 Sel, 인에이블 입력 En 2개의 출력 라인 Out_Y0 Out_Y1이 있습니다.

 

En Sel Out_Y1 Out_Y0
1 0 0 1
1 1 1 0
0 X 0 0

 

//Verilog RTL for 1 Line to 2 Line decoder with active high enable input
module one_two_decoder_with_enable ( Sel, En, Out_Y1, Out_Y0);
input Sel;
input En;
output Out_Y1;
output Out_Y0;
reg Out_Y1;
reg Out_Y0;

always @ (Sel or En)
begin
  if (En)
    case (Sel)
      1'b0 : {Out_Y1, Out_Y0} = 2'b01;
      1'b1 : {Out_Y1, Out_Y0} = 2'b10;
    endcase
  else
    {Out_Y1, Out_Y0} = 2'b00;
  end
endmodule

 

2 Line to 4 Decoder with Enable 사용 사례

2 라인 대 4 또는 (2:4) 디코더에는 2개의 선택 입력 sel_in[1], sel_in[0], enable 입력 enable_in 4개의 출력 라인 y_out[3], y_out[2], y_out[1] y_out이 있습니다.

 

enable_in Sel_in[1] sel_in[0] y_out[3] y_out[2] y_out[1] y_out[0]
1 0 0 0 0 0 1
1 0 1 0 0 1 0
1 1 0 0 1 0 0
1 1 1 1 0 0 0
0 X X 0 0 0 0

 

module decoder_2to4 ( input [1:0] sel_in, input enable_in, output reg [3:0] y_out );
always @*
begin
  if
(enable_in)
    case ( sel_in )
      2'b00 : y_out = 4'b0001;
      2'b01 : y_out = 4'b0010;
      2'b10 : y_out = 4'b0100;
      2'b11 : y_out = 4'b1000;
    endcase
  else
    y_out = 2'b0000;
  end
endmodule

 

로우 활성화가 있는 2라인-4 디코더 사용

2 라인 대 4 또는 (2:4) 디코더에는 2개의 선택 입력 Sel[1], Sel[0], 로우 활성화 입력 En_bar 4개의 활성 로우 출력 라인 Out_Y[3], Out_Y[2], Out_Y[1], Out_Y[0]이 있습니다.

 

En_bar Sel[1] Sel[0] Out_Y[3] Out_Y[2] Out_Y[1] Out_Y[0]
0 0 0 1 1 1 0
0 0 1 1 1 0 1
0 1 0 1 0 1 1
0 1 1 0 1 1 1
1 X X 1 1 1 1

 

//Verilog RTL for 2 Line to 4 Line decoder with active low enable input and active low output lines
module Two_to_Four_decoder(Sel,En_bar, Out_Y);
input [1:0] Sel;
input En_bar;
output [3:0] Out_Y;
reg [3:0] Out_Y;

always @ (Sel or En_bar)
begin
  if (~En_bar)
    case (Sel)
      2'b00 : Out_Y = 4'b1110;
      2'b01 : Out_Y = 4'b1101;
      2'b10 : Out_Y = 4'b1011;
      2'b11 : Out_Y = 4'b0111;
    endcase
  else
    Out_Y = 4'b1111;
  end
endmodule

 

//Verilog RTL for 2 Line to 4 Line decoder with active low enable input and for active low output lines
module Two_to_Four_decoder(Sel,En_bar, Out_Y);
input [1:0] Sel;

input En_bar;

output [3:0] Out_Y;

 

assign Out_Y[3] = (~En_bar) && (~Sel[1]) && (~Sel[0]);
assign Out_Y[2] = (~En_bar) && (~Sel[1]) && (Sel[0]);
assign Out_Y[1] = (~En_bar) && (Sel[1]) && (~Sel[0]);
assign Out_Y[0] = (~En_bar) && (Sel[1]) && (Sel[0]);
endmodule

 

연속 할당을 사용하는 2-4 디코더

디코더의 기능도 연속 할당 구성을 사용하여 설명할 수 있습니다. 다중 할당 구문인 이유는 병렬로 실행되고 병렬 출력 로직으로 유추합니다.

 

module decoder_2to4 ( input [1:0] sel_in, input enable_in, output [3:0] y_out );
assign y_out[0] = enable_in & (~sel_in[1])&(~sel_in[0]);
assign y_out[1] = enable_in & (~sel_in[1])&(sel_in[0]);
assign y_out[2] = enable_in & (sel_in[1])&(~sel_in[0]);
assign y_out[3] = enable_in & (sel_in[1])&(sel_in[0]);
endmodule

 

시프트 연산자를 사용한 디코더

2:4 디코더에 대한 RTL 설계를 구현하는 더 나은 기술은 시프트 연산자를 사용하는 것입니다.

 

module decoder_2to4 ( input [1:0] sel_in, input enable_in, output reg [3:0] y_out );
always @*
begin
  if
(~enable_in)
    y_out = 4'b0000;
  else
    y_out = ( 4'b0001 << sel_in);
  end
endmodule

 

2:4 디코더의 테스트벤치

2:4 디코더의 테스트벤치와 시뮬레이션 결과를 보여주고 있습니다.

 

 

module test_decoder;
// Inputs
reg [1:0] sel_in;
reg enable_in;
// Outputs
wire [3:0] y_out;

// Instantiate the Unit Under Test (UUT)
decoder_2to4 uut ( .sel_in(sel_in), .enable_in(enable_in), .y_out(y_out));

always #10 sel_in[0] = ~sel_in[0];
always #20 sel_in[1] = ~sel_in[1];

initial
begin
  // Initialize Inputs
  sel_in = 0;
  enable_in = 0;
  // Wait 100 ns and then force enable_in =1
  #100;
  enable_in =1 ;

// Wait 250 ns and then force enable_in =0
#250
enable_in =0;

end
endmodule

 

2:4 디코더를 사용하여 4라인에서 16 디코더로

4 라인 대 16 또는 (4:16) 디코더에는 4개의 선택 입력 sel_in[3]: sel_in[0], 활성 로우 인에이블 입력 enable_in이 있으며 4개의 2:4 디코더를 사용하여 설계되었습니다. 2:4 디코더에는 4개의 활성 로우 출력 라인 y_out[3], y_out[2], y_out[1] y-out[0]이 있습니다. 출력에 16개의 2:1 멀티플렉서가 있습니다.

 

module decoder_4to16 ( input [3:0] sel_in, input enable_in, output reg [15:0] y_out );
reg [3:0] tmp_enable;


always@*
  if (~enable_in)
    tmp_enable = 4'b0000;
  else
    tmp_enable = ( 4'b0001 << sel_in[3:2]);

always@*
if (~tmp_enable[0])
  y_out[3:0] = 4'b0000;
else
  y_out [3:0] = ( 4'b0001 << sel_in[1:0]);

 

always@*
if (~tmp_enable[1])
  y_out[7:4] = 4'b0000;
else

y_out [7:4] = ( 4'b0001 << sel_in[1:0]);

always@*
if (~tmp_enable[2])
  y_out[11:8] = 4'b0000;
else
  y_out [11:8] = ( 4'b0001 << sel_in[1:0]);

 

always@*
if (~tmp_enable[3])
  y_out[15:12] = 4'b0000;
else
  y_out [15:12] = ( 4'b0001 << sel_in[1:0]);

endmodule

 

4:16 디코더용 테스트벤치

4:16 디코더에 대한 테스트벤치와 시뮬레이션 결과는 다음과 같습니다.

 

 

module test_decoder_4to16;
// Inputs
reg [3:0] sel_in;
reg enable_in;
// Outputs
wire [15:0] y_out;

// Instantiate the Unit Under Test (UUT)
decoder_4to16 uut (
.sel_in(sel_in),
.enable_in(enable_in),
.y_out(y_out)
);


always #5 sel_in[0] = ~sel_in[0];
always #10 sel_in[1] = ~sel_in[1];
always #20 sel_in[2] = ~sel_in[2];
always #40 sel_in[3] = ~sel_in[3];

initial
begin
  // Initialize Inputs
  sel_in = 0;
  enable_in = 0;

// Wait 100 ns and then force enable_in =1

#100;

enable_in =1 ;
// Wait 250 ns and then force enable_in =0
#250
enable_in =0;

end
endmodule

반응형

+ Recent posts