2017-02-08 16 views
-1

У меня есть озадачивает проблема .. Как часть процесса буферизации я задаю один std_logic_vector к другому, просто делать:VHDL: Назначение одного std_logic_vector «1», подставлять другую делает на «X»

dataRegister <= dataRegisterBuf; 

Процесс синхронизируется с часами. Смотрите здесь для полного процесса:

--! This process buffers the data register synced to sclk when state is state_bufferingToSclk and sets registerReady when done 
SclkDomainBuffering: process(sclk) 
variable step: natural := 0; 
begin 
    if (rising_edge(sclk)) then 
     if (state = state_bufferingToSclk) then 
      if (step = 0) then 
       dataRegister <= dataRegisterBuf; 
       step := 1; 
      elsif (step = 1) then 
       registerReady <= '1'; 
       step := 2; 
      end if; 
     else 
      step := 0; 
      registerReady <= '0'; 
     end if; 
    end if; 
end process SclkDomainBuffering; 

Проблема, при моделировании это в Modelsim, dataRegister не принимает значение dataRegisterBuf, а каждый «1» в векторе становится «X». Так, например, если dataRegisterBuf является «00010», dataRegister становится «000X0». Почему я не могу понять, почему. Вот симуляция, показывающая, что это происходит: http://i.imgur.com/znFgqKl.png

Я прошел весь код и не вижу ничего необычного. В то время, как это происходит, строка 84 в приведенном выше коде действительно выполняется, и это единственный оператор, который выполняется, который имеет какое-либо отношение к двум указанным регистрам, насколько я могу судить.

+1

Пожалуйста, включите в вопрос соответствующий код как текст (а не изображение). – mkrieger1

+2

Сообщите нам, что еще управляет 'dataRegister'. (Используйте команду «drivers» в вашем симуляторе, если вам нужно). ПРИМЕЧАНИЕ. Два или более драйверов по сигналу, без арбитражной логики, обычно являются плохими идеями. –

+1

Соответствующий код будет [Минимальный полный и проверяемый пример] (https://stackoverflow.com/help/mcve). Проблема не воспроизводится из того, что вы показали. – user1155120

ответ

1

Вот Minimal Complete and Verifiable example создан из вашего вопроса и комментариев:

library ieee; 
use ieee.std_logic_1164.all; 

entity baffling_problem is 
end entity; 

architecture foo of baffling_problem is 
    type state_type is (state_bufferingToClk, state_bufferingToSclk); 
    signal state: state_type; -- defaults to 'LEFT, state_bufferingToClk 
    signal dataRegisterBuf:  std_logic_vector (31 downto 0) := 
       (1 | 2 => '1', others => '0'); 
    signal dataRegister:  std_logic_vector (31 downto 0) := (others => '0'); 
    signal registerReady:  std_logic; 
    signal sclk:    std_logic := '1'; 
begin 

    SclkDomainBuffering: process(sclk) 
    variable step: natural := 0; 
    begin 
     if (rising_edge(sclk)) then 
      if (state = state_bufferingToSclk) then 
       if (step = 0) then 
        dataRegister <= dataRegisterBuf; 
        step := 1; 
       elsif (step = 1) then 
        registerReady <= '1'; 
        step := 2; 
       end if; 
      else 
       step := 0; 
       registerReady <= '0'; 
      end if; 
     end if; 
    end process SclkDomainBuffering; 
    SOMEOTHERPROCESS: 
    process (state) 
    begin 
     if state = state_type'LEFT then -- other than state_bufferingToSclk 
      dataRegister <= (others => '0'); 
     end if; 
    end process; 
STIMULI: 
    process 
    begin 
     wait for 20 ns; 
     sclk <= '0'; 
     wait for 5 ns; 
     sclk <= '1'; 
     wait for 0 ns; -- state transitions in distinct delta cycle 
     state <= state_bufferingToSclk; 
     wait for 20 ns; 
     sclk <= '0'; 
     wait for 5 ns; 
     sclk <= '1'; 
     wait for 20 ns; 
     wait; 
    end process; 

end architecture; 

И это дает поведение вашему описать:

baffling_problem.png

См IEEE Std 1076-2008 14.7.3 распространение сигнала значения, 14.7.3.1 Общие сведения:

Как время моделирования a dvances, транзакции в прогнозируемой форме выходного сигнала данного драйвера (см. 14.7.2) будут поочередно становиться значением драйвера. Когда драйвер получает новое значение таким образом или в результате того, что драйвер или задержка запланирована для драйвера, независимо от того, отличается ли новое значение от предыдущего значения, этот драйвер считается активным в течение этого цикла моделирования. Предполагается, что для целей определения активности водителя считается, что водитель, приобретающий значение из нулевой транзакции, приобрел новое значение. Сигнал считается активным в течение заданного цикла моделирования, если активен один из его источников.
.
- Один из его подэлементов активен.
- Сигнал назван в официальной части элемента ассоциации в списке ассоциаций портов, и соответствующий фактический активен.
- Сигнал является подэлементом разрешенного сигнала, и разрешенный сигнал активен.
- Сила, депозит или релиз запланированы для сигнала.
- Сигнал представляет собой подэлемент другого сигнала, для которого назначается сила или депозит.

Так что сигналы (dataReady (1) и dataReady (2) является активными их источники являются активными.

Объяснения того, почему их значение разрешенного значения их водителей находится в 14.7.3.2 вождения значения, ни один из сигналов, содержащих dataReady, не является основным сигналом, см. пункт 3 f).

И почему вы видите значение dataReady как «00000000000000000000000000000XX0» описано в 14.7.3.3. Эффективные значения.

Язык VHDL описывает моделирование модели проекта, а также описание синтаксиса и семантики. Разработанная проектная модель состоит из процессов, описанных в иерархии, связанной между собой сигналами, и сигналы имеют историю не только ценность. Обновления сигналов запланированы в прогнозируемых выходных сигналах (см. 10.5 «Назначение задания сигнала»).

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

. Одна из вещей, которые вы заметите, - это то, что процессы (11.3) приостанавливаются и возобновляются на основе явного или неявного ожидания утверждения (10.2).

Все одновременно отчетности выработанные в процессах и или процессов и отчетности блока (11. Одновременные заявления).

вызовы подпрограмм являются либо выражения (функции, 9.3.4) или заявления (процедуры, 10.7)

Значение сигнала не обновляется в то время как любой процесс, который должен быть активным (те прогнозируемые выходные сигналы, соответствующие текущему времени моделирования, 14.7.4 Исполнение модели, 14.7.3.4 Обновление сигнала).

Сигналы, управляемые в нескольких процессах, представляют собой несколько наборов оборудования. Проблема возникает из-за того, что вы использовали разрешенные типы данных, если вы использовали неразрешенные типы данных, вместо этого вы получили бы ошибку разработки (6.4.2.3. Объявления сигналов, пункт 8). Разрешенным сигналам разрешено иметь несколько драйверов.

Таблица разрешений для элементов std_logic содержится в корпусе пакета для пакета std_logic_1164 (см. Сноску 15 Приложение A Описание сопроводительных файлов для доступа к источнику пакетов VHDL, включенным в стандарт). Таблица разрешений будет разрешать «0» и «1» на «X».

И если все это звучит сложно, вы можете изучить простые правила для предотвращения проблем.

В этом случае эмпирическое правило должно всегда приводить сигнал от одного процесса.

0

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