2012-10-26 3 views
0

VHDL 코드에 대한 질문이 있습니다. ADC의 연속 근사 레지스터를 작성하려고합니다.VHDL - 연속 근사 레지스터

아래 표시된 코드에서 DigitalOutTemp는 for 루프 전체에서 지속적으로 업데이트됩니까? 또는 프로세스 종료시 OutTemp 값만 수신합니까?

나는 논리가 잘못되었을 수도 있지만 내가하려고하는 것은 DigitalOutTemp를 디지털 변환기를 통해 수행 한 다음 측정중인 아날로그 신호와 비교기를 사용하는 것입니다. 그런 다음 비교기가 레지스터로 다시 피드 백합니다.  

LIBRARY ieee; 
USE  ieee.std_logic_1164.all; 

ENTITY SARegister IS 
PORT (
    Comparator, Clock      : IN std_logic; 
    DigitalOutFinal, DigitalOutTemp : OUT std_logic_vector (13 downto 0) 
); 
END; 

ARCHITECTURE Behavioural OF SARegister IS 
BEGIN 

PROCESS (CompIn, Clock) 
    VARIABLE OutTemp : std_logic_vector (13 downto 0); 
BEGIN 
    IF (rising_edge(Clock)) THEN 
     OutTemp := "10000000000000"; 

     FOR i IN 13 downto 0 LOOP 

      IF (Comparator = '0') THEN 
       OutTemp(i) := '0'; 
      END IF; 

      IF (i > 0) THEN 
       OutTemp(i - 1) := '1'; 
      END IF; 

      DigitalOutTemp <= OutTemp; 

     END LOOP; 

     DigitalOutFinal <= OutTemp; 

    END IF; 

END PROCESS; 
END; 

답변

0

변환에 대해 분명히 알지 못합니다. 코드가 너무 이상합니다. 그러나 나는 당신의 코드에서 무엇이 잘못되었는지 지적 할 것이다. 의견이 좁기 때문에 대답 2 ()가 아닙니다. 희망은 코드를 더 잘 만들어줍니다.

PROCESS (CompIn, Clock) 

이 민감한 목록 내가 코드에서 더 이상 CompIn 신호를 볼 수 없기 때문에 내가 모르는 뭔가가 발생할 수 있습니다. 당신이 레지스터의 원하는 경우, 클럭 게이팅 만 clock 또는 set 또는 reset 신호이 목록에있는 (또는 enable를 넣어주십시오.

VARIABLE OutTemp : std_logic_vector (13 downto 0); 
BEGIN 
    IF (rising_edge(Clock)) THEN 
    OutTemp := "10000000000000"; 

    FOR i IN 13 downto 0 LOOP 

     IF (Comparator = '0') THEN 
      OutTemp(i) := '0'; 
     END IF; 

     IF (i > 0) THEN 
      OutTemp(i - 1) := '1'; 
     END IF; 
초 먼저 덮어 쓰기 때문에 두 if 더 나은 결과를 이끌어하지 않습니다

. 나는 확인하십시오 이 (심지어 루프) 결국 1111..11를 얻을.

 DigitalOutTemp <= OutTemp; 

.이 루프이의 할당은 넣어 심지어 당신이 무한한 시간을 지정하지 제발,이 프로세스는 실행 시계의 rising_eadge.

0123를 가진
END LOOP; 

    DigitalOutFinal <= OutTemp; 

END IF; 
END PROCESS; 

CompIn이 누락되어 코드를 컴파일 할 수 없습니다. 심지어 CompIn을 추가하면 DigitalOut...은 항상 1111...1 (모두 1)입니다.

0

아래 코드에서 DigitalOutTemp는 for 루프 전체에서 을 계속 업데이트 할 예정입니까? 또는 프로세스 종료시 OutTemp 의 값만 수신합니까?

예약 된 새 값 을 얻을 것이다 신호를 DigitalOutTemp에 쓸 때마다를 업데이트 할 수 있습니다. 그러나 업데이트는 현재 델타주기가 끝날 때까지 (즉, 트리거 된 모든 프로세스가 완료된 후에) 발생하지 않습니다.

그 시점까지는 (동일한 프로세스 또는 다른 프로세스에서) 신호를 읽으면 동일한 (시작) 값을 읽을 수 있습니다.