Single Cycle Timed Loops를 사용할때 로컬 변수가 오동작합니다.



주요한 소프트웨어:
주요한 소프트웨어 버전: 8.0
문제가 해결된 소프트웨어 버전: N/A
부차적인 소프트웨어: N/A

문제점: LabVIEW FPGA에서 로컬 변수로 읽거나 쓰기를 할때, 가끔 읽기 쓰기가 일치하지 않는 동작을 하는 것이 보입니다. 왜 이런일이 일어납니까?

솔루션: LabVIEW FPGA 모듈을 사용할 때, 로컬 변수를 사용할 때는 주의를 기울여야 합니다. 윈도우에서 사용하는 LabVIEW VI와는 다르게, 로컬 변수는 LabVIEW FPGA에서 사용할때, 즉 다른 클럭 도메인을 가지고 있는 SCTL에서 다르게 동작합니다.

아래의 스크린 샷은 로컬 변수를 이용하여 여러개의 클럭 도메인으로 데이터를 전송할때 일반적으로 저지를 수 있는 실수에 대해서 보여주고 있습니다. 윈도우 기반의 VI에서 로컬변수는 낮은 루프 속도로 데이터를 읽으며 이는 언제나 다른 동작과 싱크가 됩니다. 왜냐하면 소프트웨어 데이터 흐름에서 로컬변수로 읽는 것은 낮은 속도로 인해 마지막으로 업데이트 된 값만 읽어오기 때문입니다. 그렇지만 LabVIEW FPGA에서는 하드웨어 데이터 흐름을 통한 Handshaking 논리안에서 구현됩니다. Handshaking 은 코드에 추가적인 로직을 만들고 데이터가 남아 있을때 다른 동작을 하게 됩니다. 예를 들어, 2개의 입력이 있는 곱셈 동작의 경우 곱셈 루틴이 실행되기 전에 반드시 현재 데이터가 존재 해야 합니다. 하드웨어 Handshaking은 두개의 입력이 반드시 존재할 때 곱셈을 수행할수가 있습니다.



위 예제에서 볼수있는 하드웨어 Handshaking의 결과중 하나는 추가적인 로직에 의한 속도 딜레이 입니다. 위의 VI를 보시면 Handshaking 로직이 각각의 변수에 연결이 되어 있고, 실행하는데 1번 이상의 사이클이 필요하기 때문에 문제가 발생할 수 있습니다. 이는 이전 데이터가 늦은 속도의 와일 루프에서 읽혀져, 쓰기 동작에 딜레이를 생성합니다. 이 문제를 줄이기 위해서는 루프간의 데이터 전달을 위해서 로컬 변수 대신 FIFO를 쓴 것입니다.

발생할 수 있는 다른 이슈는 숫자형과 불리언 변수 서로가 동기화가 되지 않아 발생할 수 있습니다. 여기에서는 불리언과 숫자형 로컬 변수가 동기화 된다는 어떠한 로직도 존재 하지 않습니다. 이를 구현하기 위해 숫자와 불리언 값을 클러스터로 묶어서 로컬 변수로 보냅니다.



같은 클럭 도메인에서 동작할때, 동기화 이슈는 발생하지 않습니다. 그렇기 때문에 만약 두개의 루프가  위의 루프터럼 10MHz의 타이밍 소스를 사용한다면, 동기화 이슈는 발생하지 않게 될 것입니다.

관련 링크:
KnowledgeBase 3F3DH0NR: How do Sequence Structures Behave in a LabVIEW FPGA Single Cycle Timed Loop (SCTL)?


첨부:


multiple_clock_domains.jpg - multiple_clock_domains.jpg
multiple_clock_domains_fix.jpg - multiple_clock_domains_fix.jpg



리포트 날짜: 12/08/2005
마지막 업데이트: 02/19/2015
문서 번호: 3KBGM683