2010년 5월 5일 수요일

Altera Cyclone III, NIOS2 간단 사용기

현재 일하고 있는 회사에서는 사용하고 개발하는 대부분의 FPGA Board는 Xilinx의 FPGA를 사용하고 있고, 개인적으로도 Xilinx FPGA를 많이 사용해 봤습니다. 하지만 최근에 어떤 IP를 개발하고 테스트하는데 Altera Cyclone III FPGA를 사용해 봤습니다. Xilinx FPGA를 사용한 Board를 직접 개발해서 할 수도 있었지만, 범용으로 사용할 것도 아니고 IP 테스트용이므로 off-the-shelf board를 사서 쓰는 편이 좋다는 판단이었습니다. Verilog RTL을 구현하는데는 Xilinx나 Altera나 별 차이가 없겠지만, IP 테스트를 위해서 Board가 몇가지 기능을 지원해야 하는데, Altera Cyclone III FPGA Develpment Kit과 3rd party daughter board를 연결하면 그런 기능이 모두 해결되어서 선정하게 되었습니다.

Cyclone III series의 FPGA 중에서 가장 큰 FPGA가 달려 있는 board입니다.

이 보드는 USB 지원에 약간 문제가 있었습니다. 원래의 계획은 USB를 이용하여 PC에서 test data를 전달하고 그것을 board에서 동작시키는 것이 목적이었습니다만, USB 지원이 쉽게 되지 않았습니다. Board 설명에서는 FPGA Configuration을 위한 USB Blaster도 지원하고, 일반 USB를 지원하여  PC와 연결할 수 있다고 나오는데, 정작 Board에는 USB Type-B connector가 하나 뿐입니다. Board 내부의 Altera Max CPLD를 이용하여 USB Blaster 기능과 사용자의 USB 기능을 switching할 수 있도록 되어 있는 것 같은데, 정작 USB를 직접 사용하는 design example을 제공해 주지도 않습니다. 어떻게든 가능하게 만들 수는 있겠지만, 시간이 없어서 USB를 사용하겠다는 생각은 포기하고 다른 방법을 사용했습니다.

Altera FPGA는 수년 전에 Startix II를 한번 사용해 봤을 뿐인데, 그 때도 그다지 자세히 살펴보지는 않았습니다. Cyclone III를 사용하면서 좀 자세히 살펴 봤는데, Xilinx의 Spartan-3에 비해 아래와 같은 장점이 있는 것 같습니다.

(1) Hardwired multiplier 갯수
Xilinx의 Spartan-3의 경우 18x18 multiplier와 accumulator 등이 내장된 DSP block이라는 hardwired logic이 있는데 Cyclone III는 18x18 multiplier만 hardwired logic으로 들어 있습니다. 대신 비슷한 가격대의 device를 비교하면 Cyclone III가 월등히 많은 multiplier가 들어 있습니다. 이번에 테스트한 IP도 FIR Filtering이 필요해서 multiplier를 사용했는데 Cyclone III가 이런 부분의 사용에서는 유리할 것으로 보입니다.

(2) PLL
FPGA에는 clock에 관련된 hardwired module을 제공해서 clock synthesize나, delay 조정등을 할 수 있도록 되어 있습니다. Altera와 Xilinx에서 제공하는 clock module의 기능이 너무 복잡해서 모든  feature를 비교할 경우는 모르겠지만, 단순히 입력 clock의 frequency를 multiply하고 divide하는 기능만 보면 Altera의 cyclone III가 Xilinx의 spartan-3보다 뛰어납니다. Cyclone III의 경우 512배의 multiply와 divide를 지원하는데 반해 Spartan-3는 32배씩만 지원합니다. 물론 Cyclone III의 경우도 PLL의 동작 조건 등을 만족시키려면 512배를 완전 자유롭게 사용하지는 못합니다만, 좀 더 자유로운 편임은 분명합니다. 이번 테스트에서도 clock divide 값으로 143을 써야하는 경우가 있었는데, PLL 한 개만 사용해서 깔끔하게 끝나더군요.

  • SOPC를 이용한 NIOS II system
테스트를 위해서 사용할 외부 chip 하나가 SPI를 이용하여 레지스터 셋팅을 필요로 해서 Altera NIOS II를 이용해 봤습니다. SPI를 통해서 레지스터 세팅하는 부분도 hardware RTL로 coding하면 되지만, 셋팅값을 이리 저리 바꾸는데는 아무래도 software를 이용하는 편이 좋을 것 같아서 한 번 사용해 봤습니다.
Xilinx에서는 "따라해 보세요" 스타일의 문서를 제공해서 그것만 읽으면 쉽게 따라할 수 있는데, Altera는 그런 문서가 없어서 Altera에서 제공하는 video를 보고 따라해 봤습니다.

