2013-04-09 35 views
0

我在FPGA中實現DSO控制器,並且遇到太多保持時間違規(到目前爲止最好的結果是3個保持時間錯誤約爲-2ns鬆弛) 。擺脫保持時間違規(賽靈思HDL)

我的問題的核心是我有從ADC採樣抽取器輸入的FIFO緩衝器,然後輸出到同步FT245(60MHz)。 輸入抽取器可以被設置爲以2的冪(例如,1,2,4,8,16 ...)進行抽取,這也將ADC樣本的時鐘頻率(150MHz)分開。

而我現在的做法是,當我正在捕獲數據時,我提供分頻(或直接的,如果抽取比爲0)時鐘頻率緩衝,然後當我向PC推送樣本時,切換到從FT245提供60MHz時鐘。在模擬它可以正常使用,但問題是在放置和路由,該路由器會吐出這個錯誤:

Route:466 - Unusually high hold time violation detected among 226 connections. The top 20 such instances are printed below. The 
    router will continue and try to fix it 

然後仰臥起坐10-15分鐘,直到它給了我時間報告,通知我說,所有的設置時間限制遇到了150MHz時鐘有3個保持時間違規(60MHz時鐘正常)。

我已經讀過這個問題可能是使用門控時鐘,FPGA無法正確分配時鐘,但我試着用FIFO的門控時鐘來代替,我直接連接150MHz時鐘到FIFO,並且我在FIFO中選通數據與dataReady(它實際上結束了與以前門控時鐘相同的信號),那麼我得到了比現在更多(50-60)的保持時間違規。

是否有一些已知的多時鐘FIFO的好方法?不僅僅是兩個(即使在Xilinx ISE的示例中也很多)。或者是在FPGA中抽取ADC採樣的想法不行?

目標FPGA是斯巴達6 LX25速度等級-2(不幸的是我無法讓我的手-3速度等級)。

這裏是鬆弛的例子它給我:

Slack (hold path):  -2.031ns (requirement - (clock path skew + uncertainty - data path)) 
    Source:    decimator_clock_divisor/decimationRatio_0 (FF) 
    Destination:   trigger_analog1/previousValue_2 (FF) 

所提到的源信號(和它給了我都是違法行爲)並沒有改變,很多時候,它實際上是由GUI控制,我不我不知道它怎麼會在那裏違反時間。它是從抽取器到觸發緩衝區的比率(或者我的FIFO緩衝區在其他違例中)的路徑。

基本上我的問題是,我是否應該關心這些違規?

因爲在改變抽取器的比率之後,在實際開始使用抽取器的觸發器結果之前,可能會有數千個時鐘週期。

我知道路由器無法知道我多長時間更換一次異步信號(它是異步的,因爲我將它設置爲60MHz時鐘域),並且需要多長時間才能使用某個模塊的結果。 問題是,我不知道在完成PAR後,如果它顯示出這3個違規行爲,如果最終沒有其他違規行爲被這3個違規行爲所遮蔽?

可以發佈PAR仿真驗證它是否可以在板上工作?我會嘗試它,但我必須等待2周BGA焊接,我只剩下4周完成論文,所以我想確保我的設計將工作。

回答

2

FIFO可以充當異步。兩個主時鐘域60Mhz和150Mhz之間的邊界橋。嚴格分離兩個時鐘域的邏輯。應該只有少數已知的慢速控制信號(速度足夠慢,因此可以應用錯誤的路徑時序約束)對它們進行通信。例如,GUI將時鐘比例寫入60Mhz側的寄存器中。然後它表明快速的一面有一個新的價值。快速側在收到通知後的一些週期內捕獲此值(例如,對於元穩定性有一些額外注意的上升沿檢測)。快速側的功能邏輯總是使用該快速側的影子寄存器的輸出。

對於快速ADC側的時鐘分頻,您可以使用完整的時鐘並按照您所描述的啓用(我更喜歡),或者您可以自行將時鐘分開。在劃分時鐘時,請確保遵循Xilinx文檔中的示例。例如,有時需要時鐘緩衝器來分配時鐘。

如果有剩餘的保持路徑違規,則查看源和目標FF的時鐘和時鐘到達時間。有時,當目標FF的捕捉時鐘被延遲時,數據會提前。路由器可以通過簡單地延遲數據來解決這個問題。當設置要求不允許進一步延遲時(它可能是兩個時鐘之間的不確定性太高時),它無法修復它。

+0

我接受這個答案,因爲感謝您的建議,我設法讓PAR的計時分數爲0。 – 2013-04-10 10:13:57