#vhdl
Вопрос:
При написании тестовых стендов есть ли какие-либо проблемы с написанием
wait for 1 ns ; wait until rising_edge( clock ) ;
каждый раз, когда я хочу дождаться следующего подъема?
Я бы хотел включить эту последовательность в процедуру, а затем всегда использовать ее.
Причина, по которой я хочу подождать 1 нс, заключается в том, что если у меня просто есть wait until
s и между двумя из них нет назначения сигнала, они свернутся в один.
Время тактового цикла составляет 10 нс, поэтому 1 нс не должно быть проблемой. Чего бы мне действительно хотелось, так это дождаться одной дельты, но я не знаю, как это сделать. Возможно ли это?
Есть ли скрытые подводные камни в этом подходе?
Мы используем VHDL 93 с симулятором ISIM.
Комментарии:
1.Обновления сигнала планируются в упорядоченной очереди (прогнозируемая форма выходного сигнала) с одной записью на любое время моделирования. Время моделирования увеличивается, когда на текущее время больше не запланировано обновлений (что вызывает дельта-цикл). Элемент формы сигнала назначения сигнала без выражения after time_expression эквивалентен значению после 0 нс (все 0 значений с единицей времени имеют одинаковое значение, единица времени должна быть пределом разрешения или больше. Вам не нужно первое ожидание, порядок возобновления процесса недетерминирован (или, по крайней мере, непереносим).
Ответ №1:
Тебе это не нужно wait for 1 ns
.
Один из способов дождаться 5 часов-это:
wait until rising_edge( clock ) ; wait until rising_edge( clock ) ; wait until rising_edge( clock ) ; wait until rising_edge( clock ) ; wait until rising_edge( clock ) ;
Одно упрощенное правило состоит в том, что оператор wait всегда приостанавливает процесс, по крайней мере, на цикл моделирования/дельта.
При использовании wait until
всегда существует подразумеваемый список чувствительности ( on
), в котором содержится каждый сигнал в until
предложении. Следовательно, вышесказанное эквивалентно:
wait on clock until rising_edge( clock ) ; wait on clock until rising_edge( clock ) ; wait on clock until rising_edge( clock ) ; wait on clock until rising_edge( clock ) ; wait on clock until rising_edge( clock ) ;
Возможно, эта более длинная форма немного более очевидна — когда часы меняются и rising_edge( часы ) истинен, оператор ожидания возобновится и перейдет к следующему оператору ожидания. Следующая инструкция wait приостанавливается до тех пор, пока не произойдет изменение времени.
Комментарии:
1. Большое спасибо. Кажется, я что-то неправильно понял. Могу ли я также подождать 5 часов в цикле for:
for i in 1 to 5 loop wait until rising_edge( clock ); end loop;
?2. Да, цикл будет ждать 5 циклов. (Вы можете поместить его в подпрограмму и использовать несколько раз)
Ответ №2:
Твое wait for 1 ns
бесполезно. С ним или без него ничего не изменится, пока тактовый период превышает 1 нс, и вы выполняете это более чем за 1 нс до следующего возрастающего интервала времени. Чтобы дождаться нескольких восходящих краев часов, вы можете определить процедуру в декларативной области вашей архитектуры:
procedure waitNre(n: positive) is begin for i in 1 to n loop wait until rising_edge(clk); end loop; end procedure waitNre;
И затем:
waitNre(5);
дождаться 5 восходящих краев clk
. Если вы хотите поделиться этим между проектами, поместите объявление/определение процедуры в пакет и добавьте тактовый сигнал на входы процедуры:
procedure waitNre(signal clock: std_ulogic; n: positive) is begin for i in 1 to n loop wait until rising_edge(clock); end loop; end procedure waitNre;
И затем:
waitNre(MyClk, 5);