IEEE Std 1076-2008, 10,10 Петля заявление:
Оператор цикла включает в себя последовательность операторов, которая должна быть выполнена повторно, ноль или более раз.
Это приводит к дублированию присвоения темпа как dieli указывает на его ответ.
process (enable)
begin
for i in 0 to 3 loop
temp <= temp + 1;
end loop;
end process;
Фактически имеет два дефекта. Вы заметили первый.
Первый Дефект
Первое, что нужно отметить, что вы выполняете последовательные задания последовательного сигнала к тому же сигналу с назначениями, расположенных в том же процессе. Каждый процесс имеет только один набор драйверов и выполнение процесса, пока он не будет приостановлен в одном и том же цикле моделирования. Приостановлено подразумеваемым утверждением ожидания в качестве последнего заявления, ожидающего списка чувствительности.
Эти назначения выполняются как последовательные итерации цикла, и поскольку для любого драйвера для одного конкретного времени моделирования имеется только одна запрограммированная волна, то на самом деле произойдет только последнее назначение сигнала. По сути, вы планируете обновление сигнала для каждого назначения сигнала, и их прогнозируемое значение перезаписывается следующим, пока не останется только последнее назначение сигнала.
Отсутствие передачи сигнала обновляет значение, пока какой-либо процесс все еще выполняется или находится в ожидании в текущем цикле моделирования.
Назначение сигнала с формой без элемента задержки приведет к дельта-циклу, и все ожидающие назначения сигнала для следующего времени моделирования в очереди будут обновляться после завершения текущего цикла моделирования и до начала выполнения цикла моделирования дельта , Также см. Этот ответ - The VHDL Simulation Cycle для просмотра большой картины того, что происходит во время цикла моделирования.
Описание в глубину легче читать в предыдущих версиях стандарта IEEE, см. IEEE Std 1076-2002/-2000/-1993, 12.6 Исполнение модели. Стандартное описание -2008 в 14.7, имеет читаемость, обремененную добавками к стандарту для VHPI и назначениям силы.
Существует несколько способов преодоления эффектов последовательной записи в сигнал в том же процессе и происходит во время выполнения одного и того же цикла моделирования.
Перед этим давайте обратимся ко второму дефекту.
Второй Дефект
Ваш список чувствительности содержит один элемент, enable
который инициирует выполнение оператора цикла. Это произойдет для любой транзакции на enable
, включая все четыре двоичные значения, представленные std_ulogic, а также метазначения. Это включает переход от '1' к '0', '0' к '1' или комбинацию с 'H' и 'L', которые обрабатываются идентично в синтезе.
Если вы хотите на основе счетчика защелки вы можете претендовать, что с определенным значением:
process (enable)
begin
if enable = '1' then
for i in 0 to 3 loop
temp <= temp + 1;
end loop;
end if;
end process;
Это вызвало бы заявление петли выполнить только тогда, когда enable
переход к «1».
Обычно мы не используем счетчики на защелках, так как вы можете заметить, что это край, вызванный только «включением» в списке чувствительности, и если вы должны были расширить список чувствительности для сигналов, не используемых в цикле, но в другом месте в процессе ваш аккумулятор temp
будет увеличиваться на другие события.
Обратите внимание, что вы не можете получить новое значение для temp
во время выполнения процесса, чтобы он только увеличивал один раз для каждой транзакции включения, как есть, даже с помощью оператора цикла. Вы фактически назначаете новое значение temp + 1
во время третьей итерации цикла i
. и когда выполняется выполнение процесса (как и любые другие активные в данный момент процессы), обновляется temp
.
Итак, как мы можем получить temp
приращений четыре раза?
Мы могли бы просто добавить 4 к нему. Это не дает нам общего решения.
Мы могли бы объявить переменный процесс, присвоить ему значение temp
, когда процесс выполняется, и назначить что temp
после выполнения оператора цикла:
process (enable)
variable ltemp: std_logic_vector(7 downto 0);
begin
ltemp := temp;
if enable = '1' then
for i in 0 to 3 loop
ltemp := ltemp + 1;
end loop;
temp <= ltemp;
end if;
end process;
Это не синтез-предварительно допущено в зависимости от инструмента синтеза, потому что синтез, как dieli примечания хочет рассматривать присвоения переменных как параллельные операции, в то время как мы будем рассчитывать на него, чтобы быть эквивалент:
ltemp := ltemp + 1 + 1 + 1 + 1;
Это требует более разумного синтеза инструмент, способный упорядочивать дополнения.
Страхование Синтез Приемлемость
Мы могли бы более прийти к этой проблеме, используя массив значений ltemp, что-то вроде этого: temp
был добавлен в список чувствительности, потому что
process (enable, temp)
type ltemp_array is array (0 to 3) of std_logic_vector(7 downto 0);
variable ltemp: ltemp_array;
begin
if enable = '1' then
for i in 0 to 3 loop
if i = 0 then
ltemp(i) := temp + 1;
else
ltemp(i) := ltemp(i-1) + 1;
end if;
end loop;
temp <= ltemp(3);
end if;
end process;
Примечание защелки прозрачны, а их разрешение - ИСТИНА.
Условие enable = '1'
не имеет формы \ данного в уже отозванных IEEE Std 1076.6-2004 для синтеза RTL в качестве события, чувствительного к краю (все из которых требуют второго условия в условии). Синтез инструменты по существу игнорировать список чувствительности, то есть мы зависим от правил с) 1076.6 6.2.1.1 Уровень чувствительного хранения от процесса со списком чувствительности:
Есть расстрелы процесса, которые не выполнить явное задание (через инструкцию присваивания) к сигналу (или переменной).
и следующее: список чувствительности
Процесс должен содержать все сигналы чтения в отчете процесса.
Который говорит нам, что temp
должно было быть в списке чувствительности все время, чтобы сделать синтез процесса подходящим. Кстати, также сделать первые две формы процесса, показанные в этом ответе, синтезом неприемлемыми.
Это также показывает третий дефект, когда намереваясь синтезировать процесс, что он имеет петлю обратной связи через temp
. Фактически вы заметили эффект добавления temp
в список чувствительности и вызвали бы обратную связь во время моделирования процесса, показанного выше. Вы либо столкнулись бы с пределом дельта-цикла, если он присутствует в вашем инструменте моделирования, или симулятор зависает или может зависеть от другого механизма, зависящего от реализации, для обнаружения недействительного моделирования.
И способ избавиться от этой обратной связи используется для чувствительных к краю часов.
И это также поднимает идею использования отдельных процессов (которые могут быть установлены путем говорят отдельные параллельные условные assigments сигналов к ltemp
элементов, продвигаемых на сигналы, когда мы не можем выполнить все дополнения в один тактовый цикл.