FPGA 기초: 필드에서 프로그래밍이 가능한 게이트 배열의 기초

개요

필드 프로그래머블 게이트 어레이 (FPGA)는 설계자의 필요에 맞게 재구성 가능한 집적 회로입니다. FPGA 칩은 프로그램 가능한 로직 블록의 배열을 포함하며, 칩의 유연성, 하드웨어 타이밍에 의한 속도 및 신뢰성, 병렬 처리에 따라 칩이 널리 사용됩니다.

내용

FPGA는 프로세서와 달리 본질적으로 병렬의 특성을 지니므로, 다른 프로세싱 작업이 동일한 리소스를 두고 쟁탈할 필요가 없습니다. 각 독립 프로세싱 태스크는 칩의 전용 부분에 배정되며, 다른 로직 블록의 영향 없이 독자적으로 기능을 수행합니다. 결과적으로, 어플리케이션의 한 부분의 성능이 더 많은 프로세싱을 추가할 때 영향받지 않습니다.

FPGA 어플리케이션 로직

그림 1: 프로세서 기반 시스템에 비해 FPGA의 장점 중 하나는 어플리케이션 로직이 OS, 드라이버 및 어플리케이션 소프트웨어 위에서 실행되는 대신 하드웨어 회로에 구현된다는 것입니다.

FPGA 칩의 구성요소 정의하기

모든 FPGA 칩은 재구성 가능한 디지털 회로 및 I/O 블록을 구현하기 위해 프로그램 가능한 상호 연결이 있는 미리 정의된 리소스의 한정된 개수로 구성되어 있어 회로가 외부에 접근할 수 있습니다.

FPGA 칩의 구성요소

그림 2: FPGA의 다양한 구성요소

FPGA 리소스 스펙에는 설정 가능한 로직 블록의 개수, 곱셈기와 같은 고정된 함수 로직 블록의 개수, 임베디드 블록 RAM과 같은 메모리 리소스의 크기가 포함됩니다. 많은 FPGA 스펙 중, 이는 일반적으로 특정 어플리케이션의 FPGA를 선택하고 비교할 때 가장 중요합니다.

설정 가능한 로직 블록(CLB)은 FPGA의 기본 로직 유닛입니다. 슬라이스 또는 로직 셀이라고도 하는 경우, CLB는 플립 플롭과 룩업 테이블(LUT)이라는 두 가지 기본 구성요소로 구성됩니다. FPGA 제품군에 따라 플립 플롭과 LUT의 패키징 방식이 다르기 때문에, 플립 플롭과 LUT를 이해하는 것이 중요합니다.

플립 플롭

플립 플롭은 FPGA 회로 내의 클럭 사이클 사이에서 로직을 동기화하고 논리적 상태를 저장하는데 사용되는 2진 시프트 레지스터입니다. 모든 클럭 에지에서 플립 플롭은 입력에서 1 또는 0 (참 또는 거짓) 값을 래치하고 다음 클럭 에지까지 그 값 상수를 유지합니다.

플립 플롭 기호

그림 3: 플립 플롭 기호

플립 플롭은 FPGA 회로 내의 클럭 사이클 사이에서 로직을 동기화하고 논리적 상태를 저장하는데 사용되는 2진 시프트 레지스터입니다. 모든 클럭 에지에서 플립 플롭은 입력에서 1 또는 0 (참 또는 거짓) 값을 래치하고 다음 클럭 에지까지 그 값 상수를 유지합니다.

룩업 테이블 (LUT)

4입력 LUT

그림 4: 4 입력 LUT

CLB의 로직의 대부분은 LUT 형태의 매우 작은 양의 RAM을 사용하여 구현됩니다. FPGA의 시스템 게이트 개수는 특정 칩의 NAND 게이트와 NOR 게이트 개수를 가리킵니다. 그러나 실제로는 모든 조합 로직(AND, OR, NAND, XOR 등)이 LUT 메모리 내에서 진리표로 구현됩니다. 참 테이블은 모든 입력 조합에 대해 미리 정의된 출력 목록입니다.