(1) SOPC Builder
Xilinx에서 제공하는 Platform Studio와 비슷한 기능이 있는 tool입니다. NIOS II CPU Subsystem을 GUI 환경에서 만들 수 있도록 합니다. 다른 점이 있다면 Platform Studio는 FPGA Top을 만들어 주는 대신 SOPC는 module을 만들어 줍니다. 즉, FPGA Top은 Schematic Editor를 사용하거나 아니면 HDL을 이용하여 사용자가 직접 묶도록 되어 있습니다. 불편한 대신 장점이 있는데 FPGA 하나에 서로 다른 CPU Subsystem을 여러개 넣는 것도 가능한 것으로 보입니다. 즉 NIOS II CPU를 여러개 독립적으로 넣어서 구동하는 것도 쉽게 가능한 것으로 보입니다.

약간 불편한 점이라고 하면 MegaWizard와 같이 project를 만들지 않고 그냥 IP 형태로 만들어 두는 것은 지원하지 않는 것 같습니다. Quartus II에서 project를 만들어야 SOPC를 띄울 수 있도록 되어 있습니다. 사용한 버젼이 9.1이었는데 추후 버젼에서는 개선될 지 모르겠습니다.
 그리고 사용자 IP를 BUS(Altera는 Avalon이라는 BUS 사용)에 붙이려면 어떻게 해야 하는지, Wizard나 아니면 쉬운 예제같은 것을 찾기 힘들었습니다. 모든 문서 자료를 꼼꼼하게 살피면 당연히 가능하겠지만, 쉽게 찾을 수는 없었습니다. 대신 IP 테스트를 위해서 필요했던 enable/reset 관련 몇개의 signal을 BUS에 붙이는 대신 그냥 GPIO에 연결해서 가볍게 해결했습니다. 이런 부분은 Top을 사용자가 만들수 있으므로, Xilinx에 비해서 훨씬 쉽게 느껴졌습니다.

(2) NIOS II EDS(Embedded Design Suite)
Xilinx SDK와 동일한 기능을 제공하는 tool로, NIOS II CPU용 software를 만들 수 있도록 해 줍니다. Xilinx와 마찬가지로 Eclipse 기반으로 동작하고, JTAG(USB Blaster)을 이용하여 debugging합니다. Eclipse 기반의 IDE를 사용해 본 사람이라면 크게 문제 없이 적응할 수 있습니다. EDS만 관련된 것은 아니지만, 콘솔로 UART를 사용하지 않고, JTAG(USB Blaster)를 사용하도록 되어 있다는 점이 독특합니다. Software에서 printf 등으로 출력한 결과를 eclipse 환경에서 창이 하나 열리면서 보여주는 형태로 되어 있습니다. 따라서 보드에 시리얼 연결 등의 기능이 없어도 디버깅에 무리가 없습니다.
사용하는 중에 약간의 문제가 있었는데, EDS를 이용하여 build한 software binary와 FPGA configuration bitstream을 어떻게 합치는지 찾을 수 없었습니다. Xilinx SDK에서는 기본적으로 software binary와 bitstream을 합쳐서 FPGA download하는 방법으로 진행되므로 합쳐진 bitstream을 쉽게 찾을 수 있는데, NIOS II EDS는 hardware bitstream을 별도로 download한 후에 software binary는 추후에 download하는 방식이라서 합치려면 별도의 작업을 통해서 해야 할 것 같습니다. 그런데 몇가지 문서를 살펴 봐도 software binary를 bitstream(sof 파일)과 합치는 방법에 대해서는 자세히 나와 있지 않는 것 같습니다. 좀더 깊게 조사하면 방법을 찾을 수 있었겠지만, 결국에는 합치지 못했습니다. 어짜피 IP 테스트용이니까 별로 상관이 없었습니다.

  •  기타
사용한 board에서 LVDS와 같은 differential I/O로 연결해야 하는 부분이 있었는데, 이 부분에서 문제가 있었습니다. Differential I/O 핀이 Single Endede I/O(LVTTL 같은 애들) 핀과 가까이 있으면 Signal Integrity에 문제가 있다고 하면서 Quartus II에서 routing을 하지 못하더군요. 당연히 핀 사이에 노이즈가 문제가 될 수 있으므로 그것을 막고자 한 것 같은데, digital logic만 주로 설계한 사람으로서 처음 보는 에러였습니다. Xilinx FPGA에서도 비슷한 문제가 생길 수도 있을 것 같은데, LVDS를 많이 사용해 보지 않아서 확실하지는 않습니다. 아무튼 Altera FPGA에서 LVDS와 같은 differential I/O를 사용하는 경우에는 아무 pin이나 마구 쓰면 안되므로, Board 설계할 때 신경을 좀 써야 할 것 같습니다.

  • 마치며
Altera FPGA및 tool이 불편하다는 식의 이야기를 주로 한 것 같은데, Xilinx FPGA를 주로 사용했던 사람으로 느끼는 어쩔 수 없는 것일 뿐이고, Altera FPGA가 나쁘다는 이야기는 아닙니다. Altera에서 제공하는 모든 문서 자료나 video 등을 살펴보면 불편하거나 잘 안되는 부분도 해결할 수 있었을 겁니다. 다만, Altera website에서 빠른 시간 안에 딱 필요한 자료를 찾는 것이 쉽지는 않았습니다. 역시 Xilinx FPGA를 주로 사용했던 사용자라서 느끼는 점인지도 모르겠습니다.
참고로 개발한 IP는 Cyclone III FPGA Development Kit에서 잘 동작했습니다.