2017-07-17 51 views
-1

Glitch級聯以避免小故障? - VHDL

我正在重新學習VHDL。遇到一些問題後,我又回到了鬧鐘等小事。我猜想在Java等多年之後,我有一個基本的誤解和錯誤的方法,而不是硬件。請告訴我關於我的一般問題的正確方向(通常指的是微不足道的情況,我使用的是Xilinx ISE和Spartan3,但我的問題與實際硬件無關)。

  1. 由於位切換,計數器在硬件(模擬)中產生毛刺。這是可以預料的。如何彌補設計中的缺陷? 例如過程中的一部分將是:

    if rising_edge(clk_base) then 
        if(set_time='1') 
         if (sec_enable= '1') then 
          sec1 <= sec1+1; 
          if(sec1 = 59) then 
           sec1<=0; 
          end if; 
         end if; .... 
    

    的處理之後,我寫output_seconds < = SEC1;顯然,在這個過程之外的非順序(?)語句中,我總是直接在輸出端口獲得毛刺。有沒有辦法抑制這一點?某種通用的同步設置的所有端口?

  2. 創建日期時,day_enable來自時鐘組件的時鐘使能,就像sec_enable來自時鐘分頻器一樣,我會有一個過程來計算日期和第30天(或31或.. 。取決於月份和閏年)的月份是< =月份+ 1,依此類推。我最初檢查了if day_enable ='1'部分的天數,但仿真表明,如果我的時鐘在閏年的2月28日開始,它仍然採用默認值(is_leap ='0'),因爲結果的檢查「if(year1 mod 4 = 0)」只適用於下一個週期。反之亦然30/31選擇。如果在「如果rising_edge(clk_base)then」之後檢查這個權限,那麼它可以工作,但是如果天(以及因此幾個月)很少改變,那麼每檢查一次X ns似乎就會過度。我的思想在哪裏走了?

在我的腦海裏,不知何故級聯,整個事情就解決問題1和問題2,但我不知道,如果它實際上是這樣做的方式,如果是這樣,如何。避免剛剛描述的問題的標準做法是什麼?我相信答案是相當微不足道的,但請在這裏幫助我。

+1

這實在是兩個問題。你應該單獨發佈它們。 –

+0

如果您的FPGA/IC輸出它們,毛刺是個壞消息。毛刺會導致輸出單元中的大晶體管迅速導通和關斷,從而吸收過量電流並引起干擾。觸發器的輸出是_coherent_。也就是說,它不會產生小故障。因此,您應該始終直接從觸發器驅動任何FPGA/IC的輸出,而不是通過組合邏輯。 –

+0

在你的例子中,你似乎直接從觸發器驅動FPGA的輸出。 'sec'將合成爲觸發器,因爲在鍾控過程中分配的任何信號都將合成爲觸發器_。如果執行_unconically_(即不是從其他條件語句內部執行),那麼'output_seconds <= sec1;'行不會添加任何邏輯。 –

回答

1
  1. 如果計數器秒-1,它是在一個真正的同步過程中分配,如:

    process(clk_base) 
    begin 
        if rising_edge(clk_base) then 
        if(set_time='1') 
         if (sec_enable= '1') then 
         sec1 <= sec1+1; 
         if(sec1 = 59) then 
          sec1<=0; 
         end if; 
         end if; 
        end if; 
        end if; 
    end process; 
    

然後sec1是寄存器的輸出,有它無毛刺。如果你在並行信號分配將其分配給另一個信號(任何過程之外)的形式爲:

output_seconds <= sec1; 

上會有output_seconds無毛刺。硬件是否存在。

  1. 硬件是否存在。晶體管不會動態添加並從芯片上移除。因此,如果您添加了一些硬件來與某些其他硬件進行比較,那麼即使它沒有被使用,它也會在那裏。在不需要的時候讓硬件的一部分工作的唯一缺點就是能源浪費。

請注意,如果您的硬件不總是有用,現在該考慮是否可以在多個類似操作之間共享硬件......

+0

1.我的過程就是這樣,不同之處在於異步重置。這是否應歸咎於後綜合模擬中的毛刺? 2.「檢查月份長度」if-part當然總是存在,所以當然相應的硬件總是存在的,但是在時鐘啓用之前它會比以後更頻繁地被調用。能源浪費在這裏不是問題,但是必須有更好的方法,因爲我只是在每個時鐘都會調用它,因爲它的結果被延遲了1天的週期?! – kaliyanei91

+0

那麼,如果你的異步重置故障,那麼是的,這可能是責怪。你能否詳細解釋一下你看到的內容?每個時鐘週期切換多次會產生一次輸出嗎?或者它是每個時鐘週期多次改變的完整多位值? –

+0

我在上面添加了一張圖片。令我更加困惑的是,正確的值相差1(儘管關於觸發邊緣的延遲),但在此之前出現小故障,所以沒有延遲,它實際上會先於邊緣。我不明白爲什麼這樣一個簡單的設計(大多數教程中的標準)會在輸出上出現問題(正如你所說的那樣)。復位本身不會出現毛刺,它應該像它應該那樣工作,並且無論reset ='1'還是'0'都會出現毛刺。我無法想象爲什麼hw會因爲復位異步而在這種不可靠的情況下綜合。 – kaliyanei91