FPGA는 field programmable gate array의 준하는 말로 프로그래밍이 가능한 논리 소자와 내부 소자가 포함된 반도체 소자이다.
간단하게 생각해보면 다음과 같다. FPGA는 소자의 집합이고 사용자의 필요에 따라 소자 사이의 연결을 지정할 수 있는 장치이다.
기본적인 기능을 가진 소자들 사이에 하드웨어 기술 언어(VHDL, Verilog)를 활용하여 사이사이에 길을 놓아 복합적이고 복잡한 기능을 수행하도록 구성한다.
마치 브레드보드 위의 부품과 그것을 연결하는 선으로 비유할 수 있다.
소자에 관해 조금 더 자세히 살펴보면 AND, OR, XOR, NOT 게이트부터 메모리, DSP slices, 고속 통신용 송수신기 등 더 복잡하거나 특수한 기능들을 제공하는 소자로 구성되어 있다는 것을 알 수 있다. 이러한 소자들을 연결하여 기능을 구현한다. 유연한 연결과 동작을 위해 보통 유사한 소자끼리 뭉쳐 놓는다. 이렇게 뭉친 소자들을 다른 종류의 소자 덩어리와 함께 모아 블록으로 구성한다. 이렇게 구성된 블록이 FPGA 칩 내부 구석구석에 배치된다. 이때 아무리 고르게 또는 효율적으로 배치한다고 하여도 사용자에게 필요한 기능에 따라 연결이 적절하게 되기도 하고 필요한 소자가 주변에 없다면 이를 찾아 멀리 돌아가기도 한다.
이러한 특성으로 주문 제작된 ASIC보다는 속도 등의 성능이 상대적으로 떨어질 수밖에 없다. 또한 상대적으로 전력 소비가 크고, 복잡한 디자인에 적합도가 떨어진다.
그 반면에 보다 짧은 시간에 개발이 가능하며 오류가 발생하여도 이를 현장에서도 수정할 수 있다. 또한 초기 개발비 역시 상대적으로 저렴하다는 장점이 있다.
이러한 특성들을 미루어 볼 때 ASIC과 비교해서 수량이 적은 다품종 소량 생산이나 상품의 초기 개발에 활용도가 높다. 재프로그램이 가능하여 출고 후에 개선사항 반영에도 유연하게 대처할 수 있다. 또한 동일한 설계 요소를 중복으로 나열하여 병렬 처리가 가능하여 신호 처리나 영상 처리 등과 같이 처리할 데이터가 많고 동일한 연산이 필요한 경우에도 장점을 보인다.
이러한 FPGA는 CPLD와 유사한 점이 많고 그 근원을 CPLD에 두고 있다고 할 수 있다. FPGA는 CPLD보다 내장된 소자 수가 수십, 수백 배까지 많으며 그 소자들 간의 연결이 더욱 유연하다. 또한 위에서 언급한 DPS를 위한 소자나 메모리 등의 소자가 내장되어있는 점도 차이점이다.
또한 최근에는 순수하게 FPGA만을 포함한 구성에서 임베디드 프로세서를 함께 내장하는 구성으로 발전하고 있다. 별도의 하드웨어로 구성된 프로세서를 하나의 패키지 안에 같이 구성하는 경우도 있고 FPGA 내부 로직을 이용해 구성하는 소프트코어 형태로 구성하는 경우도 있다. 소프트코어의 경우 굳이 프로세서가 필요하지 않은 경우 구성을 하지 않으면 되고 구입 시 순수 FPGA로 구성된 디바이스를 구입하였더라도 필요에 따라 적용이 가능하다. 다만 하드웨어로 구성된 코어에 비해 소프트코어는 그 성능이 떨어질 수 있다. ASIC과 FPGA로 구성된 디바이스의 차이와 같은 격이라 볼 수 있다. 제품에 따라 FPGA와 범용 임베디드 프로세서를 함께 장착하여 동일한 구성을 마련할 수 있지만 FPGA 로직과 프로세서 사이의 연결 속도나 품질 차이가 날 수 있다. 간단한 예를 들자면 프로세서 내장 제품의 경우 병렬 포트로 데이터 전달이 가능하지만, 외부에 프로세서를 장착하는 경우 동일한 병렬 포트를 구성하려면 병렬 포트 수와 같은 수의 신호 라인을 PCB 상에 배치하여야 한다. 이 또한 임베디드 프로세서에서 병렬로 데이터를 전달할 수 있는 인터페이스를 제공하여야 가능하다.
실제 설계에 들어서면 사용자는 하드웨어 기술 언어(HDL)와 소자의 연결 및 배치에 관한 도면을 접할 수 있다. 하드웨어 기술 언어는 Verilog와 VHDL이 있다. 보통 도면보다는 하드웨어 기술 언어로 설계를 진행하며 최근 경향에 따르면 C언어로 작성된 코드를 합성할 수 있는 HLS(High-Level Synthesis)나 매트랩의 Simulink로 설계한 블록을 합성할 수 있는 System Generator 등을 활용하기도 한다. 이러한 방식의 장점은 생산성이라 할 수 있다. FPGA에 요구하는 기능들이 복잡해지고, 고도화됨에 따라 보다 많은 소자와 복잡한 연결이 필요하다. 따라서 사용자가 소자의 사용과 연결을 세세히 들여다보기에는 한계가 있다. 이러한 부분을 효율적이고 간편하게 관리 할 수 있도록 사용자가 이해하기 쉬운 형태로 기능을 설계하게 하면 툴이 사용 소자와 연결을 지원하는 형태로 발전 중이다. 물론 툴은 사용자가 설계한 내용을 순수하게 코드 그대로 받아들여 FPGA 내부 로직으로 변환하기에 사용자의 의도를 벗어나기도 한다. 이런 부분을 최소화하기 위해 툴의 많은 업데이트가 진행되었고 또 진행되어 나갈 것이다. 그렇게 되면 하드웨어 기술 언어에 정통하지 못하는 사용자라도 효과적으로 FPGA를 활용할 수 있고 하드웨어 기술 언어에 정통한 사용자도 보다 빨리 설계를 진행하게 될 것으로 기대된다.
FPGA의 경우 설계를 한 후에도 실제 디바이스 상에 적용하여 사용자의 의도대로 동작하는지 확인하는 절차가 꼭 필요하다. 그 이유는 위에서 잠깐 언급했던 것과 같이 내부 소자 간 연결이 멀어지거나 또 멀지 않더라도 사용자가 설계한 디자인에서 특정 부분의 실행 성능이 지나치게 짧게 지정된 경우에 문제가 발생하기 때문이다. 이는 클록과 관계가 있다. 클록은 소자와 연결과 함께 FPGA에서 중요한 개념이다. 간단한 예로 클록의 상승 엣지와 상승 에지 사이에서 데이터 전달이 1번 일어나야 하는 구간에서 데이터 전달 경로가 길어져 걸리는 시간이 길어진다면 사용자의 의도와 다르게 부정확한 데이터 또는 이전 클록의 데이터가 전달될 수 있다. 통상 클록이 높으면 처리 속도가 높아지지만, 예시와 같은 일이 일어날 수 있기에 무한정 높일 수 없다.
해당 글에서 다 예로 들 수 없지만 FPGA는 효율적인 설계와 실제 적용 후 발생하는 오류와의 싸움이다. 코드로만 표현될 수 없는 실제 동작할 때의 동작을 설계 툴은 여러 관점으로 분석하고 문제가 생기지 않도록 합성을 진행한다. 원하는 동작을 하는 설계를 할 수 없다면 설계 툴의 분석 기능을 적극 활용하고 수정하는 것이 오류 해결의 지름길이다.
FPGA
댓글