2009년 12월 9일 수요일

FPGA 이야기 - 2

FPGA 내부 구조및 종류에 대해서 살펴 봅니다.


  • FPGA의 내부 구조
- LUT(Look Up Table)
FPGA는 Gate Array와 달리 NAND/NOR Gate는 사용하지 않고, 대신 4~6 input LUT를 사용하여 combinational logic을 구성합니다. LUT이란 그냥 memory라고 생각하면 됩니다. Address에 input을 가하면 memory 내부의 내용이 output으로 나오면서 그것이 logic이 됩니다. memory 내부의 내용을 바꾸어 다양한 combinational logic을 구현할 수 있습니다. 당연히 sequential logic을 설계할 수 있어야 하므로 LUT의 끝에는 flipflop이 달려 있어서 이용할 수 있습니다. 기본적으로 LUT를 여러 개 넣은 것을 한 단위로 하여 Vendor별로 Slice니 ALM이니 하는 것으로 부르고 그것의 배열이 FPGA를 이루고 있습니다.


- Programmable Interconnect
LUT들 사이의 연결을 해야 완전한 logic이 됩니다. 이 연결도 당연히 programmable합니다. 일반적으로 FPGA 설계가 chip으로 구현하는 것보다 느린 이유는 이 Interconnect 부분에서 많은 delay가 있기 때문입니다. 될 수 있으면 routing을 잘 하여 interconnect의 delay를 줄여야 빨리 동작하는 설계가 됩니다.


- Programmable I/O
FPGA와 다른 chip들이 interface해야 하므로, FPGA I/O pin도 여러 종류의 interface 표준을 지원합니다. 예를 들어 LVTTL/LVCMOS과 같은 간단한 interface뿐 아니라,  DDR/DDR2 SDRAM에서 사용하는 SSTL과 같은 것도 지원하고, LVDS와 같은 differential interface도 가능합니다. FPGA에 있는 pin들이 지원하는 interface에 따라 나누어져 있는 형태가 아니고, 모든 pin을 interface에 따라 달리 사용할 수 있도록 되어 있습니다. 물론 VCC/GND는 제외하고, IO의 전압에 따라서 약간의 제한이 존재하기는 합니다.


- Memory
LUT/flipflop 만으로도 모든 digital logic(combinational/sequential)을 구현할 수 있지만, FPGA에는 SRAM 형태의 block memory도 들어 있습니다. LUT끝에 있는 flipflop으로도 data를 저장할 수 있지만, 그렇게 사용하게 되면 LUT가 낭비되고, routing이 복잡해 지므로 효율적이지 않기 때문입니다. SRAM은 보통 buffering을 위해서 FIFO 형태로 사용하게 되는 경우가 많습니다.

- Adder/Multiplier
연산을 위한 Adder/Multiplier 등도 별도로 들어 있습니다. 역시 LUT로도 구현이 가능하지만 전용 block을 가지고 있는 편이 timing/die area/power 등의 면에서 유리하기 때문입니다. Adder/Multiplier를 이용할 경우, 기존에 DSP(Digital Signal Processor)가 많이 이용되는 영역 - 당연히 Digital Signal Processing 분야 - 에서도 FPGA를 이용한 구현이 더 유리하다는 많은 글들이 올라오고 있습니다. 당연히 FPGA 회사에서 홍보성으로 퍼뜨리는 글일테지만 완전히 거짓은 아닐 것으로 판단됩니다. 다만 기존의 DSP Software를 하는 engineer는 FPGA를 이용한 설계에 적응을 쉽게 할 수 없겠지만 말이죠.


- Clock 생성 관련 PLL 등
PLL 등의 block이 포함되어 있어서 FPGA 내부에 다양한 형태의 clock을 공급해 주게 됩니다. 해당 PLL이 어떻게 동작해야 하는지도 당연히 programmable 합니다.


- High Speed Serial I/O
Gbps(Giga-bit/sec)급을 지원하는 Serial I/O도 포함되어 있는 경우가 있습니다. 당장 PC에서 사용하는 PCI-Express, SATA와 같은 것을 FPGA에서 지원하려면 High Speed Serial I/O가 있어야 합니다. 또한 많은 분야(주로 Video/Broadcast 부분)에서 Gbps급 I/O를 사용하고 있어서 FPGA에서도 지원하고 있습니다.


- CPU
내부의 ARM이나 PowerPC 등의 CPU가 포함된 FPGA도 있습니다. 사실 System에서 FPGA 사용을 검토하는 가장 큰 이유는 매우 많은 연산을 처리해야 하는데 그것을 일반적인 CPU 혹은 DSP가 감당할 수 없을 때입니다. FPGA로 많지만 간단한 연산을 처리하도록 하고, 나머지 복잡하지만 자주 처리할 필요가 없는 부분은 여전히 CPU로 하는 것이 일반적입니다. 아무래도 CPU에 Software를 얹는 방법이 hardware 설계 보다 쉽기 때문에, 복잡하지만 peformance가 많이 필요하지 않은 일은 software로 구현하는 편이 유리합니다. 결국, FPGA로 System을 구성하더라도 별도로 CPU가 필요한 경우가 많은데, 그 때 사용하라고 ARM/PowerPC 등의 CPU를 FPGA에 넣는 경우가 있습니다. 하지만 요즘은 FPGA Vender에서 LUT로 비교적 빠른 CPU를 구현해서 넣는 방법을 제공하여, ARM/PowerPC가 들어 있는 FPGA의 용도는 좀 애매해진 구석이 없지 않습니다.


