2009년 12월 25일 금요일

Xilinx EDK 간단 사용기

회사에서 진행하는 프로젝트로 Xilinx Embedded Design Kit(Version 11)를 사용해서 MicroBlaze를 사용한 설계를 해 보았습니다.


Xilinx EDK는 Altera Quartus II에 있는 SOPC와 같은 tool로 Xilinx가 제공하는 MicroBlaze라는 32bit CPU와 여러가지 peripheral을 이용하여 CPU subsystem을 꾸밀 수 있게 해 주는 tool입니다. MicroBlaze뿐 아니라 Xilinx의 몇몇 FPGA에 들어 있는 PowerPC CPU를 이용하여 System을 꾸미는데도 사용하는 것 같습니다. EDK는 기본적으로 Platform Studio라고 하는 통합 환경이 있어서 그것을 통해서 hardware 구성을 하고, Software Development Kit이라는 tool을 이용하여 software를 build하는 구성을 가지고 있습니다.


사용하는 법은 "따라해 보세요" 스타일의 문서인 EDK Concepts, Tools, and Techniques만 읽으면 쉽게 익힐 수 있습니다. 좀더 살펴보기 위해서는 Embedded System Tools Reference ManualPlatform Specification Format이라는 문서를 읽으면 됩니다.


  • Platform Studio
Platform Studio는 Xilinx EDK의 통합환경입니다. 기본적으로 stand-alone 상태에서 하드웨어 구성, 합성, P&R을 모두 처리할 수 있도록 되어 있습니다만, ISE project navigator에서 디자인의 일부로 Xilinx EDK를 호출하여 사용할 수도 있도록 되어 있습니다.
Platform Studio는 기본적으로 Base System Build Wizard라는 것을 제공하여, Wizard 형식으로 묻는 내용만 넣으면 base system을 만들 수 있도록 되어 있습니다. Xilinx가 제공하는 reference board를 사용하는 경우에는 board 종류만 고르면 base system이 딱 하니 나옵니다. 사용자의 custom board를 사용하는 경우에도, Clock 주파수, CPU(MicroBlaze)를 1개 혹은 2개 넣을 건지 선택하고, MicroBlaze에서 사용할 RAM 크기 등을 지정하고, Xilinx에서 무료 혹은 유료로 제공하는 peripheral IP를 선택하면 base system을 만들 수 있습니다.


Base system을 만들고 나서도, Xilinx에서 제공하는 IP 및 사용자가 만든 IP를 추가하거나 변경 등을 할 수 있도록 되어 있습니다. Xilinx가 제공하는 IP는 꽤 다양한데 아래 링크에서 확인할 수 있습니다.
Xilinx EDK가 제공하는 IP list


Xilinx가 제공하는 IP는 대부분 configuration이 가능한 구조를 가집니다. 예를 들어 UART의 경우 baud rate를 바꾼다거나 하는 일을 할 수 있고, GPIO의 경우에는 외부에 연결된 I/O pin의 갯수 등을 바꿀 수 있습니다. VHDL의 generic을 이용하여 module(VHDL이니깐 entity라고 해야 겠죠)의 형태가 바뀔 수 있도록 되어 있습니다. 참고로 Xilinx가 제공하는 모든 IP는 verilog이 아니라 VHDL로 제공됩니다.


Base system으로도 완전한 CPU system이지만, 일반적으로는 사용자가 logic을 추가해야 나름 비싼 FPGA를 사용하는 의미가 있습니다. 사용자의 logic을 추가하지 않으면, 고가의 FPGA를 이용하여 단순한 32 bit MCU를 만든 것에 지나지 않기 때문입니다. 사용자의 logic이 CPU(MicroBlaze)를 이용하여 control할 수 있는 구조로 내장 되어야 가치 있는 설계가 될텐데, 이를 위해선 CPU및 각종 peripheral이 붙어 있는 BUS를 이해해야 합니다. Xilinx EDK는 기본적인 BUS로 IBM CoreConnect PLB(Processor Local Bus)를 사용하고 있는데 사용자가 PLB를 모두 이해해서 사용자 logic을 연결하기 위해서 시간이 많이 필요하게 됩니다. Xilinx EDK는 Create and Import Peripheral Wizard라는 것을 제공하여 그 시간을 단축시켜 줍니다. 이 Wizard는 PLB BUS master/BUS slave에 관련된 template 형태의 VHDL code를 생성해 주는데, 사용자는 이 code를 기본으로 하여 원하는 기능의 logic을 쉽게 붙일 수 있습니다. 참고로 사용자 logic은 verilog로 작성해도 무방합니다.


  • Software Development Kit
Eclipse 기반으로 작성된 Software IDE입니다. 기본적으로 Platform Studio에서 Export한 hardware description XML 파일을 이용하여 Platform이라 부르는 기본적인 library를 build하고 그 library를 이용하여 application을 작성할 수 있도록 되어 있습니다. Build한 application을 FPGA에 넣어야 하는데, 이를 위하서 Platform Studio에서 합성 결과인 bitfile에 application binary를 넣어서 새로운 bitfile을 만들어, JTAG Cable을 통해서 download하고 running/debugging할 수 있는 환경이 제공됩니다. JTAG Cable을 통해서 board와 연결되어 있으면 별도의 debugger 같은 것은 필요 없습니다.


나중에 기회가 되면 자세한 사용 방법을 설명하기로 하고, 사용하면서 몇가지 문제점들이 있었는데 그것만 밝혀 두도록 합니다.
  • 설치 문제
