專利名稱:一種基于fpga實現的分數分頻方法以及分數分頻器的制作方法
技術領域:
本發明涉及分頻方法技術領域,更具體的說是涉及一種基于FPGA(現場可編程門 陣列)實現的分數分頻方法以及基于FPGA實現的分數分頻器。
背景技術:
目前,分頻技術應用之廣,幾乎涉及到了所有的電子領域。在現代控制系統中,也 有著廣泛的應用,例如在伺服驅動器中,需要對反饋脈沖進行分數的分頻輸出,供其它的驅 動器或者控制器使用。伺服驅動器的反饋脈沖一般是兩路正交相位的脈沖,在分頻之后,兩 路脈沖在相位上還要保持正交。在數控系統中,也需要產生輸出任意頻率的兩路正交脈沖。目前現有的分頻技術中,基于FPGA實現的分頻器主要有整數分頻器和小數分頻 器,而分數分頻器較少論及。分數可以表示任意有理數,所以分數分頻也就完全包括了整數 分頻和小數分頻。目前,實現分數分頻要把分頻數分為整數和小數,其結構如圖1所示。但是整數分 頻與小數分頻的實現技術方案并不一樣。整數分頻一般采用計數器來實現,而且整數分頻 也要分為偶數分頻和奇數分頻。如進行N倍偶數分頻,那么可以通過由待分頻的時鐘觸發 計數器計數,當計數器從0計數到N/2-1時,輸出時鐘進行翻轉,并給計數器一個復位信號, 使得下一個時鐘從零開始計數。以此循環下去,就可以實現任意的偶數分頻。當進行奇數 倍N分頻時,可以通過在輸入時鐘的上升沿進行計數,當從0計數到(N-l)/2時,輸出時鐘 進行翻轉。利用同樣的方法在輸入時鐘的下降沿產生另一路輸出時鐘,然后把這兩路產生 的時鐘進行相或運算,就可以實現任意的奇數分頻。小數分頻一般采用雙模前置方法來實現。雙模前置方法其原理就是在若干個分頻 周期中采取某種方法使某幾個周期多計或少計一個數,從而在整個計數周期總體平均意義 上獲得一個小數分頻比。這種方法輸出的分頻時鐘相位抖動較大,而且輸出時鐘占空比不 均勻。而且這種方法只是理論上可以獲得任意有理小數分頻,實際上當小數位較多時,會占 用非常多的FPGA資源。所以當小數位數非常多時,基本上不可實現。如上所述,如果按照現有的分頻技術實現一個分數分頻器,必須對分頻數進行區 分,然后用不同的技術方案完成。由此可以看出目前分頻技術方案構成的分數分頻器的主 要缺點有一是整數分頻與小數分頻方案不統一,實現復雜。二是這種分頻器輸出時鐘脈沖 占空比不均勻,輸出時鐘相位抖動較大。三是占用FPGA資源量較多,甚至當小數位數多的 時候,基本不可以實現。
發明內容
鑒于上述現有技術的不足之處,本發明的目的在于提供一種基于FPGA實現的分 數分頻方法以及基于FPGA實現的分數分頻器,其結構簡單、噪聲小、占空比均勻、時鐘相位 抖動小、占用FPGA資源量少。為了達到上述目的,本發明采取了以下技術方案
一種基于FPGA實現的分數分頻方法,其包括步驟a)獲取輸入時鐘信號;b)偵測所述時鐘信號的頻率值;c)根據輸出時鐘頻率要求的最小分辨率為單位確定輸入時鐘頻率值fl和輸出分 頻時鐘頻率值f2。其中,所述步驟c)之后進一步包括誤差判斷更新步驟d)在上電初始化時、在輸入時鐘的頻率發生變化時或者需要分頻之后的輸出時 鐘頻率有變化時,根據fl和f2判斷初始化的誤差,所述判斷誤差的初始化公式為err = 2Xf2-fl,其中err為初始化誤差;e)判斷誤差err是否大于0,如果大于0,執行步驟f),如果小于0,執行步驟g);f)當誤差err大于0,輸出時鐘取反,誤差err更新為err (當前值)=err (上個 時鐘周期更新值)-2xfl+f2,然后執行步驟e);g)當誤差err小于0,誤差err更新為err (當前值)=err (上個時鐘周期更新 值)+4xf2,然后執行步驟e)。其中,所述步驟c),輸入時鐘的頻率值fl和輸出時鐘的頻率值f2為正整數,而且 輸出時鐘的頻率值f2小于輸入時鐘的頻率值fl。其中,在每個輸入時鐘信號的上升沿相當于沿著X軸方向前進一個坐標點,每當 輸入時鐘信號在X軸前進一個坐標點時,則進行所述判斷誤差更新步驟,根據所述判斷誤 差的正負以決定是否沿著Y軸方向前進一個坐標點,每當沿著Y軸方向前進一個坐標點都 要產生一個輸出時鐘信號的沿,其中,輸入時鐘頻率值是X軸坐標點,分頻輸出時鐘頻率值 是Y軸坐標點。一種基于FPGA實現的分數分頻器,其包括時鐘信號獲取單元,用于獲取輸入時鐘信號;頻率值偵測單元,用于偵測所述時鐘信號的頻率值;頻率值確定單元,用于根據輸出時鐘頻率要求的最小分辨率為單位確定輸入時 鐘頻率值fl和輸出分頻時鐘頻率值f2。其中,所述分數分頻器,還包括誤差初始化單元,用于在上電初始化時、在輸入時鐘的頻率發生變化時或者需要 分頻之后的輸出時鐘頻率有變化時,根據fl和f2判斷初始化的誤差,所述判斷誤差的初始 化公式為err = 2Xf2_fl,其中err為初始化誤差;誤差判斷單元,用于對所述初始化誤差進行正負判斷;誤差更新單元,用于根據誤差判斷單元的判斷結果進行不同誤差值的更新;所述時鐘產生單元會根據誤差判斷單元的結果決定輸出時鐘電平的變化。其中,所述誤差更新單元,具體用于當誤差err大于0,輸出時鐘取反,誤差err 更新為err (當前值)=err (上個時鐘周期更新值)_2xf l+f2,然后通過誤差判斷單元對所 述初始化誤差進行正負判斷;當誤差err小于0,誤差err更新為err (當前值)=err (上個時鐘周期更新 值)+4xf2,然后也通過誤差判斷單元對所述初始化誤差進行正負判斷。本發明的有益效果是本發明提供的基于FPGA實現的分數分頻方法以及基于FPGA實現的分數分頻器,實現簡單,不需要知道分頻系數,只需要知道希望得到的分頻之后 的輸出時鐘頻率值;算法實現過程中無需進行計數,只需要根據判斷誤差來決定輸出時鐘 的頻率值。另外,本發明是在輸入時鐘的上升沿判斷輸出時鐘是否進行翻轉,所以輸出時鐘 的相位抖動必然小于輸入時鐘的周期;并且本發明所占用的FPGA資源量更小。本發明和傳 統的整數分頻器、小數分頻器相比較,從根本上解決了這些方法中所存在的實現方案復雜、 占空比不均勻、時鐘相位抖動大等分頻中一直難以解決的問題,在應用中,更加具有優勢。
圖1是現有技術的基于FPGA實現的一般分數分頻器的結構圖。圖2是本發明實施例提供的基于FPGA實現的分數分頻器的結構圖。圖3是本發明實施例提供的基于FPGA實現的分數分頻方法的流程圖。圖4是本發明實施例提供的基于FPGA實現的分數分頻方法工作時序圖。
具體實施例方式本發明實施例提供一種基于FPGA實現的分數分頻方法以及基于FPGA實現的分數 分頻器,把輸入時鐘頻率值和分頻輸出時鐘頻率值當作坐標系上的一個點,其中輸入時鐘 頻率值是X軸坐標點,分頻輸出時鐘頻率值是Y軸坐標點。本發明實施例模擬從原點畫一條直線到此坐標點,其中輸入時鐘在X軸方向運 動,則對應的Y軸方向運動的時鐘就是經過分頻之后的輸出時鐘。在每個輸入時鐘的上升 沿相當于沿著X軸方向前進一個坐標點,每當輸入時鐘在X軸前進一個點,則都要進行判斷 誤差更新,根據判斷誤差的正負以決定是否沿著Y軸方向前進一個坐標點,而每當沿著Y軸 方向前進一個坐標點都要產生一個輸出時鐘的沿。于是經過循環往復,這樣沿著Y軸方向 前進而產生的時鐘輸出就是經過分頻之后的輸出時鐘。由此可以看出,輸出時鐘的電平變 化都要在輸入時鐘的上升沿進行,這樣輸出時鐘的相位不但能夠與輸入時鐘的相位以最小 的相位差保持一致,而且輸出時鐘的占空比也能夠保持著最小的變動。如圖2所示是本發明所述方法實施例的詳細流程圖。該流程圖包括第一步、對輸入時鐘進行頻率偵測,其方法為在FPGA中利用高頻時鐘實時測量輸 入時鐘的時鐘周期,然后將時鐘周期進行倒數,得到輸入時鐘的頻率。得到輸入時鐘的頻率 后,確定輸入時鐘頻率值fl。本實施例以輸入時鐘為8MHz,分頻輸出時鐘為300KHz進行說 明。經FPGA高頻時鐘實時測量,可以得到輸入時鐘的時鐘周期為125ns,然后確定輸入時鐘 為8MHz,根據需要輸出時鐘為300KHz,則fl = 8000, f2 = 300。第二步、根據n和f2初始化判斷誤差,判斷誤差的初始化公式為err = 2 X f2-f 1。在本實施例中,該初始化判斷誤差過程只有在上電初始化或者輸入時鐘頻率變 化或者所要求得到的輸出時鐘頻率變化時才需要進行的,如果這兩個量沒有任何變化,則 不要再進行判斷誤差初始化,否則分頻輸出時鐘將不會正確。第三步、首先應該對初始化誤差的結果進行判斷,根據其是否大于0,進行誤差更 新和時鐘輸出。在本實施例中,需要注意的是,只有在上電初始化和初始化誤差有變化的情 況下,才會根據初始化誤差進行判斷,否則判斷誤差會在每個輸入時鐘上升沿都會被更新。第四步、對判斷誤差進行更新。對誤差的更新一定要在輸入時鐘的上升沿進行。如果誤差err大于0,輸出時鐘取反,誤差err更新為err (當前值)=err (上個時鐘周期更 新值)-2xfl+f2,然后在下一個輸入時鐘上升沿對更新后再進行誤差進行判斷,然后繼續根 據判斷值進行更新;誤差err更新為err (當前值)=err (上個時鐘周期更新值)+4xf2, 然后在下一個輸入時鐘上升沿對更新后的誤差進行判斷,然后繼續根據判斷值進行更新。第五步、進行時鐘輸出。每當輸入時鐘的上升沿到來,相當于輸入時鐘在X軸上前 進一個點,此時是否要在Y軸上前進一個點,即輸出時鐘產生沿的變化,則要取決于判斷誤 差。當誤差大于0,則輸出時鐘電平取反,產生時鐘邊沿;當誤差小于0,則輸出時鐘電平不 進行變化。如此進行循環往復,就可以獲得需要的輸出時鐘。本發明的工作時序如圖4所示。在本發明上述實施例中,所有步驟都是基于FPGA實施。不過由于FPGA中的乘法 器較少,所以在進行誤差初始化和誤差更新時,所涉及到的乘法都由進行向左移位所代替。 另外,fl和f2的數值都要是整數,如果輸入時鐘頻率或者輸出時鐘頻率精確到1Hz以下, 則確定fl和f2的數值的時候,要以時鐘頻率要求的最小分辨率為單位。本發明實施例還提供一種基于FPGA實現的分數分頻器,如圖3所示,其包括時鐘 信號獲取單元,用于獲取輸入時鐘信號;頻率值偵測單元,用于偵測所述時鐘信號的頻率值;頻率值確定單元,用于根據輸出時鐘頻率要求的最小分辨率為單位確定輸入時 鐘頻率值fl和輸出分頻時鐘頻率值f2。頻率值偵測單元對輸入進來的時鐘自動進行頻率 的偵測,該頻率值確定單元根據輸出頻率值f2,確定輸入時鐘頻率值n。例如,偵測得到的 輸入時鐘頻率值是8MHz。如果要求得到的輸出時鐘頻率值f2是1KHZ,則輸入時鐘頻率值 n為8000KHZ,于是n = 8000, f2 = 1 ;如果要求得到的輸出時鐘頻率值f2是1Hz,則輸入 時鐘頻率值fl為8000000Hz,于是fl = 8000000,f2 = 1 ;如果要求得到的輸出時鐘頻率值 f2 是 0. 1Hz,則輸入時鐘頻率值 fl 為 80000000Hz,于是 fl = 80000000,f2 = 1。其中,進一步的實施例中,所述分數分頻器,還包括誤差初始化單元,用于在上電初始化時、在輸入時鐘的頻率發生變化時或者需要 分頻之后的輸出時鐘頻率有變化時,根據fl和f2判斷初始化的誤差,所述判斷誤差的初始 化公式為err = 2Xf2_fl,其中err為初始化誤差;誤差判斷單元,用于對所述初始化誤差進行正負判斷;誤差更新單元,用于根據誤差判斷單元的判斷結果進行不同誤差值的更新;其中, 所述誤差更新單元,具體用于當誤差err大于0,輸出時鐘取反,誤差err更新為err(當 前值)=err ((上個時鐘周期更新值)-2xfl+f2,然后通過誤差判斷單元對所述初始化誤差 進行正負判斷;當誤差err小于0,誤差err更新為err (當前值)=err (上個時鐘周期更新 值)+4xf2,然后也通過誤差判斷單元對所述初始化誤差進行正負判斷。所述時鐘產生單元會根據誤差判斷單元的結果決定輸出時鐘電平的變化,具體 為如果err大于0,輸出時鐘會進行取反;如果err小于0,輸出時鐘不變。該實施例中,輸入時鐘到頻率值確定單元后,頻率值確定單元經過對輸入時鐘的 分析,會確定出輸入時鐘的頻率,然后會根據需要分頻得到的時鐘頻率值f2確定輸入時鐘 的頻率值fl,fl和f2確定之后,開始進入到誤差初始化單元,初始化后的誤差進入到誤差判定單元,根據誤差值的判定去驅動時鐘產生單元,進行時鐘輸出。然后在下一個輸入時鐘 周期進行誤差的更新,誤差更新之后,再進入到誤差判定單元,根據誤差值的判定去驅動時 鐘產生單元,進行時鐘輸出。如此進行循環,就可以得到所需要的分頻之后的時鐘。本發明 的工作時序如圖4所示。 應當理解的是,對本領域普通技術人員來說,可以根據上述說明加以改進或變換, 而所有這些改進和變換都應屬于本發明所附權利要求的保護范圍。
權利要求
一種基于FPGA實現的分數分頻方法,其特征在于,包括步驟a)獲取輸入時鐘信號;b)偵測所述時鐘信號的頻率值;c)根據輸出時鐘頻率要求的最小分辨率為單位確定輸入時鐘頻率值f1和輸出分頻時鐘頻率值f2。
2.如權利要求1所述分數分頻方法,其特征在于,所述步驟c)之后進一步包括誤差判 斷更新步驟d)在上電初始化時、在輸入時鐘的頻率發生變化時或者需要分頻之后的輸出時鐘 頻率有變化時,根據Π和f2判斷初始化的誤差,所述判斷誤差的初始化公式為err = 2Xf2-fl,其中err為初始化誤差;e)判斷誤差err是否大于0,如果大于0,執行步驟f),如果小于0,執行步驟g);f)當誤差err大于0,輸出時鐘取反,誤差err更新為err(當前值)=err (上個時鐘 周期更新值)-2xfl+f2,然后執行步驟e);g)當誤差err小于0,誤差err更新為err(當前值)=err(上個時鐘周期更新 值)+4xf2,然后執行步驟e)。
3.根據權利要求1所述的分數分頻方法,其特征在于,所述步驟c),輸入時鐘的頻率 值fl和輸出時鐘的頻率值f2為正整數,而且輸出時鐘的頻率值f2小于輸入時鐘的頻率值 fl。
4.根據權利要求2所述的分數分頻方法,其特征在于,在每個輸入時鐘信號的上升沿 相當于沿著X軸方向前進一個坐標點,每當輸入時鐘信號在X軸前進一個坐標點時,則進行 所述判斷誤差更新步驟,根據所述判斷誤差的正負以決定是否沿著Y軸方向前進一個坐標 點,每當沿著Y軸方向前進一個坐標點都要產生一個輸出時鐘信號的沿,其中,輸入時鐘頻 率值是X軸坐標點,分頻輸出時鐘頻率值是Y軸坐標點。
5.一種基于FPGA實現的分數分頻器,其特征在于,包括時鐘信號獲取單元,用于獲取輸入時鐘信號;頻率值偵測單元,用于偵測所述時鐘信號的頻率值;以及頻率值確定單元,用于根據輸出時鐘頻率要求的最小分辨率為單位確定輸入時鐘頻 率值fl和輸出分頻時鐘頻率值f2。
6.如權利要求5所述分數分頻器,其特征在于,還包括誤差初始化單元,用于在上電初始化時、在輸入時鐘的頻率發生變化時或者需要分頻 之后的輸出時鐘頻率有變化時,根據Π和f2判斷初始化的誤差,所述判斷誤差的初始化公 式為err = 2Xf2_fl,其中err為初始化誤差;誤差判斷單元,用于對所述初始化誤差進行正負判斷;誤差更新單元,用于根據誤差判斷單元的判斷結果進行不同誤差值的更新;以及所述時鐘產生單元會根據誤差判斷單元的結果決定輸出時鐘電平的變化。
7.如權利要求6所述分數分頻器,其特征在于,所述誤差更新單元,具體用于當誤 差err大于0,輸出時鐘取反,誤差err更新為err(當前值)=err (上個時鐘周期更新 值)-2Xfl+f2,然后通過誤差判斷單元對所述初始化誤差進行正負判斷;當誤差err小于0,誤差err更新為err (當前值)=err (上個時鐘周期更新值)+4xf2,然后也通過誤差判斷單元對所述初始化誤差進行正負判斷。
全文摘要
本發明提供一種基于FPGA實現的分數分頻方法以及分數分頻器,所述分數分頻器包括頻率值確定單元,誤差初始化單元,誤差判定單元,誤差更新單元,時鐘產生單元;其中,輸入時鐘到頻率值確定單元后,頻率值確定單元經過對輸入時鐘的分析,確定出輸入時鐘的頻率,根據需要分頻得到的時鐘頻率值f2確定輸入時鐘的頻率值f1,f1和f2,初始化后的誤差進入到誤差判定單元,根據誤差值的判定去驅動時鐘產生單元,進行時鐘輸出。在下一個輸入時鐘周期進行誤差的更新,誤差更新之后,進入到誤差判定單元,根據誤差值的判定去驅動時鐘產生單元,進行時鐘輸出。該分數分頻器結構簡單、噪聲小、占空比均勻、時鐘相位抖動小、占用FPGA資源量少。
文檔編號H03K23/68GK101997540SQ20091010889
公開日2011年3月30日 申請日期2009年8月11日 優先權日2009年8月11日
發明者凡峻, 張科孟, 李永利 申請人:深圳市英威騰電氣股份有限公司