資源描述:
《verilog_實現(xiàn)任意占空比、任意分頻的方法》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、分頻程序雖然簡單,但我覺得由簡入難是學(xué)習(xí)的一個必然階段,慢慢的我們自然會成長起來。所以如果有時間的話,大家都可以將自己的這種“小程序”貼到論壇上來。如果你的程序好,其他人也可以學(xué)習(xí);如果你的程序有問題,大家可以一起幫你找問題,共同進(jìn)步。還有,我覺得在發(fā)貼的時候,最好能將原理說一下。一來大家看你的貼能學(xué)到東西;二來也方便解答你的問題,不然還得解答者自己去找資料搞懂原理,然后再回答你,回答你問題的人自然也就不多了。說了一些題外話,下面轉(zhuǎn)入正文:在verilog程序設(shè)計中,我們往往要對一個頻率進(jìn)行任意分頻,而且占空比也有一定的要求這樣的話,對
2、于程序有一定的要求,現(xiàn)在我在前人經(jīng)驗的基礎(chǔ)上做一個簡單的總結(jié),實現(xiàn)對一個頻率的任意占空比的任意分頻。比如:我們FPGA系統(tǒng)時鐘是50MHz,而我們要產(chǎn)生的頻率是880Hz,那么,我們需要對系統(tǒng)時鐘進(jìn)行分頻。我們很容易想到用計數(shù)的方式來分頻:50000000/880=56818這個數(shù)字不是2的整冪次方,那么怎么辦呢?我們可以設(shè)定一個參數(shù),讓它到56818的時候重新計數(shù)不就完了嗎?呵呵,程序如下:modulediv(clk,clk_div);inputclk;outputclk_div;reg[15:0]counter;always@(po
3、sedgeclk)if(counter==56817)counter<=0;elsecounter<=counter+1;assignclk_div=counter[15];endmodule//modulediv(clk,rst,clk_div);inputclk,rst;outputregclk_div;reg[15:0]counter;salways@(posedgeclk)if(!rst)begincounter<=0;clk_div<=0;endelseif(counter==56817)begincounter<=0;clk
4、_div<~clk_div;endelsecounter<=counter+1;endmodule下面我們來算一下它的占空比:我們清楚地知道,這個輸出波形在counter為0到32767的時候為低,在32767到56817的時候為高,占空比為40%多一些,如果我們需要占空比為50%,那么怎么辦呢?不用急,慢慢來。我們再設(shè)定一個參數(shù),使它為56817的一半,使達(dá)到它的時候波形翻轉(zhuǎn),那不就完了嗎?呵呵,再看看:modulediv(clk,clk_div);inputclk;outputclk_div;reg[14:0]counter;alw
5、ays@(posedgeclk)if(counter==28408)counter<=0;elsecounter<=counter+1;regclk_div;always@(posedgeclk)if(counter==28408)clk_div<=~clk_div;endmodule占空比是不是神奇地變成50%了呢?呵呵。繼續(xù)讓我們來看如何實現(xiàn)任意占空比,比如還是由50M分頻產(chǎn)生880Hz,而分頻得到的信號的占空比為30%。56818×30%=17045modulediv(clk,reset,clk_div,counter);inpu
6、tclk,reset;outputclk_div;output[15:0]counter;reg[15:0]counter;regclk_div;always@(posedgeclk)if(!reset)counter<=0;elseif(counter==56817)counter<=0;elsecounter<=counter+1;always@(posedgeclk)if(!reset)clk_div<=0;elseif(counter<17045)clk_div<=1;elseclk_div<=0;endmodule三分頻的Ve
7、rilog實現(xiàn)//很實用也是筆試面試時??嫉模呀?jīng)經(jīng)過仿真占空比要求50%和不要求占空比差別會很大,先看一個占空比50%的描述modulediv3(CLKIN,CLKOUT,RESETn);inputCLKIN,RESETn;outputCLKOUT;?//internalcountersignalsreg[1:0]count_a;reg[1:0]count_b;reg?????CLKOUT;?always@(negedgeRESETnorposedgeCLKIN)begin???if(RESETn==1'b0)???????count
8、_a<=2'b00;???else???????if(count_a==2'b10)???????????count_a<=2'b00;???????else???????????count_a<=coun