다음은 디지털 로직 클래스의 빠른 새로 고침입니다.

예를 들어 불리언 AND 연산은 그림 5:

LabVIEW 불리언 및 작동

그림 5: NI LabVIEW 불리언 및 작동

AND 작업의 두 입력에 대응하는 진리표는 표 1에 표시되어 있습니다.

입력 1

입력 2출력

0

0

0

0

1

0

1

0

0

1

1

1

표 1: 불리언 AND 연산의 진리표

곱셈기 및 DSP 슬라이스

LabVIEW 곱하기 함수

그림 6: NI LabVIEW 곱하기 함수

두 숫자를 곱한 것처럼 보이는 간단한 태스크는 디지털 회로에서 구현하기에 매우 리소스가 많고 복잡할 수 있습니다. 그림 6은 조합 로직을 사용하여 4비트 x 4비트 곱셈기를 구현하는 방법을 도식적으로 그립니다.

4비트 x 4비트 곱셈기의 회로도

그림 7: 4비트 x 4비트 곱셈기의 회로도

이제 두 개의 32비트 숫자를 함께 곱하면, 한 번의 곱에 대해 2000 개 이상의 연산이 발생합니다. 따라서 FPGA는 수학 및 신호 처리 어플리케이션에서 LUT 및 플립 플롭 사용을 절약하기 위해 미리 빌드된 곱셈 회로를 가지고 있습니다.

많은 신호 처리 알고리즘에는 숫자의 곱을 곱한 횟수의 횟수를 유지하는 것이 포함되며, 그 결과 Xilinx Virtex-5 FPGA와 같은 고성능 FPGA는 미리 만들어진 배율 누적 회로를 가지고 있습니다. DSP48 슬라이스로도 알려진 이러한 미리 만들어진 프로세싱 블록은 25비트 x 18비트 배율기를 더하기 회로 통합합니다.

블록 RAM

메모리 리소스는 FPGA를 선택할 때 고려해야 할 또 다른 주요 스펙입니다. FPGA 칩 전체에 내장된 사용자 정의 RAM은 병렬 태스크 사이에서 데이터 세트를 저장하거나 값을 전달하는데 유용합니다. FPGA 제품군에 따라 내장 RAM을 16 kb 또는 36 kb의 블록으로 설정할 수 있습니다. 여전히 플립 플롭을 사용하여 데이터 세트를 배열로 구현하는 옵션이 있습니다. 그러나, 큰 배열은 FPGA 로직 리소스에 빠르게 비용이 많이 듭니다. 32비트 숫자의 100원소 배열은 Virtex-II 1000 FPGA의 플립 플롭의 30% 이상을 소비하거나 내장된 블록 RAM의 1% 미만을 소비할 수 있습니다. 디지털 신호 처리 알고리즘은 종종 전체 데이터 블록 또는 복소수 방정식의 계수를 추적해야 하며, 내장 메모리가 없으면, 많은 처리 함수는 FPGA 칩의 설정 가능한 로직에 맞지 않습니다.

FPGA의 고유한 병렬 실행을 통해 서로 다른 클럭이 독립적인 부분의 하드웨어 로직을 구동할 수 있습니다. 서로 다른 속도로 실행되는 로직 사이에서 데이터를 전달하는 것은 어려울 수 있으며, 내장 메모리는 FIFO (First-In-First-Out) 메모리 버퍼를 사용하여 전송을 평활화하는 데 사용되는 경우가 많습니다.

시스템에 FPGA 설계하기

FPGA에는 속도, 안정성, 유연성과 같은 많은 장점이 있지만, FPGA와 관련된 트레이드오프도 있습니다. FPGA에는 마이크로프로세서 아키텍처와 OS와 같은 드라이버 생태계와 코드/IP 베이스가 없습니다. 또한, OS와 결합된 마이크로프로세서는 데이터를 디스크로 로깅하는 것과 같이 많은 종종 필수 작업에 사용되는 주변 장치와의 파일 구조 및 통신을 위한 기초를 제공합니다.

