2016-08-04 3 views
0

В настоящее время я нахожусь посреди 12-часовой отладочной сессии, и я не могу, для жизни меня, пройти этот горб.Невозможно определить значение сигнала в VHDL

Как мой код настроен, у меня есть 8 бит std_logic_vector, отображаемый на 8 коммутаторах на плате DE2-115. Каждый бит реагирует на логический уровень, активируемый относительным переключателем (0 или 1).

Цель состоит в том, чтобы дождитесь, пока какой-либо из 8 переключателей, которые будут активированы до запуска таймера. Это будет активирована, когда relative_time_enable сигнал установлен в логическое состояние 1. После того, как сигнал устанавливается в 1, он не будет в конечном счете никогда не сбрасывается на 0. Эта переменная инициализируется, как показано:

signal relative_time_enable   : STD_LOGIC := '0'; 
signal signal_in      : STD_LOGIC_VECTOR(7 downto 0); 

signal_in получает отображается к «в» портах, делящихся в моей сущности, или, наоборот, наоборот. Однако, как сказано, signal_in реагирует на коммутаторы. Вот код, который у меня есть прямо сейчас.

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 
        relative_time_enable <= '1'; 
      end if; 
    end if; 
end process; 

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

На данный момент я пробовал все, чтобы определить, какие значения фактически включают замену «00000000» на «11111111», «UUUUUUUUU», «ZZZZZZZZ», «XXXXXXXX», и все они все еще проходят.

Я также попытался:

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 

        for i in 0 to 7 loop 
          if(signal_in(i) = '1') then 
            relative_time_enable <= '1'; 
          end if; 
        end loop; 

      end if; 
    end if; 
end process; 

Этот метод кажется, что он должен «двойной контроль», но как-то он продолжает получать через и установив значение 1 до того, как переключатели активируются. Кроме того, у меня есть отображение signal_in на lCD и меняется, когда я переключаю переключатели и при запуске все считывает 00000000.

FYI: Я работал с этой FPGA и VHDL в течение 2 недель, поэтому очень возможно, что я что-то пропустил очень фундаментальный. Кроме того, я не точно на 100% уверен в своих навыках в ModelSIM и не знаю, как я буду переводить то, что вижу в проблемах с кодом.

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

Также следует упомянуть, что следующий код работает так, как ожидалось, но проблема с этим кодом заключается в том, что он сбрасывает relative_time_enable обратно в 0, что является большим, нет. Единственная причина, по которой я показываю это, состоит в том, что она, по сути, ждет, пока переключатель не будет активен до запуска часов, но как только я деактивирую переключатель, часы перестанут работать, что является проблемой.

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 
        relative_time_enable <= '1'; 
      else 
        relative_time_enable <= '0'; 
      end if; 
    end if; 
end process; 

ответ

0

Ваш тест будет работать с bit_vector, потому что каждый бит будет принимать значения либо '0' или значение '1'. Итак, /= "00000000" действительно означало бы: по крайней мере один бит '1'. Но поскольку вы используете std_logic_vector, каждый бит может принимать 9 различных значений (std_logic - это 9-значный нумерованный тип). Таким образом, /= "00000000" не означает, что по крайней мере один бит равен '1'. Это может означать, что один бит установлен на 'U' или любое другое значение, отличное от '0'.В начале моделирования signal_in инициализируются с "UUUUUUUU "(U стендов для UNINITIALIZED). инициализируются '0', потому что вы заявили, что путь. Так что ваш тест проходит по первому переднему фронту clk_1MHz_enable и застревает в '1' . почти сразу

clk_1MHz_enable Предполагая, что это часы (странное название, но почему бы и нет), и вы хотите по фронту сигнала D-триггера, следующий код решает эту проблему:

process(clk_1MHz_enable)  
begin 
    if clk_1MHz_enable = '1' and clk_1MHz_enable'event then 
    for i in signal_in'range loop 
     if signal_in(i) = '1' then 
     relative_time_enable <= '1'; 
     end if; 
    end loop; 
    end if; 
end process; 

d, если вы хотите защелку с триггером вместо триггера с кратным фронтом:

process(clk_1MHz_enable, signal_in) 
begin 
    if clk_1MHz_enable = '1' then 
    for in in signal_in'range loop 
     if signal_in(i) = '1' then 
     relative_time_enable <= '1'; 
     end if; 
    end loop; 
    end if; 
end process; 
+0

Genius! Bit_Vector работал красиво. Спасибо вам за помощь. – Dylan

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