2012-09-27 3 views
2

두 개의 프로세스 A와 B가 있고 각 프로세스에는 자체 클럭 입력이 있습니다.스파르탄 3의 프로세스 간 데이터 이동

클럭 주파수는 약간 다르므로 동기화되지 않습니다.

프로세스 A는 IC에서 데이터를 샘플링하고이 데이터를 프로세스 B로 전달해야하며이 데이터는 프로세스 B로 전달되어야하며이 데이터는 다른 IC에 기록해야한다.

현재 솔루션에서 프로세스 A와 B 사이의 간단한 핸드 셰이크 신호를 사용하고 있습니다. 프로세스 A (블록 메모리가 아님) 내부에 메모리가 분산 RAM (128 바이트의 std_logic_vector (7 downto 0))으로 선언되었습니다.

저는 자일링스의 스파르탄 3AN과 ISE 웹팩을 사용하고 있습니다.

하지만 올바른 방법인가요?

나는 2 개의 클록을 지원하는 듀얼 포트 블록 메모리가있는 Spartan 3을 읽었으므로 이것이 더 정확한가?

내가 묻는 이유는 내 디자인이 예측할 수 없기 때문이며,이 경우 나는 마술을 싫어하기 때문입니다. :-)

답변

5

아주 특별한 예외적 인 경우를 제외하고 두 개의 독립적 인 클럭 도메인간에 데이터를 이동하는 유일한 방법은 비동기 FIFO (더 정확하게는 멀티 레이트 FIFO라고 함)를 사용하는 것입니다.

거의 모든 FPGA (사용중인 Xilinx 부품 포함)에서 공급 업체가 만든 FIFO를 사용할 수 있습니다. 자일링스의 경우 CoreGen 도구를 사용하여 FIFO를 생성하면됩니다.

듀얼 포트 RAM과 적절한 핸드 쉐이킹 로직을 사용하여 직접 이러한 FIFO를 구성 할 수도 있지만, 대부분의 경우와 마찬가지로 이렇게해야 할 필요가없는 한 스스로 재발견해야하는 것은 아닙니다 .

디자인 이 실제로에 여러 개의 클럭 도메인이 필요한지 여부를 고려할 수도 있습니다. 때로는 절대적으로 필요한 것이지만 그 정도면 충분합니다. MUCH 처음 시작하는 대부분의 사람들은 믿기지 않습니다. 예를 들어 여러 속도로 실행되는 논리가 필요한 경우에도 단일 클록 및 적절하게 생성 된 동기 클럭 인 에이블을 사용하여이를 종종 처리 할 수 ​​있습니다.

1

당신이 겪고있는 마법은 디자인에서 합성을 올바르게 제한하지 않았거나 핸드 쉐이킹을 제대로하지 않았기 때문에 발생했을 것입니다.

  1. FIFO

사용, 매우 일반적인 솔루션입니다 (제대로 경우)과 자원의 측면에서 거대한 항상 작동 WJL에 의해 명시된 바와 같이 멀티 레이트 FIFO : 당신은 두 가지 옵션이 있습니다. 이 솔루션의 가장 큰 장점은 실제 클록 도메인 교차 문제에 신경 쓸 필요가 없으며 두 도메인간에 최대 대역폭을 확보 할 수 있다는 것입니다.작동하지 않기 때문에 비동기 FIFO를 VHDL에 구축하지 마십시오. VHDL에서도 당신이 단순히 제대로 할 수없는 것들이 있습니다. 자일링스에서 해당 발전기를 사용, 나는 그것을하지 않습니다,

는 두 도메인의 데이터에 대해 적어도 두 개의 레지스터를 가지고 논리를 핸드 인정/완벽한 요청을 구축 CoreGen

  1. 핸드 쉐이킹 먹으 렴 생각 당신이 그들을 포함하지 않으면 제대로 작동합니다. 준 안정성 문제로 인해 예기치 않은 동작이 발생할 가능성이 높으므로 수신 도메인에서 핸드 셰이 킹 신호에 대해 두 개 이상의 레지스터를 추가하여 핸드 셰이크 논리가 올바르게 동기화되었는지 확인하십시오. 클럭 도메인에서 플래그의 설정 "유효/ACK를"점점

+0

VHDL을 사용하면 (클럭 도메인을 통과하는 신호 사이의 스큐를 제한하는 타이밍 제약 조건과 함께) 올바른 비동기 FIFO를 완벽하게 구성 할 수 있습니다. –

1

, 당신은 FIFO는 듀얼 시계를 사용하여, the Flancterhere's an application of it

에서 그러나 일반적인 경우에보고 할 수 순서 외 그 날. 자신 만의 글쓰기는 흥미로운 일이지만, 모든 잠재적 인 클럭 타이밍에 대해 검증하는 것은 악몽입니다. 이것은 Coregen 블록을 인스턴스화하는 몇 안되는 장소 중 하나입니다.

+0

대단히 감사합니다. :-) – JakobJ