2013-05-15 4 views
1
Data_Out_SDa : process (SCl, IntReset) is 
     variable IntSDa : std_logic;  -- Internal Sda 
     begin -- process Data_Out_SDa 
     if IntReset = '0' then    -- asynchronous reset (active high) 
      IntSDa := 'Z'; 
     elsif SCl'event and SCl = '0' then -- falling clock edge 
       IntSDa := DataBuffer(to_integer(unsigned(AddrReg))); 
     end if; 
     SDa <= IntSDa; 
    end process Data_Out_SDa; 

DataBuffer는 121 비트 상수 std_logic_vector입니다. Sda는 출력 포트입니다Synplify는 to_integer를 사용하여 상수 배열에 액세스 할 때 내 레지스터를 정리합니다. (VHDL)

코드가 잘 합성됩니다. 하지만 경고가 발생합니다 (Int16a) 레지스터 IntSda 레지스터 (CL169) 및 경고 레지스터 레지스터 비트 IntSda를 상수 0 (Cl190)으로 변경

어떤 이유인지 합성 도구는 IntSda가 항상 0이 될 것이라고 해석합니다. 참고 IntReset은 입력입니다 . AddrReg는 SC1의 상승 클록 에지에서 값을 변경하는 카운터의 출력입니다. 카운터는 잘 합성되며 FPGA에서 테스트하고 로직 분석기를 사용하여 출력을 보았습니다. 왜 이런 일이 일어나고 있는지에 대한 손실이 있습니다. 나는 보존 물을 둘 수 있었지만 근본 원인을 이해하기위한 간격을 줄이거 나 교체하지 않았다고 생각합니다.

+1

정보가 충분하지 않음을. DataBuffer가 항상 0이면 IntSDa도됩니다. 이 문제의 원인은 코드의 완전히 다른 부분에있을 수 있습니다. – Philippe

+0

DataBuffer는 'Z'와 '0'으로 구성된 상수 121 비트 std_logic_vector입니다. 코드 형식 때문에 거기에 넣지 않았습니다. 상수 DataBuffer : std_logic_vector (0에서 n-1) : = ... 또한 Sda는 출력 포트입니다. – Mayank

+1

'Z'값은 3 가지 상태 로직 (조합)에서만 허용됩니다. 아시다시피, 당신은 등록하려고합니다 : -?. 나는 불가능하다고 생각한다. – Khanh

답변

1

당신은 그런 식으로 Zs를 얻으려고 투쟁 할 것입니다. 신디사이저는 아마 '로 치료 0의 나는이 같은 과정을 외부 SDa를 구동 한 후 DataBuffer 배열의 1과 0을 사용하고 제안 :

:

SDa <= '0' when IntSDa = '0' else 'Z'; 
+0

감사합니다. 그거였다. FPGA가 하이 임피던스 상태를 저장하는 방법을 어떻게 알 수 있을까요? – Mayank

+0

@Mayank : 환영합니다. 스택 오버플로 - 도움이되는 답변을 찾은 경우 upvote를 입력하고 답변이 완전한 경우 "눈금"아이콘을 사용하여 "답변 함"으로 표시하십시오. –

+0

나는 분명히 당신을 투표하는 데 충분한 명성이 없다. 하지만 정보 주셔서 감사합니다. – Mayank