개발 PC에는 cygwin와 Eclipse CDT가 설치되어 있었는데, 그게 문제가 되었습니다. Xilinx SDK가 함께 설치된 make utility를 호출하지 않고, 기존에 PC에 설치된 cygwin의 make utility를 호출하여 software build에서 문제가 발생한 경우가 있었습니다. 아마도 PATH 환경 변수에 관련된 문제였을 것으로 추정하는데, Cygwin을 제거하니 문제없이 동작하였습니다. 그리고 Platform Studio에서 SDK를 띄울 수 있도록 되어 있는데, 기존에 설치된 Eclipse가 문제가 되었는지 잘 되지 않았습니다. SDK를 별도로 띄운 다음에 일일이 eclipse workspace의 경로를 잡아야 문제가 되지 않았습니다.


  • 사용상의 문제
Platform Studio의 GUI에서 INTC(Interrupt Controller)를 설계에 넣고, INTC에 여러 interrupt를 연결을 하려고 하면 이게 또 제대로 동작하지 않습니다. 자세한 에러 메시지라도 나오면 무언가 그것을 해결하려고 했을 텐데, 별 메시지도 없어서 어쩔 수 없이 GUI를 이용하지 않고 system을 기술하는 MHS 파일을 직접 편집해서 해결 했습니다.
또한, 어찌된 일인지 합성해 보면 INTC에 연결된 모든 signal이 unused라고 제거되는 경우가 있었는데, 이것도 project를 새로 만들어서 해결했는데 무슨 문제인지 파악할 수 없었습니다.


또, SDK에 NOR Flash를 programming할 수 있는 menu가 있는데, 이것이 제대로 동작을 하지 않았습니다.  Xilinx SDK는 기본적으로 AMD/Intel 스타일의 command를 사용하는 NOR Flash만을 지원하고, programming을 위한 file 형식은 elf와 srec(motorola-S)만 지원합니다. 사용한 Board에는 Numonyx(Intel과 ST의 합작 회사)의 8/16bit NOR Flash가 있었는데, srec 파일을 만들어서 programming 해 보았더니 무슨 문제인지 data가 write되기는 했는데 올바른 data가 write되지 않았습니다. 아마도 hardware 구성이나 뭔가가 잘못된 것 같은데, 확인할 방법은 없습니다. 하는 수 없이 nor flash write application을 만들어서 그것을 FPGA download한 후에 그 application을 수행하여 직접 write하는 방법을 써서 해결했습니다.


  • 문제라고 할 수는 없지만...
가장 거슬리는 점은 Xilinx IP와 연결된 거의 모든 signal이 vector인 경우 0부터 시작되는 vector라는 점입니다. 예를 들어 대부분의 vector signal은 다음과 같은 형태로 되어 있습니다.
signal Address : std_logic_vector(0 to C_ADDR_WIDTH-1);
위의 문법이 잘못되지는 않았지만, 문제로 삼을 만한 것은 Address(C_ADDR_WIDTH-1)이 LSB, Address(0)가 MSB가 된다는 점입니다. 우리나라 엔지니어만 그런지 모르지만, 보통의 엔지니어라면 address나 data 모두 0번 bit가 LSB라고 상식적으로 이해하고, std_logic_vector(C_ADDR_WIDTH-1 downto 0)의 형태로 쓰는데, Xilinx 엔지니어는 좀 사고 체계가 다른 것 같습니다. Create and Import Peripheral Wizard를 이용하여 생성한 PLB Bus Interface를 user logic에 붙일 때, 신경을 안쓰면 반대로 붙이는 경우가 생기게 됩니다. 또한 Xilinx가 제공하는 static memory controller IP 등의 외부 포트를 Board 위에 있는 SRAM/Flash를 연결할 때도 정말 신경을 써주지 않으면 실수할 수 밖에 없습니다.

또한, 대부분의 GUI기반의 tool이 가지는 특징이지만, EDK도 아주 일반적인 형태로 사용할 경우에는 상당히 편합니다만, 특별한 형태로 이용하고자 하거나 무언가 잘못될 경우, 그것을 위한 옵션이 어디에 있는지 찾기가 어렵습니다. 예를 들어 Create and Import Peripheral Wizard에서는 PLB Slave port를 여러개 가지고 있는 IP를 생성할 수 없도록 되어 있는 것으로 보이고, Interrupt signal을 추가하려고 하면 IP 내부에 눈으로 보기에도 복잡한 Interrupt control 관련 logic까지 한꺼번에 추가되는 것으로 보입니다. 그리고 실제로 일을 할 때, 설계를 점진적으로 IP를 추가하면서 진행하다 보니 경험한 것인데, 처음에는 FPGA 내부의 SRAM을 default로 사용하도록 application이 build되었는데, static memory controller를 추가하고 나니 static memory controller에 할당된 address를 default로 하여 application이 build 되도록 자동으로(?) 변경되었습니다. 그래서 link script를 손으로 변경하여 원래대로 바꾸었는데, 어떻게 변경할 수 있는 GUI tool에서는 찾을 수 없었습니다.


마지막으로 Platform Studio에서는 UNDO 기능을 제공해 주지 않습니다. 실수로 IP를 제거하거나 Configuration을 바꾸면 사용자가 다시 추가하거나 원래대로 돌려 놓는 작업을 스스로 해야 합니다.

1 개의 댓글:

익명 :

Vector Signal의 순서가 MSB:LSB 또는 LSB:MSB인건,,
Endian 때문에 그런것이 아닌가,, 합니다 ^^;;;

댓글 쓰기