В VHDL как лучше всего дождаться переднего края часов на испытательном стенде

#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);