В настоящее время я нахожусь посреди 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;
Genius! Bit_Vector работал красиво. Спасибо вам за помощь. – Dylan