- 기타
그 외로 Ethernet MAC, PCI Express controller, DRAM Controller등이 내장된 FPGA도 있습니다. 심지어 몇가지 Analog Circuit이 들어 있는 FPGA도 있는데, 일반적으로 Analog Circuit은 application에 따라서 요구하는 specification이 매우 다양하기 때문에, Analog Curcuit이 들어 있는 FPGA는 대중적이지는 않습니다.


  • FPGA 종류
LUT가 memory라고 했는데, 일반적으로 저렴하면서 빠른 memory는 SRAM입니다. 따라서 매우 빠른 동작 속도를 가지는 FPGA의 경우 SRAM을 기반으로 하는 경우가 많습니다. 하지만 SRAM의 경우 전원이 없으면 data를 잃어버리는 단점이 있습니다. SRAM 기반의 FPGA의 경우에는 전원이 인가되면, SRAM 내용을 채워야 동작이 되는데, 그것을 위한 방법은 여러가지가 있습니다. 가장 간단한 방법은 각 FPGA Vendor에서 제공하는 program memory chip을 사용하는 것입니다. program memory chip은 non-volatile 형태로 전원이 없어도 내용이 유지됩니다. FPGA에 전원이 인가되면 program memory chip에서 data를 읽어서 자신을 programming(보통은 configuration이라 부름)하고난 후에 동작을 시작합니다. FPGA Vendor가 제공하는 program memory chip도 아주 많이 팔리지 않으므로 그다지 저렴하지 않습니다. 저렴하게 팔리는 SPI Flash와 같은 chip을 이용해서 configuration할 수 있는 FPGA도 있습니다. 또 다른 방법으로 외부의 CPU나 다른 logic이 FPGA에 program 내용을 download해 주는 방법이 있습니다. 마지막으로 JTAG을 이용한 configuration 방법이 있습니다. 보통 PC와 cable로 JTAG 연결을 하여 configuration하는 방법인데, 개발 중에 많이 사용합니다. 각 FPGA Vendor별로 전용 JTAG cable을 제공해 주고, 그것은 Vendor의 design software를 이용하여 동작시킵니다. 참고로 program memory chip도 보통의 경우 JTAG을 이용하여 program하게 됩니다.

Flash Memory를 기반으로 동작하는 FPGA도 있습니다. Flash 기반이므로 당연히 SRAM 기반 FPGA보다 비쌉니다. 두가지 형태가 있는데, 하나는 FPGA 내부는 SRAM 기반으로 하되 program memory chip 기능을 가지는 flash가 내장된 형태가 있고, 나머지 하나는 그냥 Flash 기반으로 FPGA가 동작하는 경우가 있습니다. Flash 기반이므로 당연히 전원이 없을 때도 data를 잃어버리지 않으므로 별도의 외부 장치가 없어도 동작하는데는 지장이 없습니다. FPGA 내부의 flash는 보통 JTAG을 이용하여 programming합니다.


Actel에서만 나오는것 같은데 anti-fuse라는 방식의 FPGA가 있습니다. FPGA 내부가 fuse의 array와 같이 되어 있고, 강한 전류를 흘려, 특정 fuse를 끊어 내는 방식으로 FPGA를 programming한다고 합니다. 당연히 별도의 program memory chip을 필요로 하지 않습니다만, FPGA를 한번 programming하면 다시 programming하는 것은 불가능하다는 단점이 있습니다. 대신 이 anti-fuse 방식의 FPGA가 매우 빠른 동작을 한다고 알려져 있었는데, 사용해 본 경험이 없어서 현 시점에서도 빠르다고 확신할 수는 없습니다.


  • CPLD와의 차이
CPLD(Complex Programmable Logic Device)라고 하여 FPGA와 비슷한 애가 있습니다. CPLD도 일반적인 digital logic을 구현하는데 사용됩니다. 각 FPGA Vendor들도 CPLD를 생산하는데, Xilinx는 CoolRunner, Altera는 Max라고 부르는 CPLD product line를 가지고 있습니다. FPGA와는 다른 내부 구조를 가지고 있다고 하는데 자세한 것은 알지 못하고, 사용하는 사람의 입장에서 보면 다음과 같은 차이가 있습니다.
우선 CPLD로 구현할 수 있는 logic의 규모가 FPGA에 비해서 상대적으로 매우 작습니다. 또한 FPGA에는 있는 SRAM, Adder/Multipler, 복잡한 I/O, 여러가지 hardwired logic이 CPLD에서는 제공되지 않습니다. 따라서 CPLD는 glue logic이나 비교적 간단한 sequential logic 같은 것을 만들 때 사용하면 적당합니다.
CPLD는 FPGA 보다 가격이 매우 싼 편입니다. 그리고 보통은 flash 기반이라서 FPGA 처럼 외부에 program memory chip과 같은 device가 필요가 없고, 일반적으로 필요한 supply voltage의 갯수도 적습니다. 따라서 시스템 BOM cost가 민감한 부분에서도 사용될 수 있습니다. 그리고 CPLD가 FPGA보다는 power 소모가 적으므로 power에 민감한 시스템에서도 사용을 고려해 볼 수 있습니다.

1 개의 댓글:

Juane Weg :
블로그 관리자가 댓글을 삭제했습니다.

댓글 쓰기