日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

n分频器 verilog_基于Verilog的分频器实现

發(fā)布時間:2024/8/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 n分频器 verilog_基于Verilog的分频器实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分頻器是指使輸出信號頻率為輸入信號頻率整數(shù)分之一的電子電路。在許多電子設備中如電子鐘、頻率合成器等,需要各種不同頻率的信號協(xié)同工作,常用的方法是以穩(wěn)定度高的晶體振蕩器為主振源,通過變換得到所需要的各種頻率成分,分頻器是一種主要變換手段。早期的分頻器多為正弦分頻器,隨著數(shù)字集成電路的發(fā)展,脈沖分頻器(又稱數(shù)字分頻器)逐漸取代了正弦分頻器。下面以Verilog HDL語言為基礎介紹占空比為50%的分頻器。

1偶分頻

偶分頻比較簡單,假設為N分頻,只需計數(shù)到N/2-1,然后時鐘翻轉、計數(shù)清零,如此循環(huán)就可以得到N(偶)分頻。代碼如下。

module fp_even(clk_out,clk_in,rst);

output clk_out;

input clk_in;

input rst;

reg [1:0] cnt;

reg clk_out;

parameter N=6;

always @ (posedge clk_in or negedge rst)

begin

if(!rst)

begin

cnt <= 0;

clk_out <= 0;

end

else begin

if(cnt==N/2-1)

begin clk_out <= !clk_out; cnt<=0; end

else

cnt <= cnt + 1;

end

end

endmodule

可以通過改變參量N的值和計數(shù)變量cnt的位寬實現(xiàn)任意偶分頻。

偶分頻(N=6)的RTL原理圖:

偶分頻(N=6)的行為仿真結果:

2奇分頻

實現(xiàn)奇數(shù)(N)分頻,分別用上升沿計數(shù)到(N-1)/2,再計數(shù)到N-1;用下降沿計數(shù)到(N-1)/2,再計數(shù)到N-1,得到兩個波形,然后把它們相或即可得到N分頻。代碼如下:

module fp_odd(clk_out,clk_p,clk_n,clk_in,rst);

output clk_out;

output clk_p,clk_n;

input clk_in,rst;

reg [2:0] cnt_p,cnt_n;

reg clk_p,clk_n;

parameter N=5;

always @ (posedge clk_in or negedge rst)

begin

if(!rst)cnt_p <= 0;

elseif(cnt_p==N-1)cnt_p <=0;

else cnt_p <= cnt_p + 1;

end

always @ (posedge clk_in or negedge rst)

begin

if(!rst) clk_p <= 0;

else if(cnt_p==(N-1)/2)

clk_p <= !clk_p;

else if(cnt_p==N-1)

clk_p <= !clk_p;

end

always @ (negedge clk_in or negedge rst)

begin

if(!rst)cnt_n <= 0;

elseif(cnt_n==N-1)cnt_n <=0;

else cnt_n <= cnt_n + 1;

end

always @ (negedge clk_in or negedge rst)

begin

if(!rst) clk_n <= 0;

else if(cnt_n==(N-1)/2)

clk_n <= !clk_n;

else if(cnt_n==N-1)

clk_n <= !clk_n;

end

assign clk_out = clk_p | clk_n;

endmodule

RTL Schematic:

Simulate Behavioral Model:

同理,可以通過改變參量N的值和計數(shù)變量cnt_p和cnt_n的位寬實現(xiàn)任意奇分頻。

3任意占空比的任意分頻

在verilog程序設計中,我們往往要對一個頻率進行任意分頻,而且占空比也有一定的要求這樣的話,對于程序有一定的要求,現(xiàn)在在前面兩個實驗的基礎上做一個簡單的總結,實現(xiàn)對一個頻率的任意占空比的任意分頻。

比如:FPGA系統(tǒng)時鐘是50M Hz,而我們要產生的頻率是880Hz,那么,我們需要對系統(tǒng)時鐘進行分頻。很容易想到用計數(shù)的方式來分頻:50000000/880 = 56818。顯然這個數(shù)字不是2的整冪次方,那么我們可以設定一個參數(shù),讓它到56818的時候重新計數(shù)就可以實現(xiàn)了。程序如下:

module div(clk, clk_div);

input clk;

output clk_div;

reg [15:0] counter;

always @(posedge clk)

if(counter==56817) counter <= 0;

else counter <= counter+1;

assign clk_div = counter[15];

endmodule

分頻的應用很廣泛,一般的做法是先用高頻時鐘計數(shù),然后使用計數(shù)器的某一位輸出作為工作時鐘進行其他的邏輯設計,上面的程序就是一個體現(xiàn)。

下面我們來算一下它的占空比:我們清楚地知道,這個輸出波形在counter為0到32767的時候為低,在32768到56817的時候為高,占空比為40%多一些,如果我們需要占空比為50%,那么我們需要再設定一個參數(shù),使它為56817的一半,使達到它的時候波形翻轉,就可以實現(xiàn)結果了。程序如下:

module div(clk, clk_div);

input clk;

output clk_div;

reg [14:0] counter;

always @(posedge clk)

if(counter==28408) counter <= 0;

else counter <= counter+1;

reg clk_div;

always @(posedge clk)

if(counter==28408) clk_div <= ~clk_div;

endmodule

繼續(xù)讓我們來看如何實現(xiàn)任意占空比,比如還是由50 M分頻產生880Hz,而分頻得到的信號的占空比為30%。

56818×30%=17045

module div(clk,reset,clk_div,counter);

input clk,reset;

output clk_div;

output [15:0] counter;

reg [15:0] counter;

reg clk_div;

always @(posedge clk)

if(!reset) counter <= 0;

else if(counter==56817) counter <= 0;

else counter <= counter+1;

always @(posedge clk)

if(!reset) clk_div <= 0;

else if(counter<17045) clk_div <= 1;

else clk_div <= 0;

endmodule

RTL級描述:

仿真結果:

4小結

通過以上幾個例子對比不難發(fā)現(xiàn),借助計數(shù)器來實現(xiàn)任意點空比的任意分頻的方法簡單,且用verilog語言進行行為描述時,代碼簡潔、易懂、通用。通過以上的學習,對分頻器有了比較深刻的認識,將在以后的學習中會有廣泛的應用。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的n分频器 verilog_基于Verilog的分频器实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。