關於verilog分頻程式

2021-05-22 21:04:39 字數 2788 閱讀 8320

眾所周知,分頻器是fpga設計中使用頻率非常高的基本設計之一,儘管在目前大部分設計中,廣泛使用晶元廠家整合的鎖相環資源,如altera 的pll,xilinx的dll.來進行時鐘的分頻,倍頻以及相移。但是對於時鐘要求不高的基本設計,通過語言進行時鐘的分頻相移仍然非常流行,首先這種方法可以節省晶元內部的鎖相環資源,再者,消耗不多的邏輯單元就可以達到對時鐘操作的目的。另一方面,通過語言設計進行時鐘分頻,可以看出設計者對設計語言的理解程度。因此很多招聘單位在招聘時往往要求應聘者寫乙個分頻器(比如奇數分頻)以考核應聘人員的設計水平和理解程度。下面講講對各種分頻係數進行分頻的方法:

第一,偶數倍分頻:偶數倍分頻應該是大家都比較熟悉的分頻,通過計數器計數是完全可以實現的。如進行n倍偶數分頻,那麼可以通過由待分頻的時鐘觸發計數器計數,當計數器從0計數到n/2-1時,輸出時鐘進行翻轉,並給計數器乙個復位訊號,使得下乙個時鐘從零開始計數。以此迴圈下去。這種方法可以實現任意的偶數分頻。

第二,奇數倍分頻:奇數倍分頻常常在論壇上有人問起,實際上,奇數倍分頻有兩種實現方法:

首先,完全可以通過計數器來實現,如進行三分頻,通過待分頻時鐘上公升沿觸發計數器進行模三計數,當計數器計數到鄰近值進行兩次翻轉,比如可以在計數器計數到1時,輸出時鐘進行翻轉,計數到2時再次進行翻轉。即是在計數值在鄰近的1和2進行了兩次翻轉。這樣實現的三分頻占空比為1/3或者2/3。如果要實現占空比為50%的三分頻時鐘,可以通過待分頻時鐘下降沿觸發計數,和上公升沿同樣的方法計數進行三分頻,然後下降沿產生的三分頻時鐘和上公升沿產生的時鐘進行相或運算,即可得到占空比為50%的三分頻時鐘。這種方法可以實現任意的奇數分頻。歸類為一般的方法為:對於實現占空比為50%的n倍奇數分頻,首先進行上公升沿觸發進行模n計數,計數選定到某乙個值進行輸出時鐘翻轉,然後經過(n-1)/2再次進行翻轉得到乙個占空比非50%奇數n分頻時鐘。再者同時進行下降沿觸發的模n計數,到和上公升沿觸發輸出時鐘翻轉選定值相同值時,進行輸出時鐘時鐘翻轉,同樣經過(n-1)/2時,輸出時鐘再次翻轉生成占空比非50%的奇數n分頻時鐘。兩個占空比非50%的n分頻時鐘相或運算,得到占空比為50%的奇數n分頻時鐘。

另外一種方法:對進行奇數倍n分頻時鐘,首先進行n/2分頻(帶小數,即等於(n-1)/2+0.5),然後再進行二分頻得到。得到占空比為50%的奇數倍分頻。下面講講進行小數分頻的設計方法

第三,小數分頻:首先講講如何進行n+0.5分頻,這種分頻需要對輸入時鐘進行操作。基本的設計思想:對於進行n+0.5分頻,首先進行模n的計數,在計數到n-1時,輸出時鐘賦為『1』,回到計數0時,又賦為0,因此,可以知道,當計數值為n-1時,輸出時鐘才為1,因此,只要保持計數值n-1為半個輸入時鐘週期,即實現了n+0.5分頻時鐘,因此保持n-1為半個時鐘週期即是乙個難點。從中可以發現,因為計數器是通過時鐘上公升沿計數,因此可以在計數為n-1時對計數觸發時鐘進行翻轉,那麼時鐘的下降沿變成了上公升沿。即在計數值為n-1期間的時鐘下降沿變成了上公升沿,則計數值n-1只保持了半個時鐘週期,由於時鐘翻轉下降沿變成上公升沿,因此計數值變為0。因此,每產生乙個n+0.5分頻時鐘的週期,觸發時鐘都是要翻轉一次.

