2015-03-20 2 views
1

Я пробовал имитировать цикл for в ModelSim, но он не работает должным образом. Я знаю, что он не может синтезироваться, но я не знаю, почему он не правильно имитирует.Почему в VHDL for-loop не работает?

При моделировании он не показывает никаких ошибок. Но конечный результат - «00000001» (т.е. увеличивается только один раз) вместо ожидаемого выхода «00000011».

library ieee; 
use ieee.std_logic_1164.all; 
use IEEE.STD_LOGIC_unsigned.ALL; 

entity forloop is 
port( enable  : in std_logic;   
    data_out  : out std_logic_vector(7 downto 0)); 
end forloop; 

architecture behaviour of forloop is 

signal temp  : std_logic_vector(7 downto 0) := "00000000"; 

begin 

process(enable)   
begin 

    for i in 0 to 3 loop    
     temp <= temp +1; 
    end loop; 
end process;   
data_out <= temp;  
end behaviour; 

ответ

1

Результаты моделирования верны. Цикл for в VHDL расширяется до параллельных назначений, а не то, что вы получаете в C (последовательные задания). Это означает, что

for i in 0 to 3 loop    
    temp <= temp +1; 
end loop; 

станут

temp <= temp +1; 
    temp <= temp +1; 
    temp <= temp +1; 
    temp <= temp +1; 

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

2

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 элементов, продвигаемых на сигналы, когда мы не можем выполнить все дополнения в один тактовый цикл.

Смежные вопросы