2016-02-26 13 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; 

這是個問題?因爲我感覺我的代碼問題是由於計時問題引起的,這可能是原因。

謝謝您的回答,

達米安。

+2

對於downvoter:請提供一個簡短的評論downvote的原因,因爲這將有助於新人改善他們的問題。 –

+0

你是否在兩個時鐘域之間傳輸數據?是否有大量的寄存器連接到'clk_25MHz'? –

+0

使用一個單一的時鐘,除非你有一個很好的理由否則。然後,使用「時鐘域交叉」技術來解決問題 - 另請參閱異步輸入的「輸入同步器」。在該時鐘域內,使用時鐘使相關時鐘(Morten的答案)成爲可能。 –

回答

2

FPGA中的時鐘通常由外部引腳輸入或由PLL產生,因爲這極大地幫助基於靜態時序分析(STA)的時序收斂。所以不要基於邏輯推導時鐘,除非你真的知道你在做什麼。

因此,更新例如使用100 MHz的時鐘25MHz的速率,是有一個使能信號,其僅斷言爲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; 

使用相同的100MHz的時鐘爲設計中的所有邏輯啓用直接在不同進程之間交換數據,因爲所有的數據都被引用到相同的時鐘,即使實際更新的值可能以不同的速率出現。

相關問題