新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于FPGA的任意分頻器設計

        基于FPGA的任意分頻器設計

        作者: 時間:2014-08-15 來源:網絡 收藏

          1、前言

        本文引用地址:http://www.104case.com/article/261789.htm

          設計中使用頻率非常高的基本單元之一。盡管目前在大部分設計中還廣泛使用集成鎖相環(如Altera的,Xilinx的DLL)來進行時鐘的分頻、倍頻以及相移設計,但是,對于時鐘要求不太嚴格的設計,通過自主設計進行時鐘分頻的實現方法仍然非常流行。首先這種方法可以節省鎖相環資源,再者這種方式只消耗不多的邏輯單元就可以達到對時鐘的操作目的。

          2、整數倍的設計

          2.1 偶數倍分頻

          偶數倍的實現非常簡單,只需要一個計數器進行計數就能實現。如需要N分頻器(N為偶數),就可以由待分頻的時鐘觸發計數器進行計數,當計數器從0計數到N/2-1時,將輸出時鐘進行翻轉,并給計數器一個復位信號,以使下一個時鐘開始從零計數。以此循環,就可以實現偶數倍分頻。以10分頻為例,相應的verilog代碼如下:

          regclk_div10;

          reg [2:0]cnt;

          always@(posedge clk or posedge rst) begin

          if(rst)begin //復位

          cnt<=0;

          clk_div10<=0;

          end

          elseif(cnt==4) begin

          cnt<=0; //清零

          clk_div10<=~clk_div10; //時鐘翻轉

          end

          else

          cnt<=cnt+1;

          end

          2.2 奇數倍分頻

          奇數倍分頻因占空比不同,主要有以下兩種方法。對于非50%占空比的分頻,與偶數倍分頻類似,只需要一個計數器就能實現特定占空比的時鐘分頻。如需要1/11占空比的十一分頻時鐘,可以在計數值為9和10時均進行時鐘翻轉,該方法也是產生抽樣脈沖的有效方法。相應的verilog代碼如下:

          always @(posedge clk or posedge rst) begin

          if(rst)begin //復位

          cnt<=0;

          clk_div11<=0;

          end

          elseif(cnt==9) begin

          clk_div11<=~clk_div11; //時鐘翻轉

          cnt<=cnt+1; //繼續計數

          end

          elseif(cnt==10) begin

          clk_div11<=~clk_div11; //時鐘翻轉

          cnt<=0; //計數清零

          end

          else

          cnt<=cnt+1;

          end

          對于50%奇數分頻器的設計,用到的思維是錯位半個時鐘并相或運算。具體實現步驟如下:分別利用待分頻時鐘的上升沿與下降沿進行((N-1)/2)/N分頻,最后將這兩個時鐘進行或運算即可。以三分頻為例,相應的電路原理圖和時序仿真圖如圖1和圖2所示,相應代碼如下:

          reg clk1;

          reg[1:0]cnt1;

          always@(posedge clk or posedge rst) begin

          if(rst)begin //復位

          cnt1<=0;

          clk1<=0;

          end

          elseif(cnt1==1) begin

          clk1<=~clk1; //時鐘翻轉

          cnt1<=cnt1+1; //繼續計數

          end

          elseif(cnt1==2) begin

          clk1<=~clk1; //時鐘翻轉

          cnt1<=0; //計數清零

          end

          else

          cnt1<=cnt1+1;

          end

          reg clk2;

          reg[1:0]cnt2;

          always@(negedge clk or posedge rst) begin

          if(rst)begin //復位

          cnt2<=0;

          clk2<=0;

          end

          elseif(cnt2==1) begin

          clk2<=~clk2; //時鐘翻轉

          cnt2<=cnt2+1; //繼續計數

          end

          elseif(cnt2==2) begin

          clk2<=~clk2; //時鐘翻轉

          cnt2<=0; //計數清零

          end

          else

          cnt2<=cnt2+1;

          end

          assignclk_div3=clk1 | clk2; //或運算

          

         

          圖1 50%占空比的三分頻電路原理圖

          

         

          圖2 50%占空比的三分頻時序仿真圖

        fpga相關文章:fpga是什么


        分頻器相關文章:分頻器原理
        塵埃粒子計數器相關文章:塵埃粒子計數器原理
        鎖相環相關文章:鎖相環原理
        全息投影相關文章:全息投影原理

        上一頁 1 2 下一頁

        關鍵詞: FPGA 分頻器 PLL

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 海口市| 武强县| 汨罗市| 汶上县| 揭东县| 泗洪县| 黔西| 略阳县| 夹江县| 南召县| 台江县| 屏东县| 承德市| 濉溪县| 定南县| 汉寿县| 五指山市| 阿克陶县| 承德市| 肥乡县| 绵竹市| 衡南县| 利辛县| 扎赉特旗| 油尖旺区| 南阳市| 融水| 临清市| 保德县| 津市市| 葫芦岛市| 潞城市| 师宗县| 泊头市| 灵山县| 和静县| 长子县| 峡江县| 荆门市| 泸西县| 晴隆县|