2017-02-20 12 views
0

내 자신의 연구를 통해 프로세스 내에서 신호를 할당하면 프로세스 후에 신호가 업데이트된다는 것을 이해합니다. 이제 우리가 출력에 값을 직접 할당하면 프로세스 후에 업데이트 될 것인가? 나는 두 가지 버전을 간단한 예로서 첨부하여 의미를 설명합니다.프로세스 내부의 신호 할당과 실제 출력을 할당하는 것의 차이점

버전 1 :

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of testing is 

signal temp: std_logic; 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      temp <= '1' 

     end if; 

    end if; 

end process; 

c <= temp; 

end arch; 

이제 다른 버전 :

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of Intermediate is 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      C <= '1'; 

     end if; 

    end if; 

end process; 

end arch; 

는 타이밍 차이가 있나요? 첫 번째 버전에 비해 두 번째 버전에서 C가 더 빨리 나타 납니까?

답변

0

C은 두 번째 예에서 (약간) 이전에 할당됩니다. 또한 두 번째 예제에는 중간 레지스터 (temp)가 없기 때문에 더 적은 리소스가 사용됩니다. 첫 번째 예에서

temp 클럭의 하강 에지에 할당되며, C는 동시 할당 (즉. 즉시 temp 변경, C 변경 등). 그러나 실제적으로이 할당은 신호 전파로 인해 temp이 변경된 후에 "약간의 시간"이 발생합니다.

두 번째 예에서는 내림 시계 가장자리에서 발생하는 C에 직접 지정합니다.

은 당신이 제공 한 예는 다소 인위적인 알고,하지만 당신은 함께 같은 얻을 수 :

process(clk) 
begin 
    if rising_edge(clk) then 
     c <= a and b; 
    end if; 
end process; 
0

시뮬레이션 사이클은 대기에 의해 중단 될 때까지 각을 실행하는 모든 프로세스를 다시 시작합니다. 현재 시간에 대한 이벤트가 발생하면 델타 사이클이 발생하고, 그렇지 않으면 시뮬레이션 시간이 다음 예정된 이벤트로 넘어갑니다. 시뮬레이션 사이클은 이벤트가 종료되거나 중지 될 때까지 계속됩니다.

동시 실행에는 정교한 프로세스 또는 블록과 프로세스가 있습니다. 정교한 디자인 계층은 신호 이벤트를 통해 통신하는 프로세스 모음입니다.

c은 지연이없는 연속 신호 할당 때문에 첫 번째 예제에서 한 델타 사이클 후에 발생할 수 있습니다. 델타 사이클은 simulation time을 소비하지 않으며, 순차 진술에 대한 동시성과 유사합니다.

버전 1은 동시 신호 할당 명령문의 두 번째 프로세스가 있으며 모델에 더 많은 실행 시간을 나타내며 더 많은 자원을 사용하는 추가 신호를 사용합니다. 버전 1은 그 자체로 큰 부담을 나타내지 않습니다. 많은 수의 프로세스 또는 많은 수의 이벤트에서 모델 실행 시간과 메모리 사용량의 차이를 측정 할 수 있습니다.

일반적으로 중개 신호은 신호 값이 포트 구동 외에도 평가되는 곳입니다. 모드 인터페이스 신호의 값을 읽을 수 없습니다. (설계 단위는 독립적으로 분석되고, 실측 값의 실제 위치는 해석 시점에서 알 수 없으며, 포트는 포트 연관의 공식을 나타냄)

IEEE 표준 1076-2008 참조, 11. 동시 진술 10.5.2 간단한 신호 할당 문; 10.2 기다리는 성명서; 14. 정교화 및 집행; 특히 14.5 진술 부분 정교화 및 14.5.5 기타 동시 진술; 14.7 모델 실행, 특히 14.7.5 모델 실행; 6.5.2 인터페이스 객체 선언; 6.5.7.3 포트 맵 측면. 14.3.5 포트 맵 측면.

1

먼저 다음은 아주 정확하지 않습니다,하지만 대부분의 RTL 프로세스에 대한 올바른 :

프로세스 내부의 신호가

실제 규칙을 완료 과정이 끝날 때까지 업데이트되지 않습니다 is :

신호가 다음 델타주기까지 업데이트되지 않습니다.

WRT 프로세스는 프로세스가 대기 상태에서 일시 중단되거나 감도 목록에서 종료되고 일시 중단되지 않으면 프로세스가 델타 사이클을 통과하도록 허용하지 않습니다. 대부분의 RTL 프로세스에는 감도 목록이 있거나 맨 위에 하나의 wait 문만 있습니다. 따라서 RTL 코드의 경우 "매우 진실이 아닙니다"라는 메시지가 나타납니다. C로 할당에

WRT는 :

c <= temp; 

여전히 과제의 델타 사이클이있다. 도움이된다면, 언어는 다음과 같은 변화를 통해 동시 과제의 실행을 정의

process (temp) is 
begin 
    c <= temp; 
end process ; 

이 당신이 WRT에게 간단한 RTL 규칙을 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다.