2017-01-12 8 views
0

Привет, я новичок в VHDL, и я хочу спросить, нормально ли иметь такой процесс , где у меня есть несколько часов в одном процессе. C256Hz и C4Hz - это часы, которые управляются от тактовой частоты 50 МГцVHDL: наличие нескольких тактовых импульсов в одном процессе

process (Reset, C50Mhz, Go, start_flag, C256Hz, C4Hz) 
    begin 
    if reset = '1' then 
    start_flag <= '0'; 
    elsif rising_edge (C50Mhz) then 
    if C4Hz = '1' then 
     if count4 = "11" and single_run_flag = '0' then 
      start_flag <= '0'; 
     end if; 
    end if; 
    if C256Hz = '1' then 
     if Go = '1' and start_flag = '0' then 
      start_flag <= '1'; 
     end if; 
    end if; 
    end if; 
    end process; ` 
+0

Multiple часы позволяет нормально, до тех пор, пока есть только один тактовый (есть). Просто удалите все, кроме Clock (C50MHz) и Reset из этого беспорядка списка чувствительности. –

+0

Как выглядит 'C4Hz'? Является ли это прямоугольником 4 Гц с рабочим циклом 50%? – mbschenkel

ответ

0

Это нормально, но может ли синтез получить хороший результат, зависит от ткани.

Список чувствительности должен иметь только 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'