본문 바로가기
Digital Logic/Verilog

Verilog 설계에서 중요한 존재들 - 조합 논리 회로(Combinational logic circuits)

by 고뭉나무 2021. 5. 8.

조합 논리 회로(Combinational logic circuits)

 

출력이 단지 현재의 입력 값에 의해서만 결정된다.

 

 

이 말의 내포는 과거의 입력 값에도 결정되는 회로가 따로 있다는 것을 알 수 있다. 이 부분은 다음 포스팅에서 다루도록 하겠다.

어찌보면 단순.조합. 논리 회로이다.

 

"No clock"

 

 

종류는 크게 5가지로 나누었다. 

Adder, Comparator, Decoder, Encoder, MUX&DEMUX

그럼 순서대로 하나씩 알아보도록 하자.

 

1. 가산기 (Adder)

- 목적: 입력 인자를 더해서 출력한다.

- 주의점: 덧셈 결과 M bit 안에 표현하지 못하면 'Overflow bit'가 발생한다. 그래서 이를 방지하기 위한 설계를 고려해야 한다. 그걸 Full Adder라고 하며 Carry-in이라는 올림수 파라미터를 사용한다.

- 블록도

Full adder 블록도

- 소스 코드

module full_adder(a, b, c_in, sum, c_out);
   input a, b, c_in;
   output sum, c_out;
   
   wire [2:0] d_in;
   reg  [1:0] d_out;
   
   assign d_in = {a, b, c_in};
   assign c_out = d_out[1];
   assign sum = d_out[0];
   
   always @(d_in)
   case (d_in)
        3b'000 : d_out = 2'b00;
        3b'001 : d_out = 2'b01;
        3b'010 : d_out = 2'b01;
        3b'011 : d_out = 2'b10;
        3b'100 : d_out = 2'b01;
        3b'101 : d_out = 2'b10;
        3b'110 : d_out = 2'b10;
        default : d_out = 2'b11;
    endcase
    
endmodule
        

 

 

2. 비교기 (Comparator)

- 목적: 두 입력을 비교하여 같으면 '1'을 출력, 다르면 '0'을 출력한다.

- 특이점: M bits 비교기는 입력 A, B의 값 동일 비교 뿐만 아니라 어느 값이 더 큰 지에 따라 출력 값을 달리한다.

비교적 쉬운 회로여서 블록도와 소스코드는 생략한다.

 

 

3. Decoder

- 목적: N bits의 정보를 입력해서 2^N 개의 정보를 출력한다. 새롭게 조합해서 출력 값을 만든다.

- 특이점: Enable 핀을 사용하기도 한다.

- 예시: BCD to 7-segment Decoder

- 블록도

BCD to 7-segment Decoder 블록도

- 소스 코드

module bcd2_7segment(bcd, s7segment);
    input [3:0] bcd;
    output [7:0] s7segment;
    
    reg [7:0] s7segment;
    
    always @(bcd)
         if (bcd == 4'b0000)
                  s7segment = 8'b0011_1111;
         else if (bcd == 4'b0001)
                  s7segment = 8'b0000_0110;
         
         else if (bcd == 4'b0010)
                  s7segment = 8'b0101_1011;
         
         else if (bcd == 4'b0011)
                  s7segment = 8'b0100_1111;
         
         else if (bcd == 4'b0100)
                  s7segment = 8'b0110_0110;
         
         else if (bcd == 4'b0101)
                  s7segment = 8'b0110_1101;
         
         else if (bcd == 4'b0110)
                  s7segment = 8'b0111_1101;
         
         else if (bcd == 4'b0111)
                  s7segment = 8'b0000_0111;
         
         else if (bcd == 4'b1000)
                  s7segment = 8'b0111_1111;
         
         else if (bcd == 4'b1001)
                  s7segment = 8'b0110_0111;
         else
                  s7segment = 8'b0000_0000;

endmodule
         
         
         
         

 

 

4. Encoder

- 목적: 2^N 개의 정보를 입력하여 N bits의 정보를 출력한다. 새롭게 조합해서 출력 값을 만든다.

- 예시: Priority encoder (2개 이상의 입력이 동시에 인가될 경우, 입력의 최상위 값에 해당되는 값을 출력)

자세한 사항은 인터넷을 찾길 바란다..ㅎㅎ

 

 

5. MUX & DEMUX (Mutiplexer의 약자)

- 목적: Mux는 여러 개 입력 중 하나를 선택하여 출력으로 내보내고 Demux는 반대로 하나의 입력을 여러 개 출력으로 내보낸다.

- 특이점: Select 핀을 사용하기도 한다.

- 예시: FDM, TDM, DWDM 등..(통신 채널의 대역폭을 효율적으로 할당할 때 사용)

- DWDM 블록도

DWDM 블록도

 

- 4:1 MUX 블록도

4:1 MUX 블록도

- 소스 코드

module mux_1(i0, i1, i2, i3, sel, y);
       input i0, i1, i2, i3;
       input [1:0] sel;
       output y;
       
       reg y;
       
       always @(sel, i0, i1, i2, i3)
              case (sel)
                    0 : y = i0;
                    1 : y = i1;
                    2 : y = i2;
                    default : y = i3;
              endcase
              
endmodule

 

반응형

댓글