이전에 R 시리즈 디바이스라고 불리던 다기능 재구성 가능 I/O (RIO) 디바이스는 시스템 타이밍과 트리거링의 완전한 유연성을 위해 사용자 정의 온보드 프로세싱을 제공합니다. 디바이스 기능을 제어하기 위한 고정 ASIC 대신, 다기능 재구성 가능한 I/O 디바이스는 FPGA 기반 시스템 타이밍 컨트롤러를 사용하여 모든 아날로그 및 디지털 I/O를 애플리케이션별 동작에 맞게 구성할 수 있도록 합니다. 다기능 재구성가능한 I/O 하드웨어와 NI LabVIEW FPGA Module 사용하여 완전히 유연하고 사용자 정의된 데이터 수집(DAQ) 태스크를 구현할 수 있습니다.
LabVIEW FPGA를 사용하여 DAQ 시스템 개발자는 모든 유형의 입력/출력 작업에 대한 어플리케이션을 프로그래밍할 때 완벽한 유연성을 갖추고 있습니다. VHDL과 같은 하드웨어 설계 도구에 대한 사전 지식이 없어도 FPGA 칩에 LabVIEW 코드를 내장하여 실제 하드웨어 타이밍에 의한 속도와 신뢰성을 얻을 수 있습니다.
먼저 DAQ 하드웨어의 일반적인 구성요소를 살펴보겠습니다. 아날로그-디지털 변환기(ADC), 디지털-아날로그 변환기(DAC), 디지털 입력/출력 라인이 있다고 가정하면, 실제 작동을 위해 모든 I/O를 타이밍으로 설정하고 컨트롤해야 합니다. 일반적인 다기능 DAQ 디바이스는 대부분의 기능에 필요한 기능을 통합하는 기능이 풍부한 ASIC를 사용합니다. 재구성가능한 디바이스는 디바이스 기능을 컨트롤하기 위한 고정된 ASIC 대신 FPGA 기반 시스템 타이밍 컨트롤러를 사용하여 모든 아날로그 및 디지털 I/O를 어플리케이션 특정 작동을 위해 설정할 수 있기 때문에 시장의 다른 모든 DAQ 디바이스와는 다릅니다. 재구성가능한 FPGA 칩은 LabVIEW 사용하여 프로그램되지만, 가장 낮은 레벨에서 디바이스 I/O를 컨트롤하는 새로운 함수 세트를 사용합니다. NI-DAQmx 함수를 사용하여 일반적인 작업과 함수를 추상화하는 대신, LabVIEW FPGA I/O 노드는 모든 채널에서 가장 기본적인 수준에서 완벽한 유연성을 제공합니다. 다음 섹션에서는 특정 NI-DAQmx 예제를 살펴보고 재구성 가능한 하드웨어를 사용하여 다양한 데이터 수집 태스크를 사용자 정의하는 방법을 살펴봅니다.
고급 데이터 수집을 위해 재구성가능한 I/O를 가장 일반적으로 사용하는 것은 사용자 타이밍 및 트리거링입니다. 다음은 NI-DAQmx를 사용하는 트리거 아날로그 입력 태스크의 예제 블록다이어그램입니다.
그림 1: NI-DAQmx에서 트리거된 아날로그 입력
그림 1과 같이 채널 설정에 다른 함수를 사용하는 대신, 이 하드웨어는 모든 아날로그 및 디지털 채널을 읽고 쓰는데 FPGA I/O 노드로 불리는 함수를 사용합니다. LabVIEW FPGA에서 I/O 노드를 사용하는 것과 동일한 기능을 살펴보겠습니다.
그림 2: R 시리즈 및 LabVIEW FPGA를 사용한 트리거 아날로그 입력
글로벌 채널, 샘플 클럭, 트리거, 태스크 시작, 정지, 삭제에 대한 설정 함수가 없습니다. 이것은 모두 단순 아날로그 I/O 읽기로 대체되었습니다. 모든 타이밍은 While 루프 및 케이스 구조와 같은 기본 LabVIEW 구조에 의해 제어됩니다. 전체 블록다이어그램이 FPGA 하드웨어에서 실행되므로, LabVIEW 코드는 하드웨어 타이밍에 따라 빠르고 안정적으로 실행됩니다. 이 블록다이어그램의 작동 방식을 살펴보겠습니다. 아날로그 I/O 노드는 특정 샘플링 속도를 지정하는 대신 For 루프를 사용하여 각 샘플을 수집합니다. 대응하는 ADC는 실제로 FPGA I/O 노드가 호출될 때 입력 신호를 디지털화하므로 For 루프에 의해 클럭됩니다. 100 kHz에서 신호를 샘플링하려면, 해당 루프에 지정된 지연을 10 μs로 설정해야 합니다. 루프 타이머 함수는 두 번째 루프 반복부터 시작하여 특정한 시간 지연을 보장하므로 시퀀스 구조를 사용하여 샘플 사이에 지정된 시간을 보장했습니다. LabVIEW FPGA의 케이스 구조는 기본적으로 캡슐화된 모든 코드에 대한 하드웨어 트리거를 나타내기 때문에 강력합니다. 모든 함수와 구조가 로직 게이트가 있는 하드웨어에서 실행되는 경우, 케이스 구조는 샘플링이 10 μs의 정확도 내에서 정확한 시점에서 시작되도록 합니다. 마지막으로, 태스크 ID를 지우거나 메모리를 해제할 필요가 없습니다. 하드웨어 레벨에서는 추상화 레이어가 거의 없기 때문입니다.
FPGA 기반 하드웨어의 실제 장점은 모든 타이밍과 트리거링을 사용자 정의하고, 하드웨어에서 신호 처리 및 의사 결정을 구현할 수 있다는 것입니다. 이제 일부 사용자 어플리케이션에서 아날로그 입력 트리거를 수정하는 데 필요한 사항을 살펴보겠습니다. 두 개의 아날로그 입력 채널 중 하나가 특정 임계점을 초과하는 경우 수집을 트리거하려면 어떻게 해야 합니까? 이는 LabVIEW FPGA에서 간단히 구현할 수 있습니다.
NI-DAQmx 드라이버를 사용하여 두번째 아날로그 입력 채널을 샘플링하려는 경우, 블록다이어그램은 그림 1과 크게 다르지 않습니다. 그러나 두 채널 모두가 같은 클럭 속도로 같은 트리거와 샘플을 참조하도록 강제하기 때문에 제한이 있습니다. 재구성가능한 I/O 및 LabVIEW FPGA를 사용하여 여러 채널을 샘플링할 수 있는 다양한 옵션을 살펴보겠습니다.
그림 4: R 시리즈와 함께 트리거되는 동시 아날로그 입력
그림 4 (위)는 아날로그 입력 채널 0 (AIO)의 아날로그 트리거를 기반으로 두 개의 다른 아날로그 입력 채널에서 동시에 샘플링하는 방법을 보여줍니다. 모든 재구성가능한 다기능 I/O 디바이스에는 독립적인 ADC가 있기 때문에, I/O 노드 내의 두 개의 채널은 정확히 같은 순간에 샘플링됩니다. 일반적인 다기능 DAQ 디바이스는 하나의 ADC를 통해 모든 채널을 멀티플렉스하기 때문에, 모든 채널은 같은 샘플 클럭과 트리거 라인을 공유해야 합니다. 그림 5 (아래)는 재구성가능한 다기능 I/O 디바이스가 실제로 서로 다른 아날로그 입력 채널을 독립적인 속도로 샘플링할 수 있음을 보여줍니다. 아날로그 입력 I/O 노드를 독립적인 루프 안에 놓으면, 각 채널은 완전히 다른 속도로 샘플링한 후, 두 개의 DMA 채널을 통해 데이터를 독립적으로 스트리밍할 수 있습니다.
그림 5: 다기능 재구성가능한 I/O 하드웨어와 함께 트리거되는 멀티레이트 아날로그 입력
마지막으로, 각 채널에 독립적인 시작 트리거뿐만 아니라 독립적인 샘플링 속도를 갖도록 하려면 그림 6과 같이 각 I/O 노드를 병렬 루프 구조에 놓을 수 있습니다. 이렇게 하면 각 태스크가 자체 전용 리소스를 사용하고 다른 수집 태스크와 완전히 독립적으로 실행되는 FPGA 병렬 처리를 최대한 활용할 수 있습니다.
그림 6: 독립적으로 트리거되는 멀티레이트 아날로그 입력(복구 가능한 다기능 I/O 하드웨어 포함)
NI-DAQmx 드라이버에 내장된 여러 동기화 옵션이 있어서 시간에 따라 입출력을 상호연관시킵니다. 다음은 아날로그 입력에 디지털 트리거를 지정하고 아날로그 입력 시작 트리거 신호를 사용하여 아날로그 출력 생성을 트리거하여 디지털 시작 트리거와 동기화된 아날로그 입력 채널과 아날로그 출력 채널의 블록다이어그램입니다.
그림 7: NI-DAQmx와 동기화된 아날로그 입력 및 출력
여러 기능으로 재구성가능한 I/O 하드웨어로 동일한 동기화 방식을 구현하는 것은 태스크 ID 및 내장 신호 라우팅이 필요하지 않고도 상당히 간단합니다. 이것은 LabVIEW FPGA 블록다이어그램에서 어떻게 보일지 보여줍니다.
그림 8: R 시리즈와 동기화된 아날로그 입력 및 출력
다시 한번, 케이스 구조를 사용하여 FPGA 칩에 하드웨어 트리거를 구현하고, 디지털 채널 0의 상승 에지가 실제 케이스에서 코드를 시작합니다. 아날로그 입력 및 출력 노드는 거의 지터 없이 시퀀스 구조 안에서 동시에 호출되며, 독립적인 속도를 갖고자 한다면, 아날로그 I/O 노드를 별도의 While 루프 안에 쉽게 놓을 수 있습니다. 또한 이 블록다이어그램에 보이는 사인 생성기 함수는 룩업 테이블에서 사인값을 대화식으로 설정할 수 있는 익스프레스 VI입니다.
그림 8의 블록다이어그램은 그림 7의 NI-DAQmx VI와 같은 기능을 가지고 있지만, 이 태스크를 사용자 정의하려면, 재구성가능한 I/O 디바이스만이 유연성을 제공합니다. 예를 들어 일시 정지 트리거를 추가해야 하는 경우, 내부 While 루프 안에 케이스 구조를 추가하고 다른 디지털 I/O 노드를 사용하여 참 케이스 또는 거짓 케이스를 선택하여 쉽게 수행할 수 있습니다. 하드웨어를 프로그램할 수 있는 전력은 I/O 타이밍 및 동기화를 위한 무한한 가능성을 제공합니다.
다기능 동기화의 또 다른 예는 내장 카운터로 유한 펄스를 생성하고 카운터 출력을 아날로그 입력 샘플 클럭으로 사용하는 것입니다. 이 과정은 재트리거 가능한 유한 샘플 수집을 구현하는 일반적인 접근 방식입니다. 다음은 이러한 수집에 필요한 NI-DAQmx 코드입니다.
그림 9: 재트리거 가능한 유한 아날로그 입력(NI-DAQmx 포함)
이제 같은 기능을 가진 LabVIEW FPGA 블록다이어그램과 비교해 보겠습니다.
그림 10: R 시리즈 및 LabVIEW FPGA를 사용하는 재트리거 가능한 유한 아날로그 입력
그림 10에서는 LabVIEW 코드가 하드웨어에서 실행되기 때문에 드라이버 구성 단계가 훨씬 적습니다. 단순 디지털 입력 라인과 For 루프 구조를 사용하여 하드웨어 재트리거 가능 유한 수집을 생성했습니다. 그림 9의 이전 블록다이어그램은 2개의 온보드 카운터를 사용하여 재트리거 가능한 유한 펄스 트레인을 생성하며, 일반적인 다기능 DAQ 디바이스에는 4개의 카운터만 사용됩니다. 그러나 다기능 재구성가능한 I/O 디바이스는 LabVIEW FPGA를 사용하여 모든 디지털 라인을 카운터로 설정할 수 있습니다. 카운터/타이머 구현에 대한 자세한 내용은 다음 섹션에서 다룹니다.
주파수 트리거 수집을 통해 재구성가능한 I/O 디바이스의 하드웨어 타이밍에 의한 유연성을 한 단계 더 높일 수 있습니다. 일반적인 다기능 DAQ 디바이스에서는 이러한 작업이 가능하지 않지만, 고속 온보드 의사 결정 기능을 사용하여 입력 신호의 주파수를 계산한 후 케이스 구조 안에서 원하는 코드를 선택할 수 있습니다. 여러 디바이스 동기화의 경우, 다기능 재구성가능한 I/O 디바이스는 PCI/PCI Express 보드의 RTSI 버스 또는 PXI 모듈의 PXI 트리거 버스를 사용할 수도 있습니다. 또한 블록다이어그램의 FPGA I/O 노드를 통해 외부 타이밍과 동기화 라인에 접근할 수 있습니다.
많은 다기능 DAQ 디바이스에는 연속적인 아날로그 웨이브폼 생성을 위해 FIFO 버퍼를 구현하는 아날로그 출력 채널이 있습니다. 생성되는 웨이브폼은 FIFO를 순환 버퍼로 사용하여 호스트로부터 추가적인 업데이트 없이 연속적으로 일련의 아날로그 값을 다시 생성할 수 있습니다. 데이터가 디바이스로 지속적으로 스트리밍되지 않기 때문에, 이 경우 통신 버스의 가용성에 의존하지 않습니다. 그러나 웨이브폼을 수정해야 하는 경우, 출력 태스크를 다시 시작해야만 FIFO에 새 데이터를 쓸 수 있습니다. 다른 옵션은 데이터를 하드웨어 FIFO에 연속적으로 스트리밍하여 출력 태스크에 지연이 발생할 수 있습니다. 재구성가능한 다기능 I/O 디바이스를 사용하면 하드웨어에 웨이브폼 출력을 저장할 수 있고, 하드웨어 트리거링을 사용하여 웨이브폼을 변경하여 임의의 웨이브폼 생성기를 생성할 수 있습니다.
다음은 디지털 입력 라인을 사용하여 출력 웨이브폼의 변경을 트리거하는 함수 생성기의 예입니다. 디지털 I/O 라인 0과 1의 조합을 기반으로 4개의 다른 상태 또는 아날로그 출력의 케이스를 얻습니다.
그림 11a: R 시리즈 케이스가 있는 함수 생성기 0―제로 출력
그림 11b: R 시리즈 케이스 1 기능 생성기—사인파
두 라인이 모두 로우인 경우, 케이스 0이 실행되고 그림 11a와 같이 출력은 0 V의 상수값입니다. DIO 라인 0이 하이이고 DIO 라인 1이 로우인 경우, 케이스 1은 실행되고 아날로그 출력 0에서 사인파를 생성합니다. 이 사인 생성 케이스(그림 11b)는 LabVIEW FPGA에서 필요한 정수값을 가진 사인 웨이브폼을 대화식으로 구성할 수 있는 사인 생성기 익스프레스 VI를 사용합니다.
그림 11c: R 시리즈 케이스가 달린 함수 생성기 2―제곱파
케이스 2(그림 11c)는 While 루프가 반복될 때마다 불리언 값을 토글합니다. 값이 로우인 경우, 정수 15000은 16비트 DAC의 출력 레지스터에 있는 값 15000에 대응하는 아날로그 출력 0에 작성됩니다. 부호있는 16비트 정수는 -32768과 32767 사이의 값을 가질 수 있습니다. 출력 범위가 -10 ~ 10 V인 경우, -32768을 아날로그 출력 0에 쓰면 -10 V가 생성되고, 32767을 쓰면 10 V가 생성됩니다. 이 예제에서는 15000을 쓰고 있습니다. (수학은 다음과 같습니다: 15000/32767 * 10 V = 4.5778 V) 기본적으로 케이스 2는 0과 4.578 V 사이에서 토글되는 사각파를 출력합니다.
그림 11d: R 시리즈 케이스 3 기능 생성기—톱니파
마지막 케이스(그림 11d)는 DIO 0과 DIO 1이 모두 하이인 경우 실행되며, 이 경우 룩업 테이블을 사용하여 연속적으로 톱니파를 생성합니다. 룩업 테이블 VI는 임의의 웨이브폼 값을 저장하고 이를 통해 프로그램적으로 인덱싱할 수 있는 또 다른 익스프레스 VI입니다. 이 예제에서는 아날로그 출력 채널 0에서 톱니파가 생성되도록 설정했습니다.
FPGA에 모든 값을 저장하여 버스 가용성에 대한 의존성을 제거하고, 웨이브폼 업데이트에서 하드웨어 타이밍에 의한 속도 및 신뢰성을 보장합니다. 이전 섹션에서 아날로그 입력으로 설명한 모든 트리거링과 동기화 유연성은 아날로그 출력에도 적용됩니다. 그리고 다기능 재구성가능한 I/O 디바이스에서는 서로 독립적인 속도로 서로 다른 아날로그 출력 채널을 업데이트할 수 있습니다. 이는 다른 채널의 출력에 영향을 주지 않고 단일 주기적인 웨이브폼의 주파수를 변경할 수 있다는 것을 의미합니다. 이 기능은 대부분의 데이터 수집 하드웨어에서는 사용할 수 없습니다.
앞에서 언급한 것처럼, 일반적인 다기능 DAQ 디바이스에는 4개의 온보드 카운터만 있습니다. 다기능 재구성가능한 I/O 디바이스는 사용 가능한 모든 디지털 라인에서 카운터 기능을 구현할 수 있습니다. 디지털 I/O 노드는 LabVIEW FPGA의 단일 사이클 Timed 루프라는 특수한 구조를 활용할 수 있습니다. 이 구조를 사용하면 2.5 MHz에서 200 MHz 사이의 지정된 속도로 코드를 실행할 수 있습니다. 예를 들어, 40 MHz 클럭을 사용하면, 단일 사이클 Timed 루프를 사용하여 모든 디지털 라인에서 40 MHz 카운터를 생성할 수 있습니다. 그림 12(아래)는 블록다이어그램의 모양을 보여주는 예입니다.
그림 12: R 시리즈의 단순 이벤트 카운터
카운트 값이 U32 (32비트 정수)의 데이터 타입을 가진 인디케이터로 전송되기 때문에, 이 코드는 FPGA 칩에 40 MHz, 32비트 카운터를 생성합니다. 이를 여러 번 복사하여 붙여넣으면 여러 카운터가 서로 완전히 병렬로 서로 다른 디지털 라인에서 작동하게 됩니다. 그러나 다기능 재구성가능한 I/O 디바이스를 사용하는 경우, 카운터 작업을 사용자 정의하는 것이 실제로 유용합니다. 카운터를 3개의 상승 에지마다 증가시키거나, 카운트 레지스터 값을 기반으로 아날로그 수집을 트리거하도록 선택할 수 있습니다. 유한 펄스 트레인 생성 또는 직렬 이벤트 카운팅과 같은 많은 복잡한 카운터 작업에는 두 개의 카운터가 필요합니다. 이는 일반적으로 일반적인 다기능 디바이스의 모든 온보드 카운터를 의미합니다. 최대 160개의 디지털 라인의 경우, 재구성가능한 하드웨어의 최대 카운터 개수는 I/O 가용성에 의해 제한되지 않으며 일반적으로 FPGA 칩의 크기에 따라 결정됩니다. LabVIEW 코드가 실리콘으로 실행되므로 범용 카운터를 “구동”하거나 “재구동”할 필요가 없으며 카운터 작업을 완전히 제어할 수 있습니다.
그림 13은 카운터를 사용하여 NI-DAQmx에서 일시 정지 트리거가 있는 연속 펄스 트레인을 생성하는 예입니다.
LabVIEW FPGA에서는 단순 케이스 구조가 실리콘에서 동일한 기능을 구현할 수 있기 때문에 일시 정지 트리거를 구성할 필요가 없습니다. 다음은 같은 기능이 다기능 재구성가능한 I/O 디바이스에서 구현될 때의 모습입니다(그림 14).
NI-DAQmx 드라이버가 있는 기존의 다기능 DAQ과 재구성 가능한 하드웨어의 주요 차이점은 데이터 전송이 구현되는 방식입니다. NI-DAQmx 드라이버는 디바이스에서 호스트 컴퓨터로의 모든 전송을 추상화합니다. 이는 모든 FPGA 기반 하드웨어의 경우 LabVIEW 완전히 프로그래밍되어야 합니다. 디바이스 내부에서 데이터를 버퍼링하는 방법에는 여러 가지가 있으며, DMA 채널 및 인터럽트 요청과 같은 다양한 데이터 전송 방법을 사용합니다.
LabVIEW FPGA의 FIFO 버퍼는 LabVIEW 프로젝트 탐색기에 구성되어 내장 메모리 또는 하드웨어 로직을 사용하여 구현할 수 있습니다. 그림 18은 LabVIEW 프로젝트 탐색기에서 내장 블록 메모리에서 정수의 FIFO 버퍼를 구성하는 방법을 보여줍니다.
그림 20: LabVIEW FPGA의 DMA FIFO 구성
그림 21: LabVIEW FPGA 블록다이어그램 (DMA FIFO 및 비트 패킹 포함)
모든 DMA FIFO 전송은 32비트이므로, 16비트 아날로그 입력 채널에서 데이터를 전달할 때 샘플을 결합하고 한 번에 두 개의 채널, 즉 샘플을 전달하는 것이 더 효율적일 수 있습니다. 이는 그림 21과 같이 비트 패킹이라고 합니다. 데이터가 호스트 PC 메모리에 직접 전달되면, Windows 환경에서 실행되는 LabVIEW 호스트 인터페이스 함수를 사용하여 데이터를 읽을 수 있습니다(그림 22).
그림 22: DMA FIFO 읽기 및 비트 풀기와 함께 호스트 인터페이스 코드
그림 22과 같이 호스트 인터페이스 블록다이어그램은 FPGA 타겟 VI를 참조한 후 While 루프에서 계속해서 DMA FIFO를 읽습니다. 32비트 데이터는 샘플링된 두 개의 16비트 채널로 나누어 웨이브폼 차트에 플롯됩니다. 또한 호스트 인터페이스 VI는 FPGA VI의 모든 프런트패널 인디케이터 또는 컨트롤에 읽고 쓸 수 있으며, 이 경우에는 정지 버튼 컨트롤도 쓸 수 있습니다.
NI-STC3과 같은 고정된 ASIC는 대부분의 데이터 수집 요구사항을 충족하지만, R 시리즈의 재구성 가능한 FPGA 기반 I/O 타이밍 및 컨트롤을 사용하면 유연성과 사용자 정의가 완벽하게 가능합니다. LabVIEW FPGA를 사용하면 트리거링 및 동기화 작업이 블록다이어그램을 그래픽으로 그리는 것처럼 간단해지며, 독립적인 아날로그 및 디지털 I/O 라인을 통해 R 시리즈 보드는 FPGA가 제공하는 진정한 병렬 처리를 활용할 수 있습니다. 멀티레이트 샘플링, 사용자 정의 카운터 작업, 또는 40 MHz에서의 온보드 의사 결정과 상관없이, R 시리즈 디바이스는 다기능 데이터 수집의 가능성을 혁신적으로 만듭니다.