반도체

[기고] 하드웨어 엔지니어를 위한 FPGA 인터페이스 구현

이수환

[전자부품 전문 미디어 인사이트세미콘]

최근의 많은 프로그래머블반도체(FPGA) 설계는 제어를 위해 다양한 종류의 임베디드(내장형 제어) 프로세서를 사용한다. 일반적으로 시스템온칩(SoC) 디바이스를 사용한다. 아래 그림은 프로세서와 여러 주변장치를 포함하면서, 이 장치를 아발론(Avalon) 메모리 맵(MM) 버스를 통해 연결하는 전형적인 알테라 FPGA 시스템을 보여준다.

이러한 프로세서는 최종 애플리케이션을 크게 간소화하지만 높은 프로그래밍 배경 지식과 복잡한 툴 체인에 대한 지식을 필요로 한다. 이는 특히 하드웨어 엔지니어가 소프트웨어 엔지니어를 귀찮게 하지 않으면서 주변장치를 읽고 쓰는 간단한 방법을 필요로 하는 경우 디버그하기가 쉽지 않다.

이 설계 개념은 알테라의 SPI 슬레이브-아발론 MM 브리지를 사용해 아발론 버스를 적용하는 간단한 방법을 제공한다. 이러한 기법을 사용할 경우 두 가지 장점이 있다. 이 방법은 원래의 시스템 설계에 영향을 미치지 않으며 브리지와 임베디드 프로세서가 공존할 수 있다는 것이다. SPI-아발론 MM 브리지는 프로세서와 마찬가지로 엔지니어가 직접 LTC6948 분수 분주형 PLL 주파수를 제어하거나 LTC1668 DAC 전압의 설정, LTC2498로부터 전압을 읽거나 LTC2983으로부터 온도를 읽을 수 있게 한다.

알테라는 SPI-아발론 MM 브리지를 위한 레퍼런스 디자인을 제공한다. 그러나 안타깝게도 문서는 풍부하지 않으며 NIOS 프로세서를 SPI 마스터로 사용한다. NIOS 프로세서는 아발론 MM 버스에 직접 인터페이싱 할 수 있기 때문에 이는 사실상 SPI 브리지의 목적에 맞지 않는다. 실제적인 SPI 마스터는 리니어 테크놀로지의 린두이노 마이크로컨트롤러유닛(MCU)이다. 이 MCU는 아두이노 계열 보드로 LT 데모 보드에 인터페이싱 하는 추가 기능을 갖추고 있다. 한 가지 별도의 기능은 레벨 시프트 된 SPI 포트이다.

이 레벨 시프팅 기능은 1.2볼트(V)와 같은 낮은 전압을 갖는 FPGA I/O 뱅크로 인터페이싱 할 때 특히 유용하다. 린두이노 펌웨어는 가상 COM 포트를 통해 명령을 입력 받고 SPI 트랜잭션으로 명령을 변환할 수 있다.

알테라 예제 설계를 리버스 엔지니어링을 진행한 다음 브리지가 받아들일 수 있는 패킷을 생성하기 위해 파이썬 라이브러리를 개발했다. 그런 다음 이들 패킷을 린두이노 명령으로 변환한다. 이와 같이 간단한 파이썬 스크립트를 이용하면 하드웨어 엔지니어는 인터페이싱 프로토콜을 처음부터 다시 만들 필요 없이 프로젝트를 완벽하게 제어할 수 있다. LTC1668 DAC을 위한 디지털 패턴 생성기의 주파수를 제어하는 파이썬 스크립트 예제는 ‘www.linear.com/solutions/linearlabtools’의 ‘LinearLabTools Python’ 폴더에서 구할 수 있다.

아래 그림은 FPGA 시스템의 블록 다이어그램을 보여준다. 수치 제어 발진기(NCO)는 시프트 레지스터 또는 PIO 코어를 이용해 제어할 수 있다. 시프트 레지스터는 NCO를 직접 제어할 수 있으므로 디버그를 위해 포함됐다. GPIO 라인 로직 레벨을 하이로 설정하면 SPI-아발론 MM 브리지가 작동하면서 아발론 MM 버스를 통해 32비트 PIO 포트를 제어한다. 이어서 PIO 출력은 NCO 주파수를 제어한다.

가장 기본적인 시스템 운영을 가지고 추가적인 아발론 주변장치 IP 코어를 아발론 MM 버스에 연결할 수 있다. 시스템 설계를 위해 알테라는 큐시스(Qsys)라고 하는 시스템 통합 툴을 제공한다. 이 툴은 IP를 또 다른 IP와 연결하는 그래픽유저인터페이스(GUI)를 제공한다. IP의 주소는 완벽하게 구성 가능하다. 제공되는 예제의 경우 PIO는 0x0 기본 주소 위치로 설정된다.

FPGA에 최초로 설계한 부분을 적용할 때 LinearLabTools에 제공되는 파이썬 라이브러리는 설계에 인터페이싱 하는 다음과 같은 2개 함수를 포함한다.

transaction_write(dc2026, base, write_size, data)
transaction_read(dc2026, base, read_size)

이들 함수에 대한 첫 번째 인수는 린두이노 직렬 포트 인스턴스이다. 두 번째 인수는 아발론 버스에서 주변장치의 주소이다. 함수는 각 바이트의 리스트를 입력 받고 되돌려준다. 이들 두 함수는 IP에 쓰고 읽을 때 유연성을 허용하기 위해 작성된다. 제공된 예제를 통해 NCO를 설정하려면 transaction_write 함수가 필요한 전부이다. 식 1을 사용해 튜닝 워드를 결정한다.

식1 tuning word =(desired frequency )/(system clock frequency )×2^32

50MSPS 샘플 레이트를 갖는 NCO를 1kHz로 설정하려면 튜닝 워드 값은 85899이다. 이것은 4바이트 리스트로 넘겨지는 16진수로 표시하면 0x00014F8B이다. DAC를 1KHz로 설정하는 파이썬 코드는 다음과 같다.

transaction_write(linduino_serial_instance, 0, 0, [0x0,0x01,0x4F, 0x8B])
PIO의 기본 주소는 로직 설계로부터 영(0)이다.

아래 그림에 보이는 간단한 파이썬 스크립트는 FPGA 설계의 인터페이스와 파이썬 스크립트를 시연하기 위한 것이다. 이 스크립트는 NCO를 구성하는 간단한 텍스트 인터페이스를 포함한다. 중요한 점은 아발론 SPI 브리지가 SPI 모드3을 사용한다는 점이다. 이 모드는 시행착오를 통해 어렵게 적합한 모드로 결정됐다.알테라 예제에서 NIOS 프로세서 SPI 인터페이스를 분석함으로써 검증됐다.

결론적으로 이 예제 프로젝트는 임베디드 프로세서를 전혀 건드리지 않아도 시스템을 제어할 수 있다는 것을 보여준다. 따라서 하드웨어 엔지니어는 소프트웨어 엔지니어를 귀찮게 할 필요 없이 프로젝트를 진행할 수 있다. 이 방법의 이점은 원래의 설계에 영향을 미치지 않으면서 매끄럽게 FPGA에 적용할 수 있으며 하드웨어 엔지니어는 하드웨어에 집중할 수 있다.

글 리니어테크놀로지 노아 퀸테로

이수환
webmaster@ddaily.co.kr
기자의 전체기사 보기 기자의 전체기사 보기
디지털데일리가 직접 편집한 뉴스 채널