DCM消除時鐘Skew

2021-08-21 16:14:25 字數 2492 閱讀 9574

什麼叫dcm(digital clock management)?    dcm內部是dll(delay lock loop(?)結構,對時鐘偏移量的調節是通過長的延時線形成的。dcm的引數裡有乙個phaseshift(相移),可以從0變到255。所以我們可以假設內部結構裡從clkin到clk_1x之間應該有256根延時線(實際上,由於對不同頻率的時鐘都可以從0變到2

什麼叫dcm(digital clock management)?

dcm內部是dll(delay lock loop(?)結構,對時鐘偏移量的調節是通過長的延時線形成的。dcm的引數裡有乙個phaseshift(相移),可以從0變到255。所以我們可以假設內部結構裡從clkin到clk_1x之間應該有256根延時線(實際上,由於對不同頻率的時鐘都可以從0變到255,延時線的真正數目應該比這個大得多)。dcm總會把輸入時鐘clkin和反饋時鐘clkfb相比較,如果它們的延時差不等於所設定的phaseshift,dcm就會改變在clkin和clk_1x之間的延時線數目,直到相等為止。這個從不等到相等所花的時間,就是輸出時鐘鎖定的時間,相等以後,lock_flag標識才會公升高。

當dcm發現clkin和clkfb位相差不等於phaseshift的時候,卻去調節clk_1x和clkin之間延時,所以如果clk_1x和clkfb不相關的話,那就永遠也不能鎖定了。呵呵。

如何使用dcm

dcm一般和bufg配合使用,要加上bufg,應該是為了增強時鐘的驅動能力。dcm的一般使用方法是,將其輸出clk_1x接在bufg的輸入引腳上,bufg的輸出引腳反饋回來接在dcm的反饋時鐘腳clkfb上。另外,在fpga裡,只有bufg的輸出引腳接在時鐘網路上,所以一般來說你可以不使用dcm,但你一定會使用bufg。有些兄弟總喜歡直接將外部輸入的時鐘驅動內部的暫存器,其實這個時候雖然你沒有明顯地例化bufg,但工具會自動給你加上的。

(關於bufg:見

使用dcm可以消除時鐘skew

使用dcm可以消除時鐘skew。這個東西一直是我以前所沒有想清楚的,時鐘從dcm輸出開始走線到暫存器,這段skew的時間總是存在的,為什麼用dcm就可以消除呢?直到有一天忽然豁然開朗,才明白其原委。對高手來說,也許是極為easy的事情,但也許有些朋友並不一定了解,所以寫出來和大家共享。

為說明方便起見,我們將bufg的輸出引腳叫做clk_o,從clk_o走全域性時鐘佈線到暫存器時叫做clk_o_reg,從clk_o走線到dcm的反饋引腳clkfb上時叫clkfb,如圖所示。實際上clk_o, clk_o_reg, clkfb全部是用導線連在一起的。所謂時鐘skew,指的就是clk_o到clk_o_reg之間的延時。如果開啟fpga_editor看底層的結構,就可以發現雖然dcm和bufg離得很近,但是從clk_o到clkfb卻繞了很長一段才走回來,從而導致從clk_o到clk_o_reg和clkfb的延時大致相等。總之就是clk_o_reg和clkfb的相位應該相等。所以當dcm調節clkin和clkfb的相位相等時,實際上就調節了clkin和clk_o_reg相等。而至於clk_1x和clk_o的相位必然是超前於clkin, clkfb, clk_o_reg的,而clk_1x和clk_o之間的延時就很明顯,就是經過那個bufg的延遲時間。

對時鐘skew的進一步討論

最後,說一說時鐘skew的概念。時鐘skew實際上指的是時鐘驅動不同的暫存器時,由於暫存器之間可能會隔得比較遠,所以時鐘到達不同的暫存器的時間可能會不一樣,這個時間差稱為時鐘skew。這種時鐘skew可以通過時鐘樹來解決,也就是使時鐘佈線形成一種樹狀結構,使得時鐘到每乙個暫存器的距離是一樣的。很多fpga晶元裡就布了這樣的時鐘樹結構。也就是說,在這種晶元裡,時鐘skew基本上是不存在的。

說到這裡,似乎有了乙個矛盾,既然時鐘skew的問題用時鐘樹就解決了,那麼為什麼還需要dcm+bufg來解決這個問題?另外,既然時鐘skew指的時時鐘驅動不同暫存器之間的延時,那麼上面所說的clk_o到clk_o_reg豈非不能稱為時鐘skew?

先說後乙個問題。在一塊fpga內部,時鐘skew問題確實已經被fpga的時鐘方案樹解決,在這個前提下clk_o到clk_o_reg充其量只能叫做時鐘延時,而不能稱之為時鐘skew。可惜的是fpga的設計不可能永遠只在內部做事情,它必然和外部交換資料。例如從外部傳過來乙個32位的資料以及隨路時鐘,資料和隨路時鐘之間滿足建立保持時間關係(setup hold time),你如何將這32位的資料接收進來?如果你不使用dcm,直接將clkin接在bufg的輸入引腳上,那麼從你的clk_o_reg就必然和clkin之間有個延時,那麼你的clk_o_reg還能保持和進來的資料之間的建立保持關係嗎?顯然不能。相反,如果你採用了dcm,接上反饋時鐘,那麼clk_o_reg和clkin同相,就可以利用它去鎖存進來的資料。可見,dcm+bufg的方案就是為了解決這個問題。而這個時候clk_o到clk_o_reg的延時,我們可以看到做內部暫存器和其他晶元傳過來的資料之間的時鐘skew。

由此,我們可以得出乙個推論,從晶振出來的時鐘作為fpga的系統時鐘時,我們可以不經過dcm,而直接接到bufg上就可以,因為我們並不在意從clkin到clk_o_reg的這段延時。

STM8S時鐘配置

1 stm8時鐘說明 stm8上電復位後預設使用內部的高速時鐘,並分頻成為2m用於系統執行。如果我們想要使用外部時鐘,需要進行時鐘切換,切換過程中還需要使用stvp進行晶元選項字的更改。2 stm8s時鐘配置 庫函式版 1 配置內部高速振盪器 hsi 的分頻器 1分頻 clk hsiprescale...

s3c2440系統時鐘

1 flck hclk和pclk的關係 一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll 鎖相環 進行倍頻處理。在s3c2440中,...

STM8S之時鐘設定

昨天被安排做別的工作,耽誤一天,今天繼續寫,堅持學習。1,stm8s的4種時鐘源可用做主時鐘 1 24mhz高速外部晶體振盪器 hse 最大24mhz高速外部時鐘訊號 hse user ext 16mhz高速內部rc振盪器 hsi 128khz低速內部rc lsi 各個時鐘源可單獨開啟或關閉,從而優...