Это нормально, но может ли синтез получить хороший результат, зависит от ткани.
Список чувствительности должен иметь только reset
и C50MHz
, потому что это единственные события, которые фактически меняют сигналы. Когда C4Hz
переключает, то rising_edge(C50MHz)
- false
, потому что они не синхронизированы, и ничего не произойдет, если процесс должен был запускаться тогда.
Отдельное включение можно считать доступным повсюду - тактовый вентилятор настолько высок, что каждый реализует отдельные распределительные сети часов, и тогда требуется включение в регистрах. Таким образом, это безопасно использовать.
Асинхронный сброс может быть недоступен для всех тканей, но обычно это так. Некоторые устройства будут поддерживать асинхронную нагрузку (т. Е. Вы можете решить, какое значение будет принято при сбросе), другие будут сброшены (т. Е. Вы можете установить регистр только на ноль, а инициализация на единицу будет генерировать инвертированную таблицу, регистр с параметром reset-to -нуль, и инвертор в следующем LE.
так что в целом, это достаточно безопасно, это может быть синтезирован
-- intermediates
do_clear_start_flag := C4Hz = '1' and count4 = "11" and single_run_flag = '0';
do_set_start_flag := C256Hz = '1' and Go = '1' and start_flag = '0';
-- to register
enable_start_flag := do_clear_start_flag or do_set_start_flag;
new_start_flag := do_set_start_flag;
проверка на старое значение start_flag
в do_set_start_flag
не может быть оптимизированными даже если установка start_flag
не действует, если она была установлена ранее, поскольку она может быть просто сброшена в текущем такте.
Если блок, начиная с if C256Hz = '1'
были elsif
вместо этого, второй промежуточный прочтет
do_set_start_flag := C256Hz = '1' and Go = '1' and do_clear_start_flag = '0'
Multiple часы позволяет нормально, до тех пор, пока есть только один тактовый (есть). Просто удалите все, кроме Clock (C50MHz) и Reset из этого беспорядка списка чувствительности. –
Как выглядит 'C4Hz'? Является ли это прямоугольником 4 Гц с рабочим циклом 50%? – mbschenkel