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

2021-10-09 15:21:22 字數 3369 閱讀 3253

分頻器是指使輸出訊號頻率為輸入訊號頻率整數分之一的電子電路。

偶分頻計數器

偶分頻比較簡單,假設為n分頻,只需計數到n/2-1,然後時鐘翻轉、計數清零,如此迴圈就可以得到n(偶)分頻。**如下:

module even_divider(

clk_in,

rst_n,

even_en,//偶分頻使能訊號,方便後續設計任意分頻計數器

div,

clk_out

); input clk_in;//時鐘輸入

input rst_n;//非同步復位 低有效

input even_en;//偶分頻使能訊號,方便後續設計任意分頻計數器

input [3:0]div;//分頻值,此處設計分頻範圍為1-63

output reg clk_out;//分頻後,時鐘輸出

reg [3:0]div_cnt;//分頻計數器

always@(posedge clk_in or negedge rst_n)

if(!rst_n) begin

div_cnt <= 4'd0;

clk_out <= 0;

endelse if(even_en) begin

if(div_cnt == (div/2 - 1'b1)) begin

div_cnt <= 4'd0;

clk_out <= ~clk_out;

endelse begin

div_cnt <= div_cnt + 1'b1;

clk_out <= clk_out;

endend

else begin

div_cnt <= 4'd0;

clk_out <= 0;

end

endmodule

奇分頻計數器實現奇數n分頻,分別用上公升沿計數到(n-1)/2,時鐘翻轉,再計數到n-1,時鐘翻轉;用下降沿計數到(n-1)/2,時鐘翻轉,再計數到n-1,時鐘翻轉,得到兩個波形,然後把它們相或即可得到n分頻。**如下:

module odd_divider(

clk_in,

rst_n,

odd_en,

div,

clk_p,

clk_n,

clk_out

);input clk_in;//時鐘輸入

input rst_n;//非同步復位,低電平有效

input odd_en;//奇分頻使能訊號

input [3:0]div;//分頻係數

output reg clk_p;//上公升沿計數,時鐘輸出

output reg clk_n;//下降沿計數,時鐘輸出

output clk_out;//奇分頻時鐘輸出

reg [3:0]cnt_p,cnt_n;//分頻計數器

always@(posedge clk_in or negedge rst_n)

if(!rst_n)

cnt_p <= 4'd0;

else if(odd_en == 1) begin

if(cnt_p == (div - 1'b1))

cnt_p <= 4'd0;

else

cnt_p <= cnt_p + 1'b1;

endelse

cnt_p <= 4'd0;

always@(posedge clk_in or negedge rst_n)

if(!rst_n)

clk_p <= 0;

else if(cnt_p == (div-1'b1)/2)

clk_p <= ~clk_p;

else if(cnt_p == (div-1'b1))

clk_p <= ~clk_p;

else

clk_p <= clk_p;

always@(negedge clk_in or negedge rst_n)

if(!rst_n)

cnt_n <= 4'd0;

else if(odd_en == 1) begin

if(cnt_n == (div - 1'b1))

cnt_n <= 4'd0;

else

cnt_n <= cnt_n + 1'b1;

endelse

cnt_n <= 4'd0;

always@(negedge clk_in or negedge rst_n)

if(!rst_n)

clk_n <= 0;

else if(cnt_n== (div-1'b1)/2)

clk_n <= ~clk_n;

else if(cnt_n == (div-1'b1))

clk_n <= ~clk_n;

else

clk_n <= clk_n;

assign clk_out = clk_p | clk_n;

endmodule

任意分頻計數器通過頂層檔案例化上述偶分頻計數器模組和奇分頻計數器模組即可實現任意分頻。

module clk_divider(

clk,

rst_n,

div,

clk_div

);input clk;

input rst_n;

input [3:0]div;

output clk_div;

wire odd_en;

wire clk_even;

wire clk_odd;

assign odd_en = div[0]?1'b1:1'b0;//判斷分頻係數的奇偶

assign clk_div = div[0]?clk_odd:clk_even;//根據分頻奇偶確定輸出

even_divider even_divider(

.clk_in(clk),

.rst_n(rst_n),

.even_en(!odd_en),

.div(div),

.clk_out(clk_even)

);

odd_divider odd_divider(

.clk_in(clk),

.rst_n(rst_n),

.odd_en(odd_en),

.div(div),

.clk_p(),

.clk_n(),

.clk_out(clk_odd)

);endmodule

rtl檢視

分頻器設計(一)偶分頻

目錄 一 2 n的偶分頻器設計 這種級聯觸發器的方式優缺點分析 二 任意偶數的分頻器設計 所謂 分頻 就是把輸入訊號的頻率變成成倍數地低於輸入頻率的輸出訊號。數位電路中的分頻器主要是分為兩種 整數分頻和小數分頻。其中整數分頻又分為偶分頻和奇分頻,首先從偶分頻開始吧,入門先從簡單的開始!先來看最簡單的...

FPGA 時鐘分頻

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

關於verilog分頻程式

眾所周知,分頻器是fpga設計中使用頻率非常高的基本設計之一,儘管在目前大部分設計中,廣泛使用晶元廠家整合的鎖相環資源,如altera 的pll,xilinx的dll.來進行時鐘的分頻,倍頻以及相移。但是對於時鐘要求不高的基本設計,通過語言進行時鐘的分頻相移仍然非常流行,首先這種方法可以節省晶元內部...