?? verilog _renyifenpin.txt
字號:
自己在網上找的,感覺很不錯。。。。。
分頻程序雖然簡單,但我覺得由簡入難是學習的一個必然階段,慢慢的我們自然會成長起來。所以如果有時間的話,大家 都可以將自己的這種“小程序”貼到論壇上來。如果你的程序好,其他人也可以學習;如果你的程序有問題,大家可以一起幫你找問題,共同進步。還有,我覺得在 發貼的時候,最好能將原理說一下。一來大家看你的貼能學到東西;二來也方便解答你的問題,不然還得解答者自己去找資料搞懂原理,然后再回答你,回答你問題 的人自然也就不多了。
說了一些題外話,下面轉入正文:
在verilog程序設計中,我們往往要對一個頻率進行任意分頻,而且占空比也有一定的要求這樣的話,對于程序有一定的要求,現在我在前人經驗的基礎上做一個簡單的總結,實現對一個頻率的任意占空比的任意分頻。
比如:我們FPGA系統時鐘是50M Hz,而我們要產生的頻率是880Hz,那么,我們需要對系統時鐘進行分頻。我們很容易想到用計數的方式來分頻:
50000000/880 = 56818
這個數字不是2的整冪次方,那么怎么辦呢?我們可以設定一個參數,讓它到56818的時候重新計數不就完了嗎?呵呵,程序如下:
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
下面我們來算一下它的占空比:我們清楚地知道,這個輸出波形在counter為0到32767的時候為低,在32767到56817的時候為高,占空比為40%多一些,如果我們需要占空比為50%,那么怎么辦呢?不用急,慢慢來。
我們再設定一個參數,使它為56817的一半,使達到它的時候波形翻轉,那不就完了嗎?呵呵,再看看:
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
占空比是不是神奇地變成50%了呢?呵呵。
繼續讓我們來看如何實現任意占空比,比如還是由50 M 分頻產生880 Hz,而分頻得到的信號的占空比為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
怎么樣?神奇吧!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -