2013-12-12 75 views
1

我需要一個計數器,可以在達到800時復位,或者當輸入中出現下降沿時,我會收到類似「不支持的時鐘語句」或「不能合成壞的同步描述」的錯誤VHDL,多個復位計數器

我tryied幾件事情,我需要像這樣

if rising_edge(clk) then 
    if Counter >= 800 OR rising_edge(X) then 
    Counter <= (others => '0'); 
    else 
    Counter <= Counter + 1; 
end if 

x是復位計數器的輸入信號,計數器是STD_LOGIC_VECTOR

謝謝:)

回答

0

它說「不好同步」的描述,因爲你試圖用多個時鐘源來描述寄存器。有一些FPGA系列可以支持這一點,但這種情況很少見,也很少見。

首先,你寫了「在輸入下降沿」但隨後使用「rising_edge(X)」 ...

其次,沒有辦法,計數器std_logic_vector與你進行比較,以整型常量。我假設至少沒有簽名。除非你使用棄用的軟件包,當然 - 你不應該這樣做!

第三,你沒有提到X與clk的任何關係。

一個標準解決方案是

counter_p : process (
    clk, 
    reset 
    ) 
begin 

    if reset = '0' then 

     counter <= 0; 

    elsif rising_edge(clk) then 

     counter <= counter + 1; 

     if (counter = 800) then 
      counter <= 0; 
     end if; 

    end if; 

end process counter_p; 

如果X是同步的,則執行同步復位。

如果您確實只需要在下降沿進行異步復位 - 意味着不會在復位置位時,僅在置位邊沿之後的時鐘上 - 那麼您將不得不使用clk和移位寄存器進行過採樣,測試下降沿並從中產生(a)同步復位。

+0

WOA,我只是個菜鳥,謝謝您的答覆,我承認我寫的代碼不檢查它,對不起。此外,我不明白你是什麼意思的同步重置,我只是想計數器重置與下降/上升沿,並自動重置它去一個數字。是的,它是一個矢量im使用ARITH和UNSIGNED庫,如果我使用重置='0'計數器將不會得到「計數」直到重置到'1'再次,我想只是重置它,當它下降/上升,但繼續計數直到800或直到另一個下降/上升的邊緣,謝謝。 – user2982010

+0

然後你必須自己同步重置信號,就像我發佈的最後一部分所說的那樣。但是,這種方法會導致1個時鐘週期的不確定性。 但我強烈建議您重新考慮您的設計並使用標準設計方法,即異步或同步重置。 – FRob