<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Altera MAX10: 時(shí)鐘分頻

Altera MAX10: 時(shí)鐘分頻

作者: 時(shí)間:2023-10-27 來(lái)源:電子森林 收藏

在之前的實(shí)驗中我們已經(jīng)熟悉了的各種外設,掌握了verilog的組合邏輯設計,接下來(lái)我們將學(xué)習的設計。

本文引用地址:http://dyxdggzs.com/article/202310/452152.htm

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

1,偶數分頻:偶數倍分頻相對簡(jiǎn)單,比較容易理解。通過(guò)計數器計數是完全可以實(shí)現的。如進(jìn)行N倍偶數分頻,那么通過(guò)時(shí)鐘觸發(fā)計數器計數,當計數器從0計數到N/2-1時(shí),輸出時(shí)鐘進(jìn)行翻轉,以此循環(huán)下去。

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

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

// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name    : divide.v// Module name  : divide
// Author       : STEP
// Description  : clock divider// Web          : www.stepfpga.com 
// 
// --------------------------------------------------------------------
// Code Revision History : 
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2017/03/02   |Initial ver
// --------------------------------------------------------------------
// Module Function:任意整數 
module divide (	clk,rst_n,clkout);         
input 	clk,rst_n;                       //輸入信號,其中clk連接到FPGA的C1腳,頻率為12MHz
        output	clkout;                          //輸出信號,可以連接到LED觀(guān)察分頻的時(shí)鐘         
        
        //parameter是verilog里常數語(yǔ)句
        
	parameter	WIDTH	= 3;             //計數器的位數,計數的最大值為 2**WIDTH-1
	parameter	N	= 5;             //分頻系數,請確保 N < 2**WIDTH-1,否則計數會(huì )溢出 	
	reg 	[WIDTH-1:0]	cnt_p,cnt_n;     //cnt_p為上升沿觸發(fā)時(shí)的計數器,cnt_n為下降沿觸發(fā)時(shí)的計數器
	reg			clk_p,clk_n;     //clk_p為上升沿觸發(fā)時(shí)分頻時(shí)鐘,clk_n為下降沿觸發(fā)時(shí)分頻時(shí)鐘 	
	
	//上升沿觸發(fā)時(shí)計數器的控制
	
	always @ (posedge clk or negedge rst_n )         //posedge和negedge是verilog表示信號上升沿和下降沿
                                                         //當clk上升沿來(lái)臨或者rst_n變低的時(shí)候執行一次always里的語(yǔ)句
		begin
			if(!rst_n)
				cnt_p<=0;
			else if (cnt_p==(N-1))
				cnt_p<=0;
			else cnt_p<=cnt_p+1;             //計數器一直計數,當計數到N-1的時(shí)候清零,這是一個(gè)模N的計數器
		end          //上升沿觸發(fā)的分頻時(shí)鐘輸出,如果N為奇數得到的時(shí)鐘占空比不是50%;如果N為偶數得到的時(shí)鐘占空比為50%
         always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				clk_p<=0;
			else if (cnt_p<(N>>1))          //N>>1表示右移一位,相當于除以2去掉余數
				clk_p<=0;
			else 
				clk_p<=1;               //得到的分頻時(shí)鐘正周期比負周期多一個(gè)clk時(shí)鐘
		end         //下降沿觸發(fā)時(shí)計數器的控制        	
	always @ (negedge clk or negedge rst_n)
		begin
			if(!rst_n)
				cnt_n<=0;
			else if (cnt_n==(N-1))
				cnt_n<=0;
			else cnt_n<=cnt_n+1;
		end         //下降沿觸發(fā)的分頻時(shí)鐘輸出,和clk_p相差半個(gè)時(shí)鐘
	always @ (negedge clk)
		begin
			if(!rst_n)
				clk_n<=0;
			else if (cnt_n<(N>>1))  
				clk_n<=0;
			else 
				clk_n<=1;                //得到的分頻時(shí)鐘正周期比負周期多一個(gè)clk時(shí)鐘
		end         assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;      //條件判斷表達式
                                                                    //當N=1時(shí),直接輸出clk
                                                                    //當N為偶數也就是N的最低位為0,N(0)=0,輸出clk_p
                                                                    //當N為奇數也就是N最低位為1,N(0)=1,輸出clk_p&clk_n。正周期多所以是相與
        endmodule

