2014-05-15 5 views
1

필자는 필요에 따라 신호를 순차적으로 설정하거나 변경하는 시뮬레이션 프로세스를 작성했습니다. 일반적으로 wait 문을 사용하여 특정 시간 간격을 기다리거나 신호 할당을 기다렸지 만, 신호가, 예를 들어 오는시기 :VHDL 테스트 벤치에서 untimed 신호를 기다립니다.

reset  <= '1'; 
    write  <= '0'; 
    read  <= '0'; 
    wait for 25 ns; 
    reset  <= '0'; 
    chipselect <= '1'; 
    wait until clk = '1'; 

을하지만 지금은 다른 일을 할 필요가, 나는 일반적으로 0 인 신호가 있고, 나는 그것이 1.로 전환 될 때마다 시뮬레이션 자극을 일시 중지해야 신호는 시간 초과되지 않습니다. 이는 시뮬레이션이 특정 시간에만 기다릴 것이기 때문에 간단한 wait 문으로 처리 할 수 ​​없다는 것을 의미합니다. 그 효과가 항상 발생하기를 바랍니다. 이런 식으로하는 방법?

+0

나는 그것이 당신이하고 싶은 것을 보지 못한다. 신호가 시간 초과되지 않았다는 것은 무엇을 의미합니까? – Owen

+0

@ 정상적인 작동 상태에서 특정 시간 또는 신호 변경 후 신호를 기다립니다. 예를 들어, 일부 작업을 수행하기 위해 코어를 실행 한 후 인터럽트를 기다리는 경우와 같습니다. 그러나 나의 경우는 시간이 맞추어지지 않았다. 내 신호가 언제 1로 설정 될지 모르겠습니다. 언제든지 발생할 수 있습니다. – ProWi

+0

그럼 다른 신호가 올라갈 때 기다리는 중이라면 (예 : 'wait for 25ns') 어떻게됩니까? 25ns 대기가 일시 중지 되었습니까? 초기화됩니까? 전혀 영향을 미치지 않습니까? 다른 신호는 무엇을합니까? 그들의 가치는 변합니까? 개최됩니까? – Josh

답변

2

는 설명을 바탕으로, 난 당신이 신호에 따라 자극 세대를 일시 정지 할 것을 이해, 그래서 자극 시간은 일시 정지의 시간에 대응 연장됩니다.

활성 시간 (아래의 이름은 active_time)은 일 수 있으며이 시간을 기준으로 자극을 생성 할 수 있습니다. 활성 시간 은 active_stimuli이 TRUE 일 때만 실행됩니다.wait for 대응 (이하라는 active_wait_for)

지원 방법이어서 자극 생성 처리에 사용하기위한 활성 시간의 요청 량을 기다릴 생성 될 수있다. 코드

제안 : 극성이 문제의 신호와 다른 것을

enter image description here

있는데, 이는 극성 명확했다 네이밍 :

architecture syn of tb is 

    -- Active declarations 
    signal active_stimuli : boolean := TRUE; 
    constant ACTIVE_RESOLUTION : time := 1 ps; 
    signal active_time  : time := 0 ps; 

    -- Wait procedure for active delay 
    procedure active_wait_for(delay : time) is 
    variable active_time_start_v : time; 
    begin 
    active_time_start_v := active_time; 
    if delay > 0 ps then 
     wait until active_time >= active_time_start_v + delay; 
    end if; 
    end procedure; 

    -- Stimuli signal 
    signal stimuli_a : std_logic; 
    signal stimuli_b : std_logic; 

begin 

    -- Active time generation 
    process is 
    begin 
    wait for ACTIVE_RESOLUTION; 
    if active_stimuli then 
     active_time <= active_time + ACTIVE_RESOLUTION; 
    else -- Save execution time in loop by wait until 
     wait until active_stimuli; 
    end if; 
    end process; 

    -- Stimuli generation 
    process is 
    begin 
    stimuli_a <= '0'; 
    stimuli_b <= '0'; 
    wait until active_time >= 2 ns; 
    stimuli_a <= '1'; 
    active_wait_for(3 ns); 
    stimuli_b <= '1'; 
    wait; 
    end process; 
... 

파형 나타내는 동작은 아래와 같다 .

0

당신이 원하는 이것이다 : 다른 조건이 일어날 때까지 기다려야하기 위해 테스트 벤치/시뮬레이션에서 다른 프로세스를 작성에서 중지 아무것도

process (start) begin 
    if rising_edge(start) then 
     -- Respond to start signal rising 
    end if; 
end process; 
0

없습니다. 예를 들어 특정 조건의 이벤트 수를 계산하는 경우가 이에 해당됩니다. 예를 들어

:

Signal_Waiter : process(interrupt) 
begin 
    if rising_edge(interrupt) then 
     -- do stuff here such as increment a counter 
    end if; 
end process; 

이 과정 코드의 당신의 "자극"섹션에서 완전히 독립적이기 때문에, 항상 웨이크 업하고 처리 할 준비가되어 있습니다. 이 경우 신호 인터럽트가 변경 될 때마다 깨어납니다.

동일한 신호를 구동하는 두 개의 프로세스를 가질 수 없으므로 별도의 프로세스에서 자극 신호를 보내는 경우주의하십시오. 주 제어 프로세스에 대한 피드백이 필요하면 신호 또는 공유 변수를 사용하여이를 수행 할 수 있습니다.

+0

인터럽트가 1로 바뀔 때 물건을 추가 할 필요가 없습니다. 인터럽트가 1 일 때 자극 처리가 일시 중지되면 다시 0으로 되돌아갑니다. 두 프로세스를 사용하는 것에 대한 아이디어는 얻을 수 있지만, 내가 그것을 자극 과정을 일시 중지하는 데 어떻게 사용할 수 있는지보십시오. – ProWi

+0

@ProWi 당신이 우리를 추측하지 않고 정말로 원하는 것으로 업데이트하는 것은 어떻습니까? – Josh

1

인터럽트 형 신호 자극 과정을 "일시 정지"의 아이디어 : 시계로 인터럽트

  1. (예를 들어, 상태 머신) 클록 프로세스로 자극을 다시 작성하고 사용 가능 . 그래도 통증이있을 수 있습니다. 당신은 물론, 수 있도록 절차를 쓸 수

    wait for 100 ns; 
    if interrupt = '1' then 
        wait until interrupt = '0'; 
    end if; 
    

    : 그것은 동기 대기 아니라면

    wait until clk = '1'; 
    if interrupt = '1' then 
        wait until interrupt = '0'; 
        wait until clk = '1'; 
    end if; 
    

    나 : 당신이 기다릴 때마다 이런 일을 기다려야

  2. 어쩌면 더 쉽게, 이것들은 더 쉽다. 코드를 작성하는 데 더 단순하고 세련된 방법이있을 수 있지만 필자가 작성한 것은 효과가있다.