강의

[디지털 로직 설계] - #8. 설계한 로직은 어떻게 FPGA에서 작동하는가?

gybak 2024. 6. 9. 15:36

이번 글에서는 우리가 설계한 로직이 어떻게 FPGA에서 작동하는지에 대해 이야기하려고 합니다.

최초의 FPGA 디바이스, XC2064. (출처: https://semiwiki.com/fpga/290990-reverse-engineering-the-first-fpga-chip-xilinx-xc2064/)

 

여러분들은 이미 FPGA가 무엇인지 아주 조금은 알고 계실 겁니다. 어쩌면 학교 수업 시간에 혹은 다른 기회로 FPGA 개발보드를 써 보신 분들도 계실 것 같습니다. 간단히 설명하자면, FPGA는 "다양한 디지털 회로를 탑재할 수 있는 재사용 가능한 칩"입니다. 우리가 만든 회로를 FPGA에 "프로그램"해서 마치 실제 칩을 만든 것처럼 쓸 수 있습니다. 또 얼마든지 다른 디자인으로 바꿔 넣을 수도 있습니다.

 

이게 어떻게 가능한 걸까요? FPGA가 대체 어떻게 작동하길래, 회로를 그 안에 자유롭게 프로그램할 수 있는 걸까요?

 

일단 FPGA에 관한 아래의 설명을 읽고 각자 한 번 상상해 보시기 바랍니다. (바로 이해가 안되더라도, 여러 번 읽고 천천히 생각해 보시면 좋겠습니다.)

FPGA 칩에는 다양한 회로 부속품(로직 블럭, 클럭 소스, I/O 등)이 한가득 들어 있습니다. FPGA는 레고 블럭이 한가득 들어있는 키트와도 같습니다. 우리는 이 중에 필요한 부속품만 선택적으로 조합해 어떤 회로를 만들어냅니다. 그러면 FPGA는 그 회로로서 작동하게 됩니다.
이렇게 FPGA 내부를 설정하는 행위를 가리켜 '구성한다(configure)'고 표현합니다. FPGA에 써주는 (설정하는) 데이터를 가리켜 configuration file이라고 합니다. 이 파일 내용이 곧 우리가 만든 (FPGA에 탑재할) 디자인의 실체입니다.
FPGA configuration 작업은 칩 내부의 설정값을 바꿀 뿐, 칩에 어떤 물리적인 변형도 일으키지 않습니다. 그래서 전원이 꺼지는 등의 이유로 그 설정이 초기화되면 configuration 작업을 다시 해줘야 합니다.

 

한 줄로 정리하자면, FPGA 칩에는 로직 구성에 활용할 수 있는 회로 부속품들이 한가득 들어있다는 얘깁니다.

 

이제 좀 더 구체적으로 들어가 봅시다.

 

FPGA 칩에 준비되어 있다는 회로 부속품이 대체 무엇일까요? 혹시 기초 논리 소자(AND/OR/NOT 게이트)들을 말하는 걸까요? 물론 이들을 조합해서 회로를 구성하는 것도 가능한 일입니다. 하지만 FPGA가 그렇게 작동하도록 만들어졌다면 블럭 간 연결이 너무 복잡해져 성능을 높이기가 무척 어려웠을 겁니다. 실제로는 이보다 훨씬 단순하고 효율적인 방식으로 회로를 구성합니다.

 

여기서 look-up table (LUT) 블럭이 등장합니다. LUT는 FPGA의 로직 블럭에서 가장 기본적이고 중요한 구성요소입니다.

 

FPGA 내부에는 'logic array block (LAB)'라고 불리는 로직 블럭이 수없이 많이 깔려있습니다. (Altera FPGA 기준으로 설명하겠습니다. Xilinx에서는 Configurable logic block, 줄여서 CLB라고 부릅니다.) 이게 가장 큰 단위의 로직 블럭입니다. LAB 안에는 'Logic Element (LE)'라고 불리는 더 작은 로직 블럭이 여러 개 들어있습니다. (Xilinx에서는 Slice라는 블럭이 있습니다.) 그리고 LE 안에 LUT가 들어있습니다.

 

LE 내부에는 LUT 말고도 여러가지 구성요소들이 함께 들어있지만, 지금은 LUT 하나만 주목해주시기 바랍니다.[각주:1]

 

이제 FPGA 내 로직 블럭(LAB 또는 LE)의 작동원리를 살펴보겠습니다. 개념적으로 접근하기 위해, 이름을 '모듈 X'라고 바꿔놓고 얘기해 보죠.

 

모듈 X 내부에는 아래 그림과 같이 LUT 블럭이 있습니다. 입력에 대한 모듈 X의 반응은 LUT 블럭에 적힌 내용에 따라 결정됩니다. 그림 오른쪽과 같이 LUT 블럭을 프로그램했다고 가정합시다. 그 후에 들어온 입력값이 0000이면, 이 모듈 X는 (LUT 블럭을 들여다 보고) 0을 출력할 것입니다. 그리고 입력값이 0001로 바뀐다면 출력값은 1로 바뀔 겁니다.

 

그림 오른쪽 LUT 내용은 사실 4-input XOR을 염두에 두고 작성한 것입니다. 그림에서는 테이블 내용 일부가 생략되었지만, 우리는 이 로직이 어떻게 작동해야 하는지 truth table로 완전히 정의할 수 있죠. 그 truth table 내용을 그대로 LUT에 써 넣는다면, 모듈 X는 정말로 4-input XOR과 동일하게 작동할 겁니다. 다른 로직도 마찬가지입니다. 어떤 로직에 대한 truth table을 LUT에 그대로 써주면, 모듈 X는 해당 로직과 완전히 똑같이 작동합니다.

 

만약 2개 이상의 출력이 필요한 로직은 어떻게 구현할 수 있을까요? 이 때는 LUT를 여러 개 묶어서 구성하면 됩니다. 입력 포트가 남는 경우에는요? 쓰지 않는 입력 포트의 값이 0과 1 중 어떤 값이더라도 유효한 출력값이 나오도록 LUT 내용을 적절히 채워주면 됩니다. 쓰지 않는 입력 포트를 0으로 묶어줄 수도 있습니다.

 

여기까지 잘 따라오셨다면 이제 우리가 설계한 로직이 어떻게 FPGA에서 작동하는지 확실히 이해하셨을 겁니다.


목차 (연재 순서)

0. 강의 개요
1. 기초 논리 소자 (Basic Logic Elements)
2. Combinational Logic
    1) 논리연산 -- 3-input AND, 2-input XOR
    2) 산술연산 -- Half Adder, Full Adder
    3) 흐름제어 -- Mux, Demux
3. Truth Table 및 Look-Up Table
    1) 우리는 어떤 목적으로, 왜 truth table을 작성하는가?
    2) 설계한 로직은 어떻게 FPGA에서 작동하는가?
4. 메모리 소자 (Memory Elements)
    1) Flip-Flop
    2) Memory Block
5. Sequential Logic
    1) D-FF with synchronous reset
    2) 2진법 반올림(round-up) 로직
6. Timing Diagram

 

 

  1. FPGA 내부 구조에 대해 더 자세히 알고 싶다면, 아래 유튜브 영상과 기술문서들을 참고하시기 바랍니다.
    EEVBlog #496 "What is an FPGA?" (https://www.youtube.com/watch?v=gUsHwi4M4xE)
    Altera Cyclone Device Handbook (https://www.intel.com/programmable/technical-pdfs/655158.pdf)
    Xilinx DS060 (https://docs.amd.com/v/u/en-US/ds060)
    Xilinx DS001 (https://docs.amd.com/v/u/en-US/ds001)
    Xilinx UG331 (https://docs.amd.com/v/u/en-US/ug331) [본문으로]