新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > 實驗17:分頻器

        實驗17:分頻器

        作者: 時間:2023-10-12 來源:電子森林 收藏

        設計一個任意整數

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

        時鐘信號的處理是的特色之一,因此也是設計中使用頻率非常高的基本設計之一。一般在FPGA中都有集成的鎖相環可以實現各種時鐘的分頻和倍頻設計,但是通過語言設計進行時鐘分頻是最基本的訓練,在對時鐘要求不高的設計時也能節省鎖相環資源。在本實驗中我們將實現任意整數的分頻器,分頻的時鐘保持50%占空比。 

        1,偶數分頻:偶數倍分頻相對簡單,比較容易理解。通過計數器計數是完全可以實現的。如進行N倍偶數分頻,那么通過時鐘觸發計數器計數,當計數器從0計數到N/2-1時,輸出時鐘進行翻轉,以此循環下去。

        2,奇數分頻: 如果要實現占空比為50%的奇數倍分頻,不能同偶數分頻一樣計數器記到一半的時候輸出時鐘翻轉,那樣得不到占空比50%的時鐘。以待分頻時鐘CLK為例,如果以偶數分頻的方法來做奇數分頻,在CLK上升沿觸發,將得到不是50%占空比的一個時鐘信號(正周期比負周期多一個時鐘或者少一個時鐘);但是如果在CLK下降沿也觸發,又得到另外一個不是50%占空比的時鐘信號,這兩個時鐘相位正好相差半個CLK時鐘周期通過這兩個時鐘信號進行邏輯運算我們可以巧妙的得到50%占空比的時鐘。

        總結如下:對于實現占空比為50%的N倍奇數分頻,首先進行上升沿觸發進行模N計數,計數選定到某一個值進行輸出時鐘翻轉,然后經過(N-1)/2再次進行翻轉得到一個占空比非50%奇數n分頻時鐘。再者同時進行下降沿觸發的模N計數,到和上升沿觸發輸出時鐘翻轉選定值相同值時,進行輸出時鐘時鐘翻轉,同樣經過(N-1)/2時,輸出時鐘再次翻轉生成占空比非50%的奇數n分頻時鐘。兩個占空比非50%的n分頻時鐘進行邏輯運算(正周期多的相與,負周期多的相或),得到占空比為50%的奇數n分頻時鐘。

        用行為級描述任意整數分頻器
        程序清單divide.v

         module divide #
         (								//parameter是verilog里參數定義
         parameter	WIDTH	=	24,		//計數器的位數,計數的最大值為 2**(WIDTH-1)
         parameter	N		=	12_000_000		//分頻系數,請確保 N<2**(WIDTH-1),否則計數會溢出
         )
         (
         input		clk,		//clk連接到FPGA的C1腳,頻率為12MH
         zinput		rst_n,		//復位信號,低有效,
         output		clkout		//輸出信號,可以連接到LED觀察分頻的時鐘
         ); 
         reg	[WIDTH-1:0]	cnt_p,cnt_n;	//cnt_p為上升沿觸發時的計數器,cnt_n為下降沿觸發時的計數器
         reg	clk_p,clk_n;	//clk_p為上升沿觸發時分頻時鐘,clk_n為下降沿觸發時分頻時鐘 
         /**********上升沿觸發部分**************************************/
         //上升沿觸發時計數器的控制
         always @(posedge clk or negedge rst_n)	//posedge和negedge是verilog表示信號上升沿和下降沿
        	begin		//當clk上升沿來臨或者rst_n變低的時候執行一次always里的語句
        		if(!rst_n)
        			cnt_p <= 1'b0;
        		else if(cnt_p == (N-1))
        			cnt_p <= 1'b0;
        		else 
        			cnt_p <= cnt_p + 1'b1;		//計數器一直計數,當計數到N-1的時候清零,這是一個模N的計數器
        	end 
        //上升沿觸發的分頻時鐘輸出,如果N為奇數得到的時鐘占空比不是50%;如果N為偶數得到的時鐘占空比為50%
        always @(posedge clk or negedge rst_n)
        	begin
        		if(!rst_n)
        			clk_p <= 1'b0;
        		else if(cnt_p < (N>>1))			//N>>1表示右移一位,相當于除以2取商
        			clk_p <= 1'b0;
        		else 
        			clk_p <= 1'b1;		//得到的分頻時鐘正周期比負周期多一個clk時鐘
        	end
        	/*****************下降沿觸發部分**************************************/
        	//下降沿觸發時計數器的控制        	
        	always @(negedge clk or negedge rst_n)
        	begin
        		if(!rst_n)
        			cnt_n <= 1'b0;
        		else if(cnt_n == (N-1))
        			cnt_n <= 1'b0;
        		else 
        			cnt_n <= cnt_n + 1'b1;
        	end 
        	//下降沿觸發的分頻時鐘輸出,和clk_p相差半個clk時鐘
        always @(negedge clk or negedge rst_n)
        	begin
        		if(!rst_n)
        			clk_n <= 1'b0;
        		else if(cnt_n < (N>>1))  
        			clk_n <= 1'b0;
        		else 
        			clk_n <= 1'b1;	//得到的分頻時鐘正周期比負周期多一個clk時鐘
        	end
        	/*************************************************************************/
        	wire	clk1 = clk;				//當N=1時,直接輸出clk
        	wire	clk2 = clk_p;			//當N為偶數也就是N的最低位為0,N[0]=0,輸出clk_p
        	wire	clk3 = clk_p & clk_n;	//當N為奇數也就是N最低位為1,N[0]=1,輸出clk_p&clk_n。正周期多所以是相與 
        	assign clkout = (N==1)? clk1:(N[0]? clk3:clk2);	//條件判斷表達式
        	endmodule
        1. 打開,建立工程。
        2. 新建設計文件,并鍵入設計代碼。
        3. 根據邏輯綜合并分配管腳,在本實驗中引腳分配如下:clk—C1,rst_n—L14,clkout—N13
        4. 如果仿真無誤,構建并輸出編程文件,燒寫至FPGA的Flash之中。
        5. 觀察輸出結果。




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 凉山| 天峨县| 嵊州市| 建瓯市| 田东县| 临桂县| 济阳县| 龙胜| 健康| 扬中市| 武陟县| 沂南县| 洛宁县| 新野县| 昆山市| 平邑县| 巴彦淖尔市| 长沙县| 于都县| 武川县| 边坝县| 太仓市| 离岛区| 平顶山市| 无极县| 台中市| 奉贤区| 子洲县| 丰镇市| 惠州市| 石河子市| 庐江县| 潼南县| 沙田区| 建平县| 梅河口市| 耿马| 杨浦区| 河津市| 江陵县| 泌阳县|