以上是網上一位大神的傑作,http://blog.sina.com.cn/s/blog_4b03202d0100at7i.html

本人在此基礎上實現了任意k(k為大於等於2的自然數)倍分頻,只要輸入乙個k就相應的產生乙個占空比為50%的時鐘,而頻率為輸入時鐘的1/k.主要思想參照上面介紹的,內部兩個計數器,乙個在輸入時鐘上公升沿計數,另乙個在下降沿計數,當計數到k>>1-1和k-1時分別翻轉,這樣可以產生兩個時鐘:上公升沿產生的k分頻時鐘clk1,下降沿產生的k分頻時鐘clk2,當k為奇數時,將兩個時鐘clk1和clk2進行與運算,就可以得出占空比為50%的奇數倍分頻時鐘;而當k為偶數時,取clk1就剛好是分頻好了的,占空比為50%的時鐘。

下面是程式

module m1k(rst_n,clk,k,clkk);

input rst_n;

input clk;

input [3:0] k;

reg clk1;

reg clk2;

output clkk;

reg [3:0] k1;

reg [3:0] k2;

always@(negedge rst_n or posedge clk)

begin

if(~rst_n)

begin

k1 <= 4'b0;

clk1 <= 1'b0;

endelse

begin

if(k1==(k-1))

clk1 <= ~clk1;

if(k1==((k>>1)-1'b1))

clk1 <= ~clk1;

if(k1==k-1)

k1 <= 4'b0000;

else

k1 <= k1+4'b0001;

endend

always@(negedge rst_n or negedge clk)

begin

if(~rst_n)

begin

k2 <= 4'b0;

clk2 <= 1'b0;

endelse

begin

if(k2 == k-1)

k2 <= 4'b0000;

else

k2 <= k2+4'b0001;

if(k2==k-1)

clk2 <= ~clk2;

if(k2==((k>>1)-1'b1))

clk2 <= ~clk2;

endend

assign clkk = (k%2)?clk1&clk2:clk1;

endmodule

下面兩圖是在quartusii7.2中進行**的效果,分別取k=3,和k=4時的**結果。

Verilog 時鐘偶分頻 奇分頻 任意分頻

分頻器是指使輸出訊號頻率為輸入訊號頻率整數分之一的電子電路。偶分頻計數器 偶分頻比較簡單,假設為n分頻,只需計數到n 2 1,然後時鐘翻轉 計數清零,如此迴圈就可以得到n 偶 分頻。如下 module even divider clk in,rst n,even en,偶分頻使能訊號,方便後續設計任...

Verilog的奇偶分頻

這裡參考了兩個部落格,內容大體相同。但是要說一點,這兩個部落格在介紹奇數分頻時,都說了一段話 對於實現占空比為50 的n倍奇數分頻,首先進行上公升沿觸發進行模n計數,計數選定到某乙個值進行輸出時鐘翻轉,然後經過 n 1 2再次進行翻轉得到乙個占空比非50 奇數n分頻時鐘。再者同時進行下降沿觸發的模n...

Verilog設計流水燈(分頻)

在開發板中,有乙個內建的時鐘週期,為100mhz,我們需要使用這樣乙個時鐘訊號來設計乙個1hz的流水燈 使用8個led燈 也就是一秒鐘有乙個燈是亮起的,依次從左到右。另外還有乙個低有效的復位使能端 乙個同步保持使能 有效時流水燈亮起狀況不變 首先,1hz和100mhz的時鐘週期需要進行轉換,然後利用...