Дождитесь изменения состояния ввода, чтобы начать процесс

Я программирую CPLD Coolrunner2 (XC2C64A) с помощью программного обеспечения ISE Project Navigator. На данный момент он должен действовать только как логический вентиль (выход = o_buzzer) между контактом PIC32 (вход = i_pic) и RPi CM3 (вход = i_cm).

o_buzzer <= i_pic or i_cm;

Проблема в том, что при подключении источника питания контакты PIC32 настраиваются как входы, поэтому CPLD воспринимает его как высокое сопротивление (Z) и выводит 1 до тех пор, пока контакты не будут настроены. Поэтому я пытаюсь позволить CPLD подождать, пока i_pic больше не будет Z.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity or_gate is
    Port ( i_pic : in  STD_LOGIC;
           i_cm : in  STD_LOGIC;
           o_buzzer : out  STD_LOGIC);
end or_gate;

architecture Behavioral of or_gate is

begin

    process_or : process(i_pic,i_cm)

    begin

        while (i_pic = 'Z') loop

        end loop;

        o_buzzer <= i_pic or i_cm;
    end process process_or;

end Behavioral;

Это дает мне предупреждение:

строка 46: Тело цикла будет повторяться ноль раз.

А при реализации не работает. Зуммер подает звуковой сигнал до тех пор, пока контакты не будут инициализированы.

Использование цикла while:

while (i_pic = 'Z') loop
    o_buzzer <= '0';
end loop;

Дает мне:

Цикл повторился 64 раза. Используйте «set -loop_iteration_limit XX», чтобы повторить больше».

Как я могу позволить процессу ждать, пока i_pic не станет логически низким, а не Z больше?


person Swedgin    schedule 02.09.2019    source источник


Ответы (1)


Вы не можете проверить 'Z' в синтезируемом коде. Вы можете проверить на '1' (или 'H') или на '0' (или 'L'). Вы не можете проверить 'Z'. Какое оборудование будет это делать? Какое-то аналоговое оборудование, а не какое-то цифровое. Вот почему вы не можете проверить 'Z' в синтезируемом коде.

person Matthew Taylor    schedule 02.09.2019
comment
Не говоря уже о том, что цикл while повторяется за 0 раз в VHDL в этом процессе, поэтому его никогда не следует использовать для синтезируемого кода (это концепция программного обеспечения) - person Tricky; 02.09.2019
comment
Хорошо, я новичок в VHDL. Итак, я ничего не могу сделать, чтобы or_process запустился на пару 100 мс позже? - person Swedgin; 02.09.2019
comment
Это так не работает - это аппаратно. Как бы вы реализовали схему, которая ждала 100 мс? VHDL не похож на программирование — вам нужно нарисовать аппаратное обеспечение, прежде чем писать код. - person Tricky; 02.09.2019
comment
Для строки 46 см. IEEE Std 1076-2008, 16.8.2.4.4 Металогические значения в реляционных выражениях Если исходный код VHDL включает оператор равенства (=), для которого один операнд является статическим металогическим значением, а другой операнд не является статическое значение, инструмент синтеза должен интерпретировать отношение равенства как эквивалентное BOOLEAN значению FALSE. Схема итерации условия while исторически не поддерживается в синтезе (IEEE Std 1076.6-2004, RTL Synthesis, отозван, оператор цикла 8.8.9), хотя поставщики делают это с оговорками. Цикл ограничен лимитом итераций в синтезе. - person ; 03.09.2019
comment
@Swedgin Вы можете разработать схему, которая ждет 100 мс - счетчик. Вам нужно сделать это. - person Matthew Taylor; 03.09.2019
comment
@MatthewTaylor да, теперь я понимаю. Дело в том, что нет выделенной линии синхронизации, поэтому мне понадобится еще один GPIO от RPi или PIC32 и опросить его на наличие логического «0», чтобы знать, что они инициализированы до того, как CPLD сможет вывести or-gate. - person Swedgin; 03.09.2019
comment
@Swedgin Если вы хотите реализовать задержку в логике, вам нужны часы. - person Matthew Taylor; 03.09.2019