2016-02-26 2 views
0

У меня большая проблема с синтезом кода VHDL. Я оставляю новые идеи для FPGA.VHDL - Должен ли я использовать один и тот же тактовый сигнал в каждом последовательном процессе?

У меня есть несколько последовательных процессов, и часы некоторых процессов является следствием других, как в коде ниже:

process(clk_100MHz) 
    begin 
     if(clk_100MHz'event and clk_100MHz = '1') then 
      clk_divider_4 <= clk_divider_4 + 1; 
      clk_25MHz <= clk_divider(1); 
     end if; 
end process; 

process(clk_25MHz) 
    begin 
     if(clk_25MHz'event and clk_25MHz = '1') then 

     -- Some sequantial code here 

     end if; 
end process; 

Это проблема? Потому что я чувствую, что проблема моего кода связана с проблемой времени и что это может быть причиной.

Благодарим за ответы,

Damien.

+2

To downvoter: Пожалуйста, предоставьте короткий комментарий по причине downvote, так как это поможет новичкам улучшить свои вопросы. –

+0

Вы передаете данные между двумя тактовыми доменами? Есть ли количество регистров, связанных с 'clk_25MHz'? –

+0

Используйте один единственный таймер, если у вас нет ДЕЙСТВИТЕЛЬНО хорошей причины для этого. Затем используйте методы «переключения доменов» для решения проблем - см. Также «входные синхронизаторы» для асинхронных входов. В пределах этой тактовой области использование часов позволяет (ответ Мортена) для связанных часов. –

ответ

2

Часы в ПЛИС обычно вводятся из внешних контактов или генерируются с помощью ФАПЧ, поскольку это значительно облегчает синхронизацию, основанную на статистическом анализе времени (STA). Поэтому не производят часы на основе логики, если вы действительно не знаете, что вы делаете.

Таким образом, способ обновления некоторой логики, например. 25 Скорость МГц с использованием тактовых импульсов 100 МГц, должен иметь разрешающий сигнал, который утверждал только в соотношении 1: 4, с кодом, как:

process (clk_100MHz) is 
    variable enable_25MHz_div : natural range 0 to 3 := 0; 
begin 
    if rising_edge(clk_100MHz) then 
    if enable_25MHz_div = 0 then 
     ... -- Code up update at 25 MHz rate 
    end if; 
    -- Enable at 25 MHz rate based on clock division 
    if enable_25MHz_div = 3 then 
     enable_25MHz_div := 0; 
    else 
     enable_25MHz_div := enable_25MHz_div + 1; 
    end if; 
    end if; 
end process; 

Используя те же часы 100 МГц для всей логики в дизайне включен прямой обмен данными между различными процессами, поскольку все данные привязаны к тем же часам, даже если фактическое обновление значений может происходить с разной скоростью.