測試文件,進(jìn)行功能仿真時(shí)需要編寫(xiě)testbench測試文件。verilog里的testbench文件和源文件一樣也是.v文件,仿真能讓我們更直觀(guān)的觀(guān)察信號波形,可以先閱讀Diamond的使用了解如何使用Diamond中集成的仿真工具。

// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name    : divide_tb.v
// Module name  : divide_tb
// Author       : STEP
// Description  : clock divider
// Web          : www.stepfpga.com 
// 
// --------------------------------------------------------------------
// Code Revision History : 
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2017/03/02   |Initial ver
// --------------------------------------------------------------------
// Module Function:divide.v時(shí)鐘分頻器的測試文件           
          `timescale 1ns/100ps                             //仿真時(shí)間單位/時(shí)間精度,時(shí)間單位要大于或者等于時(shí)間精度           
          module divide_tb();                              //測試文件也是一個(gè)module,因為用于仿真所以無(wú)需輸入輸出信號           
          reg    clk,rst_n;                                //需要產(chǎn)生的激勵信號定義,激勵信號需要過(guò)程塊產(chǎn)生所以定義為reg型變量
          wire   clkout;                                   //需要觀(guān)察的輸出信號定義,定義為wire型變量           
          
          //初始化過(guò)程塊
          
          initial 
	  begin 
		 clk = 0;
		 rst_n = 0;
		 #25                                      //#表示延時(shí)25個(gè)時(shí)間單位
		 rst_n = 1;                               //產(chǎn)生了一個(gè)初始25ns低電平,然后變高電平的復位信號
	  end           
	  always #10 clk = ~clk;                          //每隔10ns翻轉一次clk信號,也就是產(chǎn)生一個(gè)時(shí)鐘周期20ns的clk,頻率為50MHz             
	  
	  //module調用例化格式
	  
          divide  #(.WIDTH(4),.N(11))  u1 (                         
          //#后面的()中為參數傳遞,如果不傳遞參數就是所調用模塊中的參數默認值
          //divide表示所要例化的module名稱(chēng),u1是我們定義的例化名稱(chēng),必須以字母開(kāi)頭
						.clk	(clk),     
						//輸入輸出信號連接。 .clk表示module本身定義的信號名稱(chēng);(clk)表示我們在這里定義的激勵信號
						.rst_n	(rst_n),   
						//在testbench里定義的信號名稱(chēng)可以與所要調用module的端口信號名稱(chēng)不同
						.clkout	(clkout)   
					  );
         endmodule

上的系統時(shí)鐘連接到FPGA的C1腳,時(shí)鐘為12MHz。你可以通過(guò)仿真波形觀(guān)察分頻時(shí)鐘(注意仿真的時(shí)間是有限的,所以分頻時(shí)鐘頻率需要較高)。如果我們想通過(guò)眼睛觀(guān)察LED的閃爍,那么需要設置參數N和WIDTH得到一個(gè)頻率較低的時(shí)鐘(例如N=12000000,WIDTH=24,分頻時(shí)鐘周期為1秒)。

信號引腳
clkJ5
rst_nJ9
clkoutN15

修改程序中的分頻系數和計數器位數就能夠調整LED閃爍速度(注意計數的最大值一定要保證超過(guò)分頻系數N)。

在本實(shí)驗學(xué)習了如何進(jìn)行任意整數的分頻設計,我們產(chǎn)生各種時(shí)鐘,通過(guò)修改程序還能實(shí)驗調整輸出時(shí)鐘的頻率、相位以及占空比,非常靈活。同時(shí)學(xué)習了如何編寫(xiě)testbench文件,了解verilog中如何例化module,在后面的學(xué)習中將會(huì )經(jīng)常用到。在下個(gè)實(shí)驗我們將進(jìn)一步了解,如何利用時(shí)鐘來(lái)進(jìn)一步設計,請看最常見(jiàn)的LED流水燈。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>