дождитесь неустановленного сигнала в тестовой среде VHDL

Я написал процесс моделирования, который устанавливает или изменяет сигналы последовательно по мере необходимости, я обычно использую операторы ожидания для ожидания определенных временных интервалов или ожидания назначения сигналов, но это верно только тогда, когда я знаю, когда должен прийти сигнал, например:

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

но теперь мне нужно сделать что-то другое, у меня есть сигнал, который обычно равен 0, и мне нужно приостанавливать стимул моделирования всякий раз, когда он переключается на 1. Однако сигнал не рассчитан по времени. это означает, что я не могу сделать это с помощью простого оператора ожидания, потому что симуляция будет ждать его только в определенное время. Я хочу, чтобы этот эффект происходил постоянно. как сделать что-то подобное?


person mewais    schedule 15.05.2014    source источник
comment
Боюсь, я не понимаю, что вы хотите делать. Что означает, что сигнал не рассчитан по времени?   -  person Owen    schedule 16.05.2014
comment
@ При нормальной работе вы ждете сигнала через определенное время или другое изменение сигнала. например, дождитесь прерывания после того, как вы дадите своему ядру выполнить некоторую операцию. но мой случай не рассчитан. Я не знаю, когда мой сигнал может быть установлен на 1. это может произойти в любой момент.   -  person mewais    schedule 16.05.2014
comment
Так что же произойдет, если вы ждете (например, wait for 25ns), когда другой сигнал станет высоким? Ожидание 25нс приостанавливается, сбрасывается? это вообще не происходит? Что делают другие сигналы? Меняется ли их ценность? Держись?   -  person Josh    schedule 16.05.2014


Ответы (4)


Основываясь на описании, я понимаю, что вы хотите приостановить генерацию стимулов на основе сигнала, поэтому время стимула увеличивается в соответствии со временем паузы.

Для этого может быть создан сигнал с активным временем (обозначенный ниже active_time), а затем на основе этого времени могут быть сгенерированы стимулы. Активное время работает только тогда, когда active_stimuli имеет значение ИСТИНА.

Затем может быть создана процедура поддержки (названная active_wait_for ниже), соответствующая wait for, для ожидания запрошенного количества активного времени для использования в процессе генерации стимулов.

Предложение для кода:

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;
...

Форма волны, показывающая работу, приведена ниже:

введите описание изображения здесь

Обратите внимание, что полярность отличается от сигнала в вопросе, но с этой полярностью наименование было более четким.

person Morten Zilmer    schedule 16.05.2014

Некоторые идеи для «приостановки» процесса стимула на сигнале прерывания:

  1. Перепишите стимул как синхронизированный процесс (например, конечный автомат) и используйте прерывание в качестве разрешения синхронизации. Хотя это может быть болезненно.

  2. Может быть, проще, когда вы ждете, ждите что-то вроде этого:

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

    или если это не синхронное ожидание:

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

    Вы, конечно, можете написать процедуру, которая упростит это. Могут быть более простые / элегантные способы их кодирования, но то, что я написал, должно работать.

person fru1tbat    schedule 16.05.2014

Это то, что вы хотите:

process (start) begin
    if rising_edge(start) then
        -- Respond to start signal rising
    end if;
end process;
person Owen    schedule 15.05.2014

Ничто не мешает вам написать еще один процесс в вашем тестовом стенде / симуляторе, чтобы дождаться выполнения этого другого условия. Пример того, когда вы можете захотеть это сделать, - это когда вы просто подсчитываете количество событий определенного состояния.

Например:

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

Поскольку этот процесс полностью независим от вашего «стимулирующего» раздела кода, он всегда готов к пробуждению и обработке. В этом случае он будет просыпаться при изменении прерывания сигнала.

Будьте осторожны, если вы управляете стимулирующими сигналами от отдельного процесса, потому что у вас не может быть двух процессов, управляющих одним и тем же сигналом. Если вам нужна обратная связь для вашего основного процесса управления, вы можете сделать это с помощью сигнала или общей переменной.

person Josh    schedule 15.05.2014
comment
Мне не нужно добавлять что-то, когда прерывание переходит в 1. Мне нужно приостановить процесс стимула, когда прерывание равно 1, пока оно не вернется к 0. Я понимаю, как использовать два процесса, но я не понимаю, как Я могу использовать его, чтобы приостановить процесс стимулирования. - person mewais; 16.05.2014
comment
@ProWi Как насчет того, чтобы добавить в свой вопрос то, что вы действительно хотите, вместо того, чтобы заставлять нас гадать? - person Josh; 16.05.2014