Language/Verilog

Vivado : Decoder, Encoder

짱도르딘 2024. 6. 25. 19:13
728x90

이번에는 Vivado를 활용하여 디코더와 인코더를 구현해보려고 한다.

 

디코더

먼저 구현해 볼 디코더는 2X4 디코더이다. 2X4 디코더는 2bit의 입력과 4bit의 출력을 가진다.

2X4 디코더를 구현할 코드는 아래와 같다.

module decoder_2X4_b(
    input [1:0] code,
    output reg [3:0] signal);

    always @(code)begin
        if(code == 2'b00) signal = 4'b0001;
        else if(code == 2'b01) signal = 4'b0010;
        else if(code == 2'b10) signal = 4'b0100;
        else if(code == 2'b11) signal = 4'b1000;
    end

endmodule

 

위 코드는 동작적 모델링 방식으로 2X4 디코더를 구현한 것으로, 코드를 보아 알 수 있듯이 직관적인 것을 확인할 수 있다.

입력은 [1:0]을 사용하여 2bit 입력을 선언하였고, 출력은 [3:0]을 사용하여 4bit 출력을 선언하였다.

 

입출력은 if문 내 2bit 입력 조건이 성립될 시, 이에 따른 각각의 조건에 맞게 4bit 출력을 설정하였다.

코드를 동작시키면 다음과 같은 결과 화면이 나타난다.

2X4 Decoder_if

 

if문이 아닌, case를 활용하여 2X4 디코더를 구현하려면 다음과 같은 코드를 필요로 한다.

module decoder_2X4_b(
    input [1:0] code,
    output reg [3:0] signal);
    
        always @(code)begin
        case(code)
            2'b00 : signal = 4'b0001;
            2'b01 : signal = 4'b0010;
            2'b10 : signal = 4'b0100;
            2'b11 : signal = 4'b1000;
            default : signal = 4'b0001;
        endcase
    end 
endmodule

 

case문을 활용하여 코드를 구현할 때에는 default가 사용되는 것을 확인할 수 있는데, 이는 설정 된 조건 외 다른 조건에서의 불필요한 동작을 막기 위해 사용되는 것이다.

 

case문을 활용한 코드의 동작 결과는 if문을 사용하여 구현하였을 때와 동일함을 확인할 수 있다.

2X4 Decoder_case


다음은 Dataflow 모델링 기법을 활용하여 2X4 디코더를 구현한 경우이다.

module decoder_2X4_d(
    input [1:0] code,
    output [3:0] signal);

    assign signal = (code == 2'b00) ? 4'b0001 :
                    ((code == 2'b01) ? 4'b0010 :
                    ((code == 2'b10) ? 4'b0100 : 4'b1000));

endmodule

 

코드 출력 파형은 아래와 같다.

 

2X4 Decoder_dataflow


인코더

이번에는 인코더를 구현하려고 한다. 인코더는 4X2 인코더를 구현할 예정이며, 인코더의 동작은 디코더의 동작과는 반대로 4bit의 입력을 받고, 2bit의 출력을 내보내는 동작을 한다.

 

4X2 인코더를 동작적 모델링 기법을 활용하여 구현하면 아래와 같은 코드로 구현이 된다.

module encoder_4X2_b(
    input [3:0] signal,
    output reg [1:0] code);
    
    always @(signal)begin
        if(signal == 4'b0001) code = 2'b00;
        else if(signal == 4'b0010) code = 2'b01;
        else if(signal == 4'b0100) code = 2'b10;
        else if(signal == 4'b1000) code = 2'b11;
        else code = 2'b00; 
    end        

endmodule

 

4X2 인코더의 코드를 동작시키면, 다음과 같은 결과화면이 출력된다.

4X2 Encoder_behavior

 

 

 

728x90