FPGA
FPGA 또는 Field Programmable Gate Array는 하드웨어 기술 언어(HDL)를 이용해 직접 하드웨어를 설계할 수 있는 논리 회로이다.
FPGA 이전에는 PLA/PLD 및 CPLD라고, 직접 하드웨어의 배선을 ROM에 저장해놓고 기계를 제어하는 논리 회로가 있었다. 그러나 배선을 바꿀 수 없었기 때문에 범용적인 기계 제어에 한계가 있었다.
이때 1983년 창립된 알테라라는 회사에서 처음으로 플래시 메모리에 하드웨어의 배선 구성을 저장하고 HDL을 사용하여 하드웨어의 배선을 바꿀 수 있는 세계 최초의 FPGA를 내놓았다.
그러자 그걸 본 자일로그 사[1]의 일부 직원들이 퇴사하고 자일링스라는 회사를 세워 역시 FPGA를 만들기 시작했다.
이 두 회사는 이후 래티스 세미컨덕터 같은 후발주자를 물리치고 고성능 FPGA 시장의 양대 산맥을 이룬다.
그리고 알테라는 2015년 인텔에게 인수되고, 자일링스는 2020년 AMD에게 인수되었기에 x86 호환 CPU 제조사의 양대 산맥이 FPGA 시장에서도 경쟁하는 구도가 형성되었다.
일단 논리 소자를 HDL이라는 프로그래밍 언어로 기술한 다음 소프트웨어의 컴파일 과정에 대응하는 합성(Synthesis) 과정을 거치면 FPGA의 내부 배선 정보가 바뀐다.
이를 이용해 병렬적으로 계산하는 프로그램을 CPU를 통해 제어할 필요없이 입력값만 넣어주면 바로 결과를 빠르게 내어줄 수 있다.
그래서 팹리스 설계업체는 일단 FPGA로 자기에게 필요한 집적 회로를 구현한 뒤 테스트해보고 원하는 결과가 나오면 바로 ASIC으로 같은 집적회로를 대량으로 양산한다.
아니면 아예 조그만 CPU를 FPGA로 구현해낼 수도 있다. 이것을 소프트 프로세서라고 부른다.
그래서 대규모 수치 연산에 FPGA가 동원되며, 비트코인 같은 암호화폐도 FPGA를 쓰면 GPGPU보다 더 빠르게 채굴할 수 있다.
여기 용어는 Xilinx FPGA 기반 설명이다. Altera 같은 다른 FPGA 메이커의 FPGA에는 다른 용어를 사용한다.
- Look-up Table: 실제로 게이트를 설치하는 것이 아니라 주어진 입력에 대한 결과표인 데이터 테이블을 미리 저장해 놓고 입력이 들어왔을 때 어떤 출력을 낼지 바로 가리키게 하는 방법이 있다. 이러면 Synthesis 때 데이터 테이블만 바꿔치기해서 실제 논리 게이트를 흉내낼 수 있다. 물론 이건 조합 논리 회로에 주로 해당되고, 순차논리회로는 얄짤없이 플립플롭을 쓰게 된다.
- Block RAM: FPGA 판 캐시 메모리. FPGA와 외장 RAM(SRAM일 수도 있고, DRAM일 수도 있다) 사이의 버퍼 메모리 역할을 해준다.
- DSP Slice: DSP 칩에서 주로 사용하는 누산 연산(두 데이터를 성분 별로 곱한 다음 결과에 더하는 선형 결합 연산)을 전문적으로 하는 논리 회로.
- 그 외에 시프트 레지스터 같은 것을 추가하기도 한다.
보통 FPGA로 가상의 IC를 구현할 때 다음과 같은 과정을 거친다. 아래는 Xilinx Vivado 기준 작업이다.
- 설계 항목 단계(Design Entry)에서 블록 다이어그램, HDL, 그리고 C언어 같은 프로그래밍 언어를 동원해 기능을 정의한다.
- 입출력 요구사항(입출력 핀 매핑)과 타이밍 요구사항, 즉 Constraint에 맞춰 FPGA 핀과 주변 소자를 세팅한다.
- 합성(Synthesis): HDL을 실제 회로 구현에 필요한 Netlist로 변환한다.
- 배치, 배선: 넷리스트에 정의된 자원을 논리 소자에 할당하고 배선(Route)하여 구성한다.
- 구성한 비트스트림 파일을 FPGA에 최종적으로 보내면 SRAM에 데이터 테이블이 저장된다. 플래시 메모리 같은 별도의 소자가 없으면 보통 SRAM의 데이터가 증발하므로 켤 때마다 항상 비트스트림 파일을 보내게 될 것이다. 그래도 요즘은 FPGA 개발 보드에 플래시 메모리를 달아 비트스트림 파일을 저장하고 외부와 연결하지 않을 경우 자체적으로 로딩할 수 있게 하는 편이다.
- ↑ 인텔 8080 CPU와 호환되는 자일로그 Z80을 만든 회사로 유명하다.