그 결과, 지난 10년간 이기종 아키텍처라고 불리는 하이브리드 아키텍처가 나타나고, 마이크로프로세서가 I/O에 연결된 FPGA와 짝지어집니다. 현대 FPGA는 종종 컴퓨팅 성능을 향상시키기 위해 프로세서와 로직 게이트를 단일 칩으로 결합하여 시스템 온 칩(SoC)이라고 합니다. 이 방법은 두 타겟 모두가 제공하는 이점을 활용합니다.

National Instruments는 FPGA가 활성화된 디바이스에 이 강력한 마이크로프로세서와 FPGA 아키텍처를 구현했습니다. 이러한 디바이스는 견고한 시스템에서 고성능 시스템에 이르기까지 다양한 폼 팩터를 포함하며, 모두 같은 구조를 기반으로 합니다.

NI FPGA 활성화 하드웨어는 다음과 같은 기술을 포함합니다.

FPGA 설계 도구

이제 FPGA 칩의 구성요소를 알고 있다면, "사용자가 실행해야 할 로직을 구축하기 위해 수백만 개의 구성요소를 어떻게 설정할 수 있습니까?"라고 질문할 수 있습니다.

대답은 개발 도구를 사용하여 소프트웨어에서 디지털 컴퓨팅 태스크를 정의한 후 이를 구성요소를 연결하는 방법에 대한 정보를 포함하는 설정 파일 또는 비트스트림으로 컴파일하는 것입니다. 과거 FPGA 기술의 문제점은 디지털 하드웨어 설계를 잘 이해하는 엔지니어만 하위 레벨의 FPGA 설계 도구를 사용할 수 있다는 점입니다. 그러나 LabVIEW와 같은 고급 통합(HLS) 설계 도구의 상승은 FPGA 프로그래밍의 규칙을 바꾸고 그래픽 블록다이어그램을 디지털 하드웨어 회로로 변환하는 새로운 기술을 제공합니다.

기존 FPGA 설계 도구

FPGA 개발의 첫 20년 동안, VHDL 및 Verilog와 같은 하드웨어 설명 언어(HDL)는 FPGA 칩에서 실행되는 알고리즘을 설계하는 주요 언어로 진화했습니다. 이러한 하위 레벨 언어는 다른 텍스트 언어가 제공하는 장점 중 일부를 FPGA에서 회로를 설계하는 것에 통합합니다. 그 결과로 나타나는 하이브리드 구문은 신호가 외부 I/O 포트에서 내부 신호로 맵핑되거나 연결되어야 하며, 결국 이 신호는 알고리즘을 포함하는 함수에 연결됩니다. 이러한 함수는 순차적으로 실행되며 FPGA 내의 다른 함수를 참조할 수 있습니다. 그러나 FPGA에서 태스크 실행의 진정한 병렬 특성은 순차적인 라인별 흐름에서 시각화하기 어렵습니다. HDL은 다른 텍스트 언어의 속성 중 일부를 반영하지만, I/O가 신호를 통해 일련의 함수 블록에 연결되는 데이터 흐름 모델을 기반으로 하기 때문에 크게 다릅니다.

이후 FPGA 프로그래머가 생성한 로직을 확인하기 위해, 일반적으로 HDL에서 테스트 벤치를 작성하여 입력과 출력을 확인하여 FPGA 설계를 랩핑하고 연습합니다. 테스트 벤치와 FPGA 코드는 FPGA 칩의 하드웨어 타이밍 동작을 모델링하고 테스트 검증을 위해 모든 입력과 출력 신호를 디스플레이하는 시뮬레이션 환경에서 실행됩니다. HDL 테스트 벤치를 생성하고 시뮬레이션을 실행하는 과정은 원래 FPGA HDL 설계 자체를 생성하는 것보다 더 많은 시간이 걸리는 경우가 많습니다.

HDL을 사용하여 FPGA 설계를 생성하고 확인한 후에는, 텍스트 기반의 로직을 사용하여 구성요소를 연결하는 방법에 대한 정보를 포함하는 설정 파일 또는 비트스트림으로 HDL을 통합하는 컴파일 도구에 이를 제공해야 합니다. 이 다단계 수동 프로세스의 일부로, 사용 중인 FPGA 칩의 핀에 신호 이름을 맵핑하도록 지정해야 하는 경우가 많습니다.

그림 8: VHDL의 단순 카운터 FPGA 설계

결국, 이러한 설계 흐름의 문제점은 기존의 HDL에서 프로그래밍하는데 필요한 전문 지식이 광범위하지 않기 때문이며, 그 결과 FPGA 기술은 대부분의 엔지니어와 과학자들에게 접근할 수 없다는 점입니다.

상위 레벨 통합 설계 도구

LabVIEW 같은 그래픽 HLS 설계 도구가 등장하여 기존의 HDL 설계 프로세스의 주요 장애점을 제거했습니다. LabVIEW 프로그래밍 환경은 FPGA 프로그래밍에 명확하게 병렬화와 데이터 흐름을 나타내기 때문에 전통적인 FPGA 설계 프로세스에 경험이 많거나 경험이 없는 사용자가 FPGA 기술을 활용할 수 있습니다. 또한 이전의 IP(Intellectual Property)가 손실되지 않도록, LabVIEW 사용하여 기존의 VHDL을 LabVIEW FPGA 설계에 통합할 수 있습니다. LabVIEW FPGA는 하드웨어와 매우 통합되어 있기 때문에, 많은 HLS 코드 생성기의 경우처럼 타이밍 또는 리소스 제약을 충족하기 위해 VHDL에서 코드를 다시 작성할 필요가 없습니다.

그림 9: 왼쪽에는 FPGA를 위한 고급 설계 도구인 LabVIEW가 있습니다. VHDL 설계를 생성하고 확장할 때 자주 발견되는 낮은 수준의 복잡성을 추상화할 수 있습니다.

그런 다음 LabVIEW 개발 환경에서 직접 기능을 제공하여 FPGA 로직의 동작을 시뮬레이션하고 확인합니다. 하위 레벨 HDL 언어를 사용하지 않으면, 테스트 벤치를 생성하여 설계의 로직을 연습할 수 있습니다. 또한, LabVIEW 환경의 유연성은 Xilinx ISim과 같은 사이클 정확한 시뮬레이터로 내보내기하여 고급 사용자가 설계의 타이밍과 로직을 모델링할 수 있도록 도와줍니다.

LabVIEW FPGA 컴파일 도구는 컴파일 프로세스를 자동화하므로, 버튼 클릭으로 프로세스를 시작하고 컴파일 단계가 완료될 때 보고서 및 에러를 받을 수 있습니다. FPGA 설계로 인해 타이밍 에러가 발생하는 경우, LabVIEW 이러한 중요한 경로를 그래픽으로 하이라이트하여 디버깅 과정을 단축합니다.

결론

LabVIEW 같은 상위 레벨의 도구가 FPGA를 보다 쉽게 접근할 수 있도록 하기 때문에 FPGA 기술의 채택이 계속 증가하고 있습니다. 그러나 FPGA 내부를 살펴보고 블록다이어그램이 실리콘으로 실행되도록 컴파일될 때 실제로 발생하는 현상을 파악하는 것이 중요합니다. 플립 플롭, LUT, 배율기, 블록 RAM을 기반으로 하드웨어 타겟을 비교하고 선택하는 것이 어플리케이션에 적합한 FPGA 칩을 선택하는 가장 좋은 방법입니다. 리소스 사용을 이해하는 것은 특히 크기와 속도를 최적화할 때 개발 과정에서 매우 유용합니다. 이 문서는 모든 FPGA의 기본 구성요소를 포괄적으로 나열하는 것은 아닙니다. FPGA 및 디지털 하드웨어 설계에 대한 더 자세한 정보는 아래 리소스를 참조하십시오.