이 페이지는 전문 FPGA 설계자가 되는 방법을 다루는 다섯 편짜리 연재의 첫 번째 글입니다. 전체적인 개요와 함께, 어떻게 시작하면 좋을지에 대한 몇 가지 제안으로 시작해 보겠습니다.
서론
이 연재는 FPGA 설계를 배우고 싶은데 — 특히 그것을 직업으로 삼고 싶은데 — 넘쳐나는 정보의 바다에서 길을 잃은 분들을 위한 것입니다. 튜토리얼, 블로그 글, 동영상 강좌, 포럼 스레드가 정말 많습니다. 게다가 지금은 그런 자료의 상당수가 AI가 만들어 낸 것입니다. 어느 것이 길을 아는 사람이 쓴 글이고, 어느 것이 그저 전문가처럼 보이려는 쓸모없는 말인지 구분하기 어렵습니다.
배워야 한다는 이야기에 압도된 느낌이 든다면, 그건 결코 여러분만 그런 게 아닙니다. 정복해야 할 것들의 목록은 정말 길고, 무엇이 실제로 중요한지, 무엇이 그저 소음인지 구분하기 어렵습니다.
저는 여러분에게 무엇을 하라고 지시하거나, 한 글자도 틀리지 않고 따라야 하는 커리큘럼을 쥐여 주려는 게 아닙니다. 제가 원하는 것은 각 기술의 목적과 중요성을 설명해서, 무엇을 언제 우선순위에 둘지 스스로 결정할 수 있게 돕는 것입니다. 지금도 충분히 어려운 일입니다. 불필요한 수고를 덜고 목표에 도달할 수 있다면 훨씬 좋겠지요.
그런데 목적이 그저 면접을 통과하는 것이라면, 솔직히 큰 도움은 못 드리겠습니다. 취업 면접은 예측이 안 되는 야생동물 같은 것입니다. 면접관마다 지원자를 평가하는 방식이 다르고, 아주 흔하게는 자기 자신을 떠올리게 하는 사람을 찾습니다. 결국 우리는 모두 자신이 그 방에서 가장 똑똑하다고 생각하지 않습니까? 그리고 어쩌면 순진한 접근법이 통할지도 모릅니다. 실력이 있다면 일자리는 찾게 됩니다.
FPGA는 어디에 쓰이나요?
기술을 파고들기 전에, 이 직업이 실제로 무엇을 하는지 잠깐 짚어 볼 가치가 있습니다. 사람들은 FPGA 칩으로 무엇을 만들고, 어떻게, 왜 만들까요?
상황은 이렇습니다. 누군가 새 제품을 위한 인쇄 회로 기판 (PCB)을 필요로 합니다. 그 보드에 올라가는 부품 대부분은 시장에서 살 수 있습니다. 메모리, 전원 공급 장치, 커넥터 등등이죠. 하지만 모든 동작의 한가운데 어딘가에는, 세상 어떤 부품도 하지 않는 기능이 있습니다. 적어도 제품이 필요로 하는 방식 그대로는요. 그래서 직접 칩을 설계하기로 합니다. 그것은 주문형 반도체 (ASIC)이고, 정말 정말 비쌉니다. 제작 주기에는 집 한 채보다 더 많은 돈이 들 수 있고, 그 후에 버그를 발견하면 할 수 있는 일이라 해 봐야 에라타 리포트 (errata report)를 내는 것뿐입니다. 그리고 재정적 타당성이 있다면, 얼마 후 새 버전을 내놓는 것이고요.
이 비싸고 위험한 설계 주기에 대한 대안은 FPGA 칩입니다. 이런 종류의 칩은 실리콘 조각 위에 올려놓은 전자 키트와 같습니다. 즉, 특정한 방식으로 연결되지 않은 작은 구성 블록과 배선이 잔뜩 들어 있습니다. 대신 FPGA 칩이 어떻게 동작해야 하는지에 대한 정보를 담은 큰 데이터 덩어리가 있습니다. 이 데이터를 비트스트림 (bitstream)이라고 합니다. 비트스트림에 담긴 정보는 FPGA 칩 내부의 각 작은 구성 블록을 구성하고, 내부 배선이 어떻게 연결될지도 결정합니다.
비트스트림이 FPGA 칩에 로드되고 나면, 우리는 주문형 반도체와 비슷한 것을 얻게 됩니다. 즉, 마치 우리 목적을 위해 실리콘을 제조한 것처럼 동작하는 칩이죠. 다만 더 느리고, 에너지를 더 많이 먹으며, 부품 자체의 가격도 대량 생산된 주문형 반도체보다 더 비쌉니다.
비트스트림을 소프트웨어와 혼동해서는 안 됩니다. 둘은 비슷한 점이 있습니다. 뭔가 잘못됐을 때 코드 한 줄을 고치고 다시 컴파일하면 되는 경우가 많기 때문이죠. 하지만 FPGA 칩은 프로세서가 아닙니다. FPGA 칩은 무엇도 "실행"하지 않습니다. FPGA 칩을 작은 논리 기계가 잔뜩 모인 거대한 배열이라고 생각해 보세요. 그리고 비트스트림은 이 작은 기계들 각각에 무엇을 할지 알려 줍니다.
이 점을 요약하자면 이렇습니다. FPGA 칩은 전자 프로젝트에서 빠진 벽돌 한 장입니다. 주문형 반도체를 갖고 싶지만, 개발 위험과 비용을 줄이기 위해 부품당 더 많은 돈을 내고 성능은 더 낮게 받아들이는 쪽을 선호할 때 사용됩니다. 그 위험과 비용은 여전히 높지만, 그래도 덜한 편입니다.
FPGA 설계자의 주요 업무는 비트스트림을 만들어 내는 설계 작업으로 구성됩니다. 이는 소프트웨어 설계자가 코드를 작성해 실행 가능한 소프트웨어 바이너리를 얻는 것과 비슷합니다. 하지만 FPGA 설계자의 역할은 분명히 거기서 끝나지 않습니다. FPGA 칩은 전자 프로젝트의 일부이니까요. 이 이야기는 나중에 하겠습니다.
프로젝트에 임베디드 프로세서가 필요하다면, 그 부분도 흔히 FPGA 칩의 일부입니다. 어떤 프로젝트에서는 프로세서를 별도 부품으로 두기로 합니다. 어느 쪽이든, 프로세서는 단순한 작업을 수행할 수도 있고, Linux 또는 다른 운영체제를 돌리는 본격적인 컴퓨터처럼 동작할 수도 있습니다.
그런데 말이죠 — 예전에는 FPGA를 데이터 센터의 코프로세서나 하드웨어 가속기로 쓴다는 이야기가 많이 떠돌았습니다. FPGA를 AI에 활용한다는 이야기도 있었죠. 그리고 지금도 그런 나팔을 부는 회사들이 있습니다. 제 생각에 그건 예나 지금이나 헛소리였고, 특히 AI와 관련된 분야에서는 GPU가 훨씬 우월하다는 것이 이제 꽤 명확합니다. 그러니 그런 데에 현혹되지 마세요. FPGA는 전자 프로젝트에서 빠진 중요한 벽돌 한 장, 때로는 아주 정교한 벽돌로 쓰이며, 그 외의 용도로 쓰이는 일은 꽤 드뭅니다.
왜 어려운가요?
이렇게 말해 보겠습니다. 제가 훌륭한 FPGA 설계자가 되기 위해 필요한 것에 대해 다섯 페이지나 쓰고 있다면, 아마 그만큼 내용이 많다는 뜻이겠지요.
FPGA 설계자가 보수를 잘 받는 이유는 이 일이 복잡한 직업이기 때문이고, 그 복잡함은 세 가지 역량을 동시에 요구한다는 데서 나옵니다.
첫 번째 역량은 전자공학입니다. 결국 여러분은 PCB 위에 올라가는 무언가를 개발하는 것이고, 그것은 같은 PCB에 있는 다른 부품들과 대화해야 합니다. 프로젝트에는 핀, 전압, 커넥터, 클록 발진기 등등 이루 말할 수 없이 많은 요소가 얽혀 있습니다. 여러분이 만든 로직은 실제 보드 위에서, 실제 전압과 실제 온도 속에서 실제 부품과 대화합니다.
두 번째 역량은 '소프트웨어'입니다. 여러분이 쓰고 다루는 것은 소프트웨어와 아주 비슷하게 생긴 파일들입니다. Verilog 파일, 제약 조건 파일 (constraint file), 컴파일 스크립트 (script) 같은 것들이죠. 하지만 이런 종류의 '소프트웨어'를 다루는 일은 훨씬 복잡합니다. 그 이유는 뒤에서 다루겠습니다. 이른바 컴파일러는 소프트웨어 컴파일러처럼 여러분 편이 되어 주지 않으며, 디버깅에 쓰는 도구들도 마찬가지입니다.
세 번째 역량은 응용 분야에 대한 지식입니다. FPGA 설계자로서 여러분은 프로젝트와 관련된 고급 주제들(혹은 이전 경험이나 공부로 이미 알고 있는 주제들)을 스스로 익혀야 할 때가 많습니다. 신호 처리, 네트워크 프로토콜, 컴퓨터와의 인터페이스 프로토콜, 컴퓨터 모니터로 보낼 데이터를 인코딩하는 표준, 그리고 실제로 개발하는 제품과 관련된 수많은 다른 분야가 있죠. 새로운 통신 프로토콜, 새로운 안전 규정, 혹은 이상한 인터페이스 요구 사항을 가진 새 부품이 늘 등장합니다.
그런데 FPGA 설계자로서 겪게 되는 정말 큰 도전은 이것입니다. 프로젝트의 핵심 전문 주제가 FPGA 설계 자체와 밀접하게 맞닿아 있는 경우가 많다는 점입니다. 즉, 여러분이 몸담은 회사가 다루는 핵심 기술의 전문가가 되어야 할 수도 있습니다. 대표적인 예로는 FIR, IIR 같은 디지털 필터, FFT, 데시메이션, 인터폴레이션이 있고, 오디오 및 비디오 처리, 무선 및 소프트웨어 정의 라디오, 레이더, 의료 영상, 네트워킹과 패킷 처리, 이더넷, PCIe와 USB, HDMI, DisplayPort, SDI, MIPI 같은 비디오 표준(비디오 타이밍과 색 공간 문제까지 포함해서) 등이 있습니다. 그리고 물론 여기서 끝나지 않습니다.
FPGA 설계자가 되기 위해 이 모든 것을 알아야 하는 것은 아닙니다. 하지만 일을 하다 보면 그중 상당히 많은 것을 결국 배우게 됩니다. 그러니 새로운 기술을 끊임없이 배우는 일이 악몽처럼 느껴진다면, 저는 이렇게 묻고 싶습니다. 음, 정말 FPGA에 뛰어들 생각이 맞나요?
전자공학 천재여야 하나요?
어쩌면 좋은 소식 하나를 전해 드리겠습니다. FPGA 프로젝트의 로직은 크게 두 종류로 나눌 수 있는데, 그중 하나는 전자공학 지식이 전혀 필요 없습니다.
첫 번째 종류는 인터페이스용 로직입니다. 외부 부품이나 IP 코어 (IP core)와 대화하는 로직이죠. 하드 IP든 소프트 IP든 마찬가지입니다. 비디오 신호나 무선 신호를 받아들이거나 만들어 내는 칩, RAM 칩 등을 떠올려 보세요. 이런 종류의 로직은 그런 부품과 인터페이스하며, 이 인터페이스가 바로 FPGA가 물리적 세계와 만나는 지점입니다. 이런 로직을 구현하려면 전압 레벨, 타이밍 예산, 지터 (jitter) 같은 것을 이해해야 합니다.
두 번째 종류는 처리용 로직입니다. 실제 계산이 일어나는 곳이죠. 영상 화질 개선, 디지털 필터, 네트워크 프로토콜에 따라 데이터 스트림을 정리하거나 파싱하는 일 등이 여기에 해당합니다. 이런 로직은 보통 두 가지 방식 중 하나로 동작합니다. FIFO나 다른 메모리 소자에서 데이터를 가져오고 거기에 데이터를 쓰는 방식이라면, 이를 '순수 로직' 프로젝트라고 부를 수 있습니다. 아니면 데이터 흐름과 동기화되어 동작하는 방식인데, 예를 들어 무선 신호에서 샘플을 받아 입력 샘플 하나가 들어올 때마다 출력 샘플 하나를 파이프라인 (pipeline) 지연과 함께 만들어 내는 디지털 필터가 그렇습니다. 후자의 경우 각 단계가 스트림 속도를 따라가야 하므로 구현이 더 어려운 편입니다.
여기서 중요한 점은, 처리용 로직을 구현하는 데에는 전자공학 지식이 전혀 필요 없다는 것입니다. 제가 '순수 로직'이라고 부른 것이든 외부 데이터 흐름과 동기화된 것이든 상관없습니다. 모든 것이 FPGA 내부에서 일어나고, 로직 설계 입장에서 바깥세상은 상관이 없으니까요. 그래서 FPGA 세계로 들어가는 가장 쉬운 길입니다. 다만 함정이 있습니다. 프로젝트에 이런 종류의 로직이 항상 많은 것은 아니라는 점입니다. 게다가 작은 회사에서는 이것저것 다 해야 합니다. 피할 수 없습니다.
'전형적인 프로젝트'란 없습니다
FPGA 프로젝트가 어떻게 진행되는지 설명한 자료를 찾아보면, 멋진 도표가 잔뜩 나옵니다. 그것들은 적당히 걸러서 보세요. 현실은 훨씬 지저분합니다. 이유는 이렇습니다.
우선, PCB는 그 보드가 정확히 무엇을 할지 명확해지기 전에 개발되는 경우가 많습니다. 말도 안 되는 것처럼 들리고, 때로는 정말 말도 안 되지만, 이것은 FPGA의 아름다움, 즉 유연성의 결과이기도 합니다. 하드웨어가 그 유연성을 가둬 버리지 않는 한, 보드가 무엇을 해야 하는지는 나중에 정해도 됩니다.
둘째, FPGA 프로젝트의 기능은 거의 항상 점진적으로 개발됩니다. 처음에는 최소한의 기능만 넣고, 시간이 지나면서 기능을 더해 갑니다. 관리자들은 대개 뭔가 동작하는 모습을 보고 싶어 하기 때문이기도 하고, 요구 사항이 늘 바뀌는 경향이 있기 때문이기도 합니다. 새로운 기능 요구 사항을 지원하고 하드웨어 버그를 해결하기 위해 프로젝트와 함께 PCB가 수정되는 일도 드물지 않습니다.
셋째, 처음부터 시작하는 것보다 기존 프로젝트를 이어 가는 일이 더 흔합니다. 완전히 새로워 보이는 프로젝트조차 기존 FPGA 설계와 기존 PCB에서 출발해 새로운 요구 사항에 맞게 고치는 경우가 많습니다. 소프트웨어 개발을 해 본 분이라면 이 이야기가 익숙하게 들릴 텐데, 그것은 우연이 아닙니다.
그래서 '전형적인 FPGA 프로젝트 흐름'에 대한 이야기를 접할 수도 있습니다. 명세 작성, 아키텍처, RTL, 시뮬레이션, 합성, 구현, 타이밍 클로저 (timing closure), 비트스트림 (bitstream), 브링업 (bring-up), 검증. 대략 그런 순서죠. 그게 완전히 헛소리라고 말하고 싶지는 않으니 이렇게 표현하겠습니다. 저는 그런 방식으로 돌아가는 프로젝트를 한 번도 본 적이 없습니다. 이 단계들 중 일부는 서로 뒤섞이고, 일부는 아예 건너뛰며, 보통은 모든 단계가 동시에 일어납니다. FPGA 하는 사람의 핵심은 모든 일이 동시에 벌어지는 것에 익숙해지는 것입니다.
정리하자면 이렇습니다. 회사에서는 기존 프로젝트에 기능을 추가하는 일로 시작할 가능성이 큽니다. 그리고 그 프로젝트가 잘 구조화되어 있다면(음, 그런 경우는 드물지만요), 첫날부터 모든 것을 알 필요는 없습니다.
어떻게 시작하면 좋을까요?
FPGA 설계를 배우는 일은 이론적 역량을 쌓는 것과 실전 능력을 기르는 것이 결합된 과정입니다. 전자 장비를 먼저 만져 볼지, 이론을 먼저 배울지, 아니면 둘을 조금씩 번갈아 가며 끝까지 갈지는 여러분이 정하면 됩니다. 세 가지 방식 모두 효과가 있습니다.
다만 한 가지 경고하고 싶은 것이 있습니다. FPGA 취미 개발자에게서 배우지 않도록 조심하세요. 정말로 역효과가 날 수 있습니다. FPGA 업계에서 가장 어려운 점은 신뢰할 수 있는 설계를 얻는 것입니다. 취미 개발자들은 대개 그런 것에 관심이 없습니다. 현장에서 10 년을 버텨야 하는 제품을 만드는 게 아니니까요. 그래서 전문적인 FPGA 설계에 필요한 작지만 결정적인 세부 사항을 건너뛴, 빠르고 짧은 길을 제시하는 경우가 많습니다. 그런 사람들에게 배우면 정말 나쁜 습관이 몸에 뱁니다.
취미 개발자와 배우고 싶은 사람을 어떻게 구분할 수 있을까요? 스스로 지식을 갖추기 전에는 무엇이 맞고 틀린지 알기 어렵습니다. 그래도 그 글쓴이가 FPGA 설계를 대하는 태도가 올바르게 꼼꼼하다면 느낌이 올 것입니다. 올바른 성향이 어떤 것인지는 이 연재의 마지막 편에서 설명합니다.
이런 이야기를 염두에 두고, 제가 제안하는 실전 시작 방법은 다음과 같습니다.
인터넷에는 예제 프로젝트가 넘쳐납니다. 보통은 자신이 가진 보드에 맞춰진 FPGA 프로젝트로 시작하는 것이 가장 쉽습니다. 이런 프로젝트는 바로 이 하드웨어를 사도록 유도하려고 패키지에 포함되어 있는 경우가 많습니다.
단순한 LED 깜빡이기 프로젝트로 시작하세요. LED가 깜빡이는 게 재미있어서가 아니라, 구현과 비트스트림 (bitstream) 프로그래밍의 첫 번째 전체 사이클을 경험하게 해 주기 때문입니다. 도구를 설치하고, 비트스트림이 생성되는 것을 보고, 보드에서 뭔가 일어나는 것을 보게 됩니다. 그것 자체로 하나의 이정표입니다.
그다음에는 다른 예제 프로젝트를 시도해 보세요. 그런 프로젝트의 가치는 여러분이 그것에서 무엇을 이해했는지, 그리고 더 중요하게는 그 프로젝트에 의미 있는 변경을 가하고 결과가 어떻게 되는지 확인할 수 있는 능력에 있다는 것을 기억하세요. 고칠 수 없는 프로젝트는 아무것도 배우지 못한 프로젝트입니다.
그런 의미에서, 긴 지시 목록과 함께 제공되는 벤더 데모 프로젝트도 조심하세요. 이것을 클릭하고, 저것을 클릭하면, 마지막에는 보드가 뭔가 대단한 것을 해 냅니다. 그 과정에서 아무것도 이해하지 못했고, 프로젝트가 너무 복잡해서 이해하거나 고칠 수 없다면, 그 프로젝트는 여러분에게 완전히 무가치합니다. 그것은 데모일 뿐, 설계 예제가 아닙니다.
마지막이자 가장 어려운 단계는 스스로 정한 프로젝트로 자신을 시험해 보는 것입니다. 인터넷에 있는 기존 프로젝트에서 얼마든지 영감을 얻을 수 있지만, 진짜 핵심은 그것을 전부 스스로 해 보는 데 있습니다. 대부분의 공개된 프로젝트와 달리, 여러분의 프로젝트 아이디어는 쓸모없고 엉뚱해도 됩니다. LED와 버튼으로 시시한 게임을 만들고, 보드를 악기로 만들어 보고(PWM으로 아날로그 비슷한 출력 신호를 만들면 됩니다), LED를 다양한 패턴으로 어둡게 하거나 깜빡이게 해 보세요. 떠오르는 대로 하면 됩니다. 그런 프로젝트는 보통 공개되지 않습니다. 결과가 아무 의미 없는 엉뚱한 아이디어에 누가 시간을 쓰고 싶겠습니까? 하지만 실력을 연습하려고 하는 것이니 결과가 쓸모없어도 상관없습니다. 중요한 것은 그것이 제대로 동작하고, 여러분이 올바른 기법을 써서 그걸 해 냈다는 사실입니다. LED와 버튼에서 시작해 더 도전적인 것으로 올라가 보세요.
FPGA에 관한 짧은 동영상은 유용할 수 있습니다. 특히 하드웨어로 특정한 일을 하는 방법을 보여 주는 영상이 그렇습니다. 긴 동영상은 보통 학습 효율이 떨어집니다. 말이 너무 많아지고 초점이 흐려지기 쉽기 때문입니다.
가장 중요한 것은 학습 과정을 스스로 통제하는 것입니다. 어떤 기술을 얻고 싶은지 정하고, 그것을 얻는 데 도움이 되는 자료를 찾으세요. 연속된 튜토리얼이나 동영상 같은 것에 끌려다니지 마세요.
어떤 보드를 사야 하나요?
어떤 길로 시작하고 싶은지에 따라 다릅니다. '처리 로직' 쪽인지, 아니면 더 전자공학 지향적인 실험인지에 따라서요. 아래에서 각 경우를 다루겠지만, 어느 쪽이든 적용되는 조언 두 가지부터 시작하겠습니다.
무엇보다도, 저렴한 보드를 고르세요. 첫 번째 보드라고 생각하고, 마지막 보드는 아니라고 생각하세요. 원리는 모든 보드에서 같습니다. FPGA가 작고 로직 셀도 적고 성능도 별로인 단순한 보드에서도 마찬가지입니다. 비싼 보드에서 할 수 있는 화려한 프로젝트는 대개 교육적 가치가 거의 없습니다. 초반에는 기본기를 제대로 다져야 하고, 그러기에는 사실상 어떤 FPGA든 충분합니다. 첫 보드가 부족하게 느껴질 때쯤이면 다음 보드를 훨씬 잘 고를 수 있게 되어 있을 것입니다.
둘째, AMD FPGA가 달린 보드를 고르세요. 다른 보드가 더 저렴하고 기술적으로 더 나을 수도 있지만, FPGA 시장은 AMD가 지배하고 있으므로 그들의 FPGA와 개발 도구 모음(Vivado)을 다뤄 본 경험이 앞으로 가장 도움이 될 가능성이 큽니다.
게다가 다른 FPGA 벤더들도 AMD에서 자기네 FPGA로 넘어가는 길이 최대한 매끄럽도록 애를 씁니다. 특히 Vivado와 비슷한 개발 도구를 제공하는 방식으로요. 그러니 나중에 다른 벤더의 FPGA를 다루게 되더라도 좋은 출발점을 가진 셈입니다. AMD의 FPGA가 모든 응용 분야에서 최선의 선택이라고 말하는 것은 결코 아닙니다. 하지만 나중에 다른 벤더로 옮겨 가더라도, 학습을 위한 출발점으로는 AMD가 최고입니다.
AMD가 제공하는 여러 FPGA 패밀리 중에서는 Artix-7이나 Spartan-7을 권합니다. FPGA 안에 들어 있는 ARM 프로세서를 실험해 보고 싶다면 Zynq-7000 패밀리를 권합니다. 사실 이 소자들 중 저렴한 제품군은 Artix-7 FPGA에 ARM 프로세서를 더한 것입니다. 그러니 이 중 하나를 구하면 Artix-7으로 쓸 수도 있고, ARM 프로세서까지 함께 활용할 수도 있습니다. Zynq-7000은 일석이조입니다.
Artix-7, Spartan-7, Zynq-7000은 꽤 오래된 FPGA 패밀리입니다. 하지만 이들과 시장에 나온 최신 FPGA의 차이는 성능(특히 클록 주파수)과, FPGA 초보자에게는 아무 의미 없는 수많은 특수 로직 블록뿐입니다. Artix-7(또는 Spartan-7)의 모든 기능을 활용해 프로젝트를 제대로 완성할 수 있다면, 거의 모든 것을 다뤄 본 셈입니다. Ultrascale, Ultrascale+, Versal까지 갈 필요는 없습니다.
Artix-7, Spartan-7, Zynq-7000의 또 다른 장점은, 이 FPGA를 타깃으로 할 때 Vivado(Windows 또는 Linux용)를 완전히 무료로 사용해 Verilog에서 비트스트림 (bitstream)을 생성하고, FPGA를 프로그래밍하고, 설계를 시뮬레이션할 수 있다는 점입니다. 다양한 IP 블록도 이 소자들과 함께 무료로 제공되며, 소프트웨어 개발 키트도 마찬가지입니다. 즉, 소프트웨어 비용을 내지 않고도 Vivado로 상당한 수준까지 갈 수 있습니다. 사실 거의 모든 FPGA 벤더가 자사의 단순한 FPGA 패밀리에 대해서는 개발 도구를 무료로 쓸 수 있게 해 줍니다.
더 최신의, 더 '무거운' FPGA 패밀리가 달린 보드를 고르고 싶다면, 그 FPGA에서 Vivado를 돌리는 데 유료 라이선스가 필요한지 반드시 확인하세요.
'진짜' FPGA 학습을 위한 장비
FPGA를 진짜로 시작하고 싶다면 작은 전자 실험실을 꾸며야 합니다. 사실 별것 아닙니다. 사야 할 것 대부분은 저렴하고 어느 전자 부품 상점에서나 구할 수 있습니다. 작은 저항, 듀폰 와이어 등등이죠. 간단한 디지털 멀티미터도 꼭 있어야 합니다. 가장 단순한 것이어도 제 역할을 합니다. 기본적인 납땜 장비를 갖추는 것도 좋은 생각입니다.
제가 구매를 권하는 비싼 품목은 간단한 오실로스코프입니다. 이 측정 장비는 전압을 시간의 함수로 보여 줍니다. 이를 통해 FPGA의 물리적 입력 및 출력 핀에 나타나는 신호를 볼 수 있습니다. 아날로그 전자 신호, 예를 들어 스피커를 구동하는 전압도 볼 수 있습니다.
오실로스코프는 중요합니다. 이 장비를 사용해 설계를 점검하고 디버깅하는 방법을 익혀야 하니까요. 편한 선택은 독립형 오실로스코프입니다. 하지만 컴퓨터에 연결해 컴퓨터에서 실행되는 프로그램으로 신호를 보는 'USB 오실로스코프'도 있습니다. 어느 쪽이든 상관없습니다. 둘 다 쓸 만합니다. 화려한 기능도 필요 없습니다.
다만 오실로스코프의 아날로그 대역폭이 충분한지 확인하세요. 아날로그 대역폭은 관찰하려는 신호가 얼마나 빠르게 변할 수 있는지의 한계입니다. 이것이 오실로스코프의 샘플 레이트가 아니라는 점에 유의하세요. 샘플 레이트는 줄여서 '대역폭'이라고 부르기도 하는데, 아마 구매자를 헷갈리게 하려는 의도일지도 모릅니다. 디지털 신호가 아날로그 대역폭에 가까운 속도로 변하면, 실제로는 천이(transition)가 날카롭고 빠르더라도 화면에는 완만한 에지로 표시됩니다. 이보다 빠른 디지털 신호는 아예 구분이 안 될 수도 있습니다.
그래서 저렴하게 시작하고 싶다면 10 MHz 아날로그 대역폭을 고르세요. 이는 로직 설계를 10 MHz보다 높은 클록 주파수로 돌리지 말아야 한다는 뜻입니다. 그렇지 않으면 출력 신호가 오실로스코프 화면에 제대로 나타나지 않을 수 있습니다. 사실 5 MHz 이하로 유지하는 편이 더 좋습니다. FPGA 입장에서는 아주 낮은 주파수지만, 첫걸음을 떼는 목적에는 아무 문제가 없습니다. 유일한 문제는, 아주 형편없게 만든 로직 설계도 낮은 주파수에서만 동작한다면 그냥 넘어갈 수 있다는 점입니다. 그러니 이 길을 택했다면 클록을 100-200 MHz로 올려 보고 타이밍 제약 조건 (timing constraints)이 충족되는지 확인해 보세요. 설계가 아주 낮은 클록 주파수에 묶여 있지 않다는 것을 확인하기 위해서입니다.
가격 차이가 크지 않으면서 50-100 MHz 아날로그 대역폭을 가진 오실로스코프를 찾을 수 있다면, 그쪽을 권합니다. 제가 개인적으로 쓴다면 100 MHz 미만의 아날로그 대역폭을 가진 스코프는 사지 않을 것입니다.
또 하나 확인해야 할 것은 오실로스코프에 입력 채널이 최소 두 개 있어서 두 개의 파형을 동시에 볼 수 있는지입니다. 의외로 대부분의 실무 상황에서는 파형 두 개면 충분합니다. 제 오실로스코프에는 입력 채널이 네 개 있는데, 가끔 세 개를 쓰고, 네 개를 다 쓰는 일은 드뭅니다.
오실로스코프에 관한 마지막 하나. 프로브도 함께 구매하세요. 보통 오실로스코프를 살 때 같이 삽니다. 10 MHz로 돌릴 때는 그다지 중요하지 않을 수 있지만, 주파수가 높아질수록 프로브를 제대로 쓰는 것이 더 중요해집니다.
그래서... FPGA 보드는요?
실험실 장비를 갖췄으니, 이제 어떤 FPGA 보드를 살지 고를 수 있습니다. 답은 아주 간단합니다. AMD의 FPGA가 달린 저렴한 보드를 고르세요. 그러면 십중팔구 Artix-7이나 Spartan-7 기반 보드가 됩니다. 다음 절에서 언급할 이점을 원한다면 Zynq-7000도 좋습니다. 지금부터는 전자공학 쪽 FPGA 환경에 초점을 맞추겠습니다.
가장 중요하게 살펴볼 것은 보드에 FPGA를 프로그래밍하기 위한 USB 인터페이스가 있는지입니다. 이것을 설명하기 위해 JTAG에 대해 몇 마디 하겠습니다.
FPGA에 비트스트림 (bitstream)을 기록하기 위해 FPGA에는 JTAG라는, 실험실 용도로 마련된 몇 개의 핀이 있습니다. 이 인터페이스는 다른 요긴한 작업(특히 ILA)에도 쓸모가 있지만, 가장 중요한 목적은 컴퓨터에서 FPGA로 비트스트림을 밀어 넣는 것입니다. 옛날에는 USB로 컴퓨터에 연결되는 별도의 작은 상자(흔히 'JTAG 케이블' 또는 'JTAG 프로그래머'라고 불렀습니다)가 있었습니다. 이 상자의 반대쪽은 FPGA 보드의 핀 헤더에 연결되는 여러 가닥의 선으로 되어 있었습니다.
요즘은 많은 FPGA 개발 보드에 이 기능이 내장되어 있습니다. 즉, 'JTAG 프로그래머'가 필요 없이 FPGA 보드를 Vivado가 실행되는 컴퓨터에 바로 연결하고, 여러분 설계의 비트스트림 (bitstream)으로 FPGA를 구성할 수 있습니다. 쉽고 편리합니다.
더 단순하고 저렴한 FPGA 보드에는 이 기능이 없어서 JTAG 프로그래머를 따로 사야 합니다. 공식 JTAG 프로그래머는 꽤 비싸고, 비공식 제품은 제대로 동작할 수도 있고 아닐 수도 있습니다. 그러니 첫 보드라면 돈을 조금 더 내고 이 문제를 아예 피하는 것이 낫다고 봅니다. 적어도 작업 흐름에 익숙해질 때까지는요. 아니면 비트스트림 (bitstream)을 microSD 카드에서 읽어 올 수 있는 Zynq 보드를 고르세요.
JTAG 이야기는 이쯤 하고, 이제 보드 자체의 기능으로 넘어가겠습니다.
보드에는 의미 있는 무언가에 연결할 수 있는 I/O가 있어야 합니다. 학습 과정에서는 보드를 다른 작은 전자 기기, 어쩌면 어떤 아날로그 부품용 개발 보드 같은 것에 연결해 보는 것이 큰 도움이 됩니다. 가장 좋은 학습 프로젝트는 직접 무언가를 개발하는 것입니다. 그래서 저는 듀폰 와이어로 무엇이든 연결할 수 있는 범용 핀 헤더가 있는 보드를 선호합니다.
저는 보통 직접 상호작용할 수 있도록 LED와 푸시버튼이 많이 달린 보드를 선호합니다. 첫 프로젝트에는 7 세그먼트 디스플레이도 있으면 좋습니다.
보드에는 자체 주변 부품이 몇 개 딸려 있는 경우가 많습니다. 이것들로 작은 프로젝트를 만들 수 있을지, 아니면 너무 복잡할지 생각해 보세요. 예를 들어 많은 FPGA 보드에는 HDMI 출력 잭이 있습니다. 이를 이용하면 일반 컴퓨터 모니터로 바로 들어가는 출력 신호를 만들 수 있습니다. 픽셀을 비디오 신호로 변환하는 일은 정말 복잡하기 때문에, 대부분은 이미 만들어져 있는 로직 블록을 쓸 것입니다. 그러니 HDMI 출력 자체만으로는 배울 게 별로 없습니다. 반대로, 비디오 출력에 영상 패턴을 만들어 보는 것은 꽤 많은 것을 배울 수 있습니다. 간단한 텍스트 디스플레이를 만들어 볼까요? 비디오 아트? 프랙탈? 화면의 768x768 픽셀 영역에 100x100 픽셀 이미지를 올바른 선형 보간과 함께 표시하기? 그걸 제대로 해 낸다면, 뭔가 대단한 걸 하고 있는 겁니다.
그래서 어떤 보드를 골라야 할까요? 그 보드로 무엇을 하고 싶은지, 어떤 장비를 가지고 있는지 생각해 보세요. 그다음에 그렇게 비싸지 않은 보드를 고르세요. 그리고 다시 한번, 이 보드는 첫 번째 보드이지 마지막 보드가 아니라고 생각하세요.
Zynq-7000이 달린 보드
전자공학에 바로 뛰어들고 싶지 않은 분들도 FPGA로 흥미로운 일을 할 수 있는 방법이 있습니다. 비결은 로직이 물리적 신호 대신 프로세서와 상호작용하게 만드는 것입니다. 그러면 전자 회로를 직접 만질 필요가 없습니다. 임베디드 프로세서가 들어 있는 FPGA, 예를 들어 Zynq-7000으로 작업하는 것입니다.
그런데 임베디드 프로세서가 어떻게 시작을 더 쉽게 만들어 줄까요? 프로세서 관련 문제와, 프로세서가 로직 패브릭(즉 'FPGA 부분', PL이라고 부릅니다)과 상호작용하는 부분에 바로 뛰어들지만 않는다면 가능합니다. 대신 그 부분을 위한 기성 키트를 사용해서 간단한 방법으로 로직과 상호작용하면 됩니다. 프로세서 부분의 세부 사항을 파고들고 싶다면 나중에 얼마든지 시간이 있습니다.
가장 쉬운 방법은 Xillinux로 시작하는 것입니다. 이것은 microSD 카드를 간단히 설정해서 보드를 Linux가 돌아가는 작은 컴퓨터로 만들어 주는 패키지입니다. 보드에 키보드, 마우스, 모니터를 연결하면 터미널 창은 물론 그래픽 편집기도 열 수 있는 간단한 그래픽 데스크톱을 쓸 수 있습니다. 보드의 프로세서에서 gcc와 Makefile로 C 프로그램을 직접 컴파일할 수 있고, 프로세서에서 스크립트 (script)를 실행할 수도 있습니다.
그런데 Xillinux의 진짜 핵심은 'FPGA 부분'(Verilog로 작성하는 로직)과도 간단한 인터페이스로 통신할 수 있다는 점입니다. Xillybus를 기반으로, 소프트웨어 쪽에서는 단순한 파일 I/O로 데이터를 주고받고, 로직 쪽에서는 같은 목적으로 표준 FIFO를 사용합니다. 이 데이터 교환 방식에서 중요한 점은 이것이 학습을 위한 인위적인 트릭이 아니라는 것입니다. FIFO는 FPGA 프로젝트에서 데이터를 주고받는 일반적인 방식입니다.
그러니 '처리 로직'(데이터를 입력으로 받아 처리하고 출력 데이터를 만들어 내는 로직)을 설계하는 데 관심이 있다면, 처음부터 올바른 방식으로 하게 됩니다. '진짜' FPGA 프로젝트에서 이런 로직은 보통 FIFO를 통해 처리할 데이터를 받고, 결과를 다른 FIFO로 내보냅니다. '진짜' FPGA 프로젝트에서는 이 FIFO들의 반대편에 보통 다른 로직 구성 요소가 있습니다. Xillybus로 작업할 때는 그 자리에 프로세서에서 돌아가는 소프트웨어가 있습니다. 아니면 파일과 FPGA의 FIFO 사이에서 데이터를 직접 복사하는 단순한 셸 명령 하나일 수도 있습니다.
정리하자면, Xillinux와 Xillybus로 작업하면 순조롭게 시작할 수 있고, 여러분의 첫 로직 조각들에 집중하면서 컴퓨터 같은 인터페이스로 쉽게 시험해 볼 수 있습니다. 게다가 이 환경에서는 간단한 컴퓨터 프로그램이나 스크립트 (script)로 프로세서에서 로직을 직접 제어하기도 쉽습니다. 가장 중요한 것은, 이 전체 구성이 외부 세계와의 인터페이스가 없는 프로젝트에서는 아주 자연스럽다는 점입니다.
Xillinux를 사용하는 데 특히 관련이 있는 개발 보드가 두 가지 있습니다. Smart Zynq와 Z-Turn Lite입니다. Xillinux를 설정하기 위한 기성 키트가 마련된 저가 보드들입니다. 이 웹사이트에도 Smart Zynq 보드로 할 수 있는 것들을 보여 주는 몇 개의 페이지가 있습니다.
Linux에 익숙하지 않은 분들에게는 Zynq-7000 프로세서에서 돌아가는 Linux 시스템으로 Xillybus를 거쳐 'FPGA 부분'과 상호작용하는 일이 어렵게 느껴질 수 있습니다. 이 비교적 단순한 Linux 배포판으로 소프트웨어를 개발하고 실행하는 것도 부담스러울 수 있습니다.
Linux나 Windows가 돌아가는 '진짜' 컴퓨터를 선호한다면, PCIe 인터페이스가 있는 FPGA 보드를 사용해 같은 방식의 간단한 Xillybus 기반 구성을 적용할 수 있습니다. 이런 보드는 더 비싸지만, Linux나 Windows가 실행되는 컴퓨터에 꽂아서 완전히 같은 방식으로 FPGA와 데이터를 주고받을 수 있습니다. 이 경우 Artix-7이면 충분하고, 지원되는 FPGA 패밀리 목록은 Xillybus 다운로드 페이지를 참고하세요.
Artix-7 이야기가 나왔으니 다시 말하자면, 저렴한 Zynq-7000 소자는 그냥 Artix-7 FPGA에 ARM 프로세서를 얹은 것입니다. 그러니 프로세서는 무시하고 Zynq 보드를 일반 Artix-7 보드처럼 사용할 수도 있습니다.
한 가지 차이는 Zynq-7000 FPGA는 비트스트림 (bitstream)을 microSD 카드에서 가져올 수도 있다는 점입니다. 따라서 비트스트림을 갱신하는 데 필요한 것은 USB용 microSD 어댑터뿐입니다. 컴퓨터나 노트북에 그런 기능이 이미 없다면 말이죠. 사실 U-Boot를 사용해 TFTP로 이더넷 네트워크를 통해 비트스트림을 가져올 수도 있지만, 서버를 설정해야 하므로 가장 쉬운 방법은 아닙니다.
Zynq-7000 FPGA에도 다른 FPGA와 마찬가지로 JTAG 인터페이스가 있지만, 거의 쓰이지 않고, 때로는 보드의 핀에 연결조차 되어 있지 않습니다.
정보가 많았으니 정리해 보겠습니다.
- 전자 회로를 직접 만지고 싶지 않거나, FPGA에 들어 있는 임베디드 프로세서도 시험해 보고 싶다면 Zynq-7000 보드가 좋은 선택입니다.
- FPGA가 임베디드 프로세서가 아니라 진짜 컴퓨터와 대화하기를 원한다면 PCIe 기반 보드(Artix-7)를 고려하세요.
- 현실적이고 기초적인 전자공학 경험만 원한다면 평범한 Artix-7 / Spartan-7 보드가 제격입니다.
FPGA와 AI (LLM)
마지막으로, 다들 알면서도 꺼내지 않는 이야기를 해 보겠습니다. AI입니다.
AI는 주로 인터넷의 공개된 자료에서 배우는데, 그 자료의 대부분은 취미 개발자나 AI 자신이 쓴 것입니다. 그래서 이 분야에서 AI가 내놓는 제안의 품질은, 예를 들어 소프트웨어에 관한 답변보다 현저히 낮습니다. 그 소프트웨어 쪽 답변도 항상 대단한 건 아니지만, 그건 다른 이야기입니다.
그러면 AI가 FPGA 직업을 없애 버릴까요? 미래가 어떨지는 아무도 모릅니다. 하지만 80 년대 컴퓨터와 로봇의 도입에서 무엇을 배웠는지 생각해 봅시다. 눈여겨볼 만한 몇 가지 패턴이 있습니다.
컴퓨터와 로봇은 멍청하고 반복적인 작업을 대체했습니다. 실제로 많은 사람이 일자리를 잃었지만, 그들은 그런 작업을 하던 사람들이었습니다. 지적인 일을 하던 사람들은 자리를 지켰고, 오히려 더 효율적이고 더 좋은 대우를 받게 되었습니다.
동시에, 기계의 활용 범위는 이론적으로 가능한 것보다 훨씬 좁습니다. 공장에서는 로봇이 대체할 수 있었던 육체노동을 사람이 하고 있고, 자동차 제조에서도 그렇습니다. 건설, 목공, 제과점 등등에서도 마찬가지입니다. 그 이유에 대한 제 추측은 이렇습니다. 로봇과 컴퓨터를 쓸 줄 알 만큼 똑똑한 사람은 부족하고, 자기 손으로 작업을 익힐 수 있는 사람은 넘쳐난다는 것입니다.
LLM 기반 AI의 도입도 아마 같은 길을 갈 것입니다. 반복적이고 멍청한 작업은 AI가 대체하겠지만, 영리한 작업은 AI를 도구로 쓰는 사람이 하게 될 것입니다.
그러니 미래의 FPGA 설계자인 여러분에게 결론은 간단합니다. 이 직업을 깊이 있게 배우세요. Verilog를 아는 것만으로는 충분하지 않습니다. FPGA 설계자는 결코 Verilog 코딩만 하는 사람이 아니었습니다. AI도 아주 구체적인 지시를 받으면 Verilog를 작성할 수 있습니다. FPGA 설계의 핵심은 그런 지시를 만들어 내는 현명한 결정을 내리는 것입니다. 그것을 코드로 바꾸는 일이 가장 쉬운 부분입니다.
적어도 지금으로서는 AI가 대체할 수 없는 것이 바로 더 깊은 이해와 좋은 판단입니다. 그리고 언젠가 인간의 판단을 기계로 대체하는 것이 가능해지더라도, 그것은 가장 마지막에 대체될 것입니다. AI가 이전 기술들과 같은 방식으로 도입된다면, 인간의 판단은 여전히 사람이 하게 될 것입니다.
그리고 한 가지 더. AI가 Verilog 코드와 타이밍 제약 조건 (timing constraints)을 작성하고 다른 모든 작업까지 해낸다 해도, 수행된 일이 올바른지, 그리고 그것이 앞으로 나아갈 이로운 방향인지 검증하는 사람은 언제나 필요합니다. LLM은 일종의 뇌 활동 시뮬레이터이므로, 사람처럼 실수하는 경향도 있습니다. 그러려면 AI를 이끌고 AI의 출력이 적절한지 확인할 수 있는 유능하고 현명한 사람이 필요합니다. 즉, 미래의 설계자는 오늘날의 엔지니어보다 훨씬 더 전문적이어야 합니다. 평범한 엔지니어는 AI로 대체될 수 있지만, 그것이 통하려면 뛰어난 엔지니어가 AI를 통제해야 합니다. 그리고 그런 엔지니어는 찾기 어렵기 때문에, 이 업계에서 AI가 대규모로 쓰이지 않을 가능성도 충분히 있습니다. 전통 산업에서 여전히 사람이 육체노동을 하는 것과 똑같이요.
결론은 이렇습니다. 무엇을 배우기로 했든 철저하고 깊이 있게 하세요. 그렇지 않으면 언젠가 LLM이 여러분의 엉덩이를 걷어찰 것입니다. 어쩌면 그날은 이미 왔는지도 모릅니다.
이것으로 이 연재의 첫 페이지를 마칩니다. 다음 페이지에서는 제가 중요하게 생각하는 이론적 역량들을 다루고, 그것들이 왜 배울 가치가 있는지 설명합니다.