2015-01-27 2 views
0

하나의 프로세스에서 3 개의 클록을 사용할 때 문제가 발생했습니다. HC1, HC2가 동시에 작동 할 수 있으며 H, H보다 훨씬 느립니다. 16MHZ에서 작동하는 기본 시계입니다.VHDL 복수 시계로 하나의 신호 수정

entity fifo is 
    Port (H : in STD_LOGIC; 
      HC1 : in STD_LOGIC; 
      HC2 : in STD_LOGIC; 
      C1data : in STD_LOGIC_VECTOR (2 downto 0); 
      C2data : in STD_LOGIC_VECTOR (2 downto 0); 
      Buffer1 : out STD_LOGIC_VECTOR (3 downto 0); 
      Buffer2 : out STD_LOGIC_VECTOR (3 downto 0)); 
end fifo; 

architecture Behavioral of fifo is 
    signal Full1,Full2 : STD_LOGIC; 
begin 
process(H,HC1,HC2) 
begin 
    if(rising_edge(H)) then 
     Full1 <= '0'; 
     Full2 <= '0'; 
    else 
     if(rising_edge(HC1)) then 
      Buffer1(3 downto 1) <= C1data; 
      Buffer1(0) <= C1data(2) xor C1data(1) xor C1data(0); 
      Full1 <= '1'; 
     end if; 

     if(rising_edge(HC2)) then 
      Buffer2(3 downto 1) <= C2data; 
      Buffer2(0) <= C2data(2) xor C2data(1) xor C2data(0); 
      Full2 <= '1'; 
     end if; 
    end if; 

최종 처리;

하고 말한다
ERROR : XST : 827 - "C : /Users/Administrator/Desktop/test/justatest/fifo.vhd"라인 45 : 신호 Buffer1 < 0> 나쁜 동기 설명을 합성 할 수 없다. 동기 요소 (레지스터, 메모리 등)를 설명하는 데 사용하는 설명 스타일은 현재 소프트웨어 릴리스에서 지원되지 않습니다.

왜? 많은 감사합니다!

+0

음, 먼저 코드를 해독 할 수 있도록 질문 레이아웃을 수정 해주십시오. : D –

+1

당신이 필요로하는 것은 단일 클럭과 다중 "로드"신호 등입니다. 나는 또한 이것을 먼저 시뮬레이트하여 당신이 의도 한대로 작동하는지, 합성 코드가 나쁜지 여부를 확인하는 것을 추천한다. – fru1tbat

+1

XST 사용자 가이드 (예 : UG627 v 14.5)를 살펴보면 한 클럭 및 elsif가있는 if 문은 VHDL 순차 회로, VHDL 순차 처리 감도 목록. – user1155120

답변

2

유효한 VHDL 중 일부는 합성 할 수 없습니다. 합성 가능한 것으로 간주되는 것은 도구와 대상 아키텍처에 따라 다릅니다. 자일링스 하드웨어 아키텍처는 (게이트 된 클럭에 의지하지 않고) 코드에 의해 기술 된 로직을 표현할 방법이 없다. 신시사이저는 언어의 하위 세트 만 지원하며 특정 "세트"템플릿을 사용하여 하드웨어 기본 요소를 설명 할 것을 기대합니다. 현대의 도구는 높은 수준의 설명을 받아 들일 수 있을지에 대해 더 용서하고 있지만 수행 할 수있는 것에는 한계가 있습니다.

디지털 논리 합성 도구는 지원할 회로 유형에 대해 특정 가정을합니다. 회로 설명은 rising_edge() 기능을 동일한 프로세스에서 세 가지 다른 신호에 적용합니다. 이와 같은 복잡한 클러킹 장치는 일반적으로 지원되지 않습니다. 통상적 인 회로는 단일 클럭 에지에 의해 활성화 된 고립 된 클록 도메인으로 구성된다. 귀하의 예제와 같이 비정형 코드에 맞게 게이 티드 클럭을 자동으로 생성하지는 않습니다. 이는 타이밍 제약 및 정적 타이밍 분석으로는 감지되지 않을 수도있는 회로에 잠재적 인 위험을 초래하기 때문입니다.

FPGA의 경우 클러킹 구조가 구워지고 입력 설명을 무시할 정도로 변경 될 수 없습니다. 게이팅 될 로직 패브릭에 클럭을 공급하면 신시사이저의 기본 기대치를 상쇄시킬 수 있으므로 가능하면 최대한 피할 수 있습니다.

HC1HC2이 실제로 제어 신호이고 시계가 아닌 경우 rising_edge() 함수를 사용하여 해당 상태의 변화를 감지하면 안됩니다. 대신 공통 시계 H에 의해 등록 된 지연된 버전을 만들어야합니다. '0'에서 '1'로의 변경은 HC1 = '1' and HC1_prev = '0'이라는 식으로 감지됩니다.

최상위 레벨 if의 조건은 동기 논리를 설명하는 XST에 대한 기대치를 따르지 않으므로 XST에서 지원되지 않습니다. 대신 else을 제거하고 Full1Full2의 초기화를 별도의 재설정/삭제 섹션으로 이동해야합니다. 이것은 동 기적 또는 비동기 적으로 수행 할 수 있습니다. 이를 수행하는 방법에 대한 예제는 XST 합성 가이드를 참조하십시오.

+0

귀하의 답변에 감사드립니다. 내가하고 싶은 일은 rising_edge (H), HC1과 HC2가 H에서 비동기적일 때 buffer1과 flag2를 0으로 변경하고 rising_edge (HC1) 또는 rising_edge (HC2)가 플래그를 변경시킬 때 데이터를 읽는 것입니다. 1로 설정하고 버퍼에 데이터를 씁니다. –

+0

HC1과 HC2가 H보다 현저히 느린 경우 정상적인 방법은 한 쌍의 플립 플롭을 통과시켜 이들을 동기화하는 것입니다. 그런 다음 혼합 영역의 가장자리 민감도를 포함 할 필요없이 변경 사항을 감지 할 수 있습니다. 신디사이저는 완전히 동기식 시스템을 기대하는 기반 위에 구축되어 있으므로 실제로이 작업을 수행해야합니다. 2 + 1 사이클 지연을 용인 할 수 없다면, 프리미티브를 사용하여 필요한 로직을주의 깊게 구성해야합니다. –

관련 문제