Verilog-實(shí)現(xiàn)任意占空比、任意分頻的方法_第1頁(yè)
Verilog-實(shí)現(xiàn)任意占空比、任意分頻的方法_第2頁(yè)
Verilog-實(shí)現(xiàn)任意占空比、任意分頻的方法_第3頁(yè)
Verilog-實(shí)現(xiàn)任意占空比、任意分頻的方法_第4頁(yè)
Verilog-實(shí)現(xiàn)任意占空比、任意分頻的方法_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、分頻程序雖然簡(jiǎn)單,但我覺(jué)得由簡(jiǎn)入難是學(xué)習(xí)的一個(gè)必然階段,慢慢的我們自然會(huì)成長(zhǎng)起來(lái)。所以如果有時(shí)間的話,大家都可以將自己的這種“小程序”貼 到論壇上來(lái)。如果你的程序好,其他人也可以學(xué)習(xí);如果你的程序有問(wèn)題,大家 可以一起幫你找問(wèn)題,共同進(jìn)步。還有,我覺(jué)得在 發(fā)貼的時(shí)候,最好能將原理 說(shuō)一下。一來(lái)大家看你的貼能學(xué)到東西;二來(lái)也方便解答你的問(wèn)題,不然還得解答者自己去找資料搞懂原理,然后再回答你,回答你問(wèn)題 的人自然也就不多了。說(shuō)了一些題外話,下面轉(zhuǎn)入正文:在verilog程序設(shè)計(jì)中,我們往往要對(duì)一個(gè)頻率進(jìn)行任意分頻,而且占空比 也有一定的要求這樣的話,對(duì)于程序有一定的要求,現(xiàn)在我在前人經(jīng)驗(yàn)的基礎(chǔ)上

2、做一個(gè)簡(jiǎn)單的總結(jié),實(shí)現(xiàn)對(duì)一個(gè)頻率的任意占空比的任意分頻。比如:我們FPGA系統(tǒng)時(shí)鐘是50M Hz,而我們要產(chǎn)生的頻率是880Hz,那 么,我們需要對(duì)系統(tǒng)時(shí)鐘進(jìn)行分頻。我們很容易想到用計(jì)數(shù)的方式來(lái)分頻:50000000/880 = 56818這個(gè)數(shù)字不是2的整幕次方,那么怎么辦呢?我們可以設(shè)定一個(gè)參數(shù),讓它到56818的時(shí)候重新計(jì)數(shù)不就完了嗎?呵呵,程序如下:module div(clk, clk_div);input clk;output clk_div;reg 15:0 counter;always (posedge clk)if(counter=56817) counter <= 0

3、;else counter <= counter+1;assign clk_div = counter15;endmodule/module div(clk,rst,clk_div);input clk,rst;output reg clk_div;reg15:0 counter;salways(posedge clk)if(!rst)begincounter<=0;clk_div<=0;endelse if (counter=56817)begincounter<=0;clk_div<clk_div;endelsecounter<=counter+1;en

4、dmodule下面我們來(lái)算一下它的占空比:我們清楚地知道,這個(gè)輸出波形在counter為0到32767的時(shí)候?yàn)榈?,?2767到56817的時(shí)候?yàn)楦?,占空比?0%多一些, 如果我們需要占空比為50%,那么怎么辦呢?不用急,慢慢來(lái)。我們?cè)僭O(shè)定一個(gè)參數(shù),使它為56817的一半,使達(dá)到它的時(shí)候波形翻轉(zhuǎ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 &

5、lt;= counter+1;reg clk_div;always (posedge clk)if(counter=28408) clk_div <= clk_div;endmodule占空比是不是神奇地變成50%了呢?呵呵。繼續(xù)讓我們來(lái)看如何實(shí)現(xiàn)任意占空比,比如還是由50 M分頻產(chǎn)生880 Hz,而分頻得到的信號(hào)的占空比為 30%。56818X 30%=17045module div(clk,reset,clk_div,counter);input clk,reset;output clk_div;output 15:0 counter;reg 15:0 counter;reg clk

6、_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三分頻的Verilog實(shí)現(xiàn)/很實(shí)用也是筆試面試時(shí)??嫉?,已經(jīng)經(jīng)過(guò)仿真50%勺描述占空比要求50%口不要求占空比差別會(huì)很大,

7、先看一個(gè)占空比module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;/internal counter signalsreg1:0 count_a;reg1:0 count_b;regCLKOUT;always (negedge RESETn or posedge CLKIN)beginif (RESETn=1'b0)count_a<=2'b00;elseif (count_a=2'b10) count_a<=2'b00;elsecount_a<=count_a+1;

8、end always (negedge RESETn or negedge CLKIN) beginif (RESETn=1'b0)count_b<=2'b0;elseif (count_b=2'b10)count_b<=2'b00;elsecount_b<=count_b+1; end always (count_a or count_b or RESETn) beginif (RESETn=1'b0)CLKOUT=1'b0;else if(count_a+count_b=4)|(count_a+ count_b=1)CLKO

9、UT=CLKOUT;endendmodule2012下面是一個(gè)非50%勺描述,只用了上升沿module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;wire d;regq1,q2;wireCLKOUT;always (negedge RESETn or posedge CLKIN) beginif (RESETn=1'b0)q1<=1'b0;elseq1<=d;endalways (negedge RESETn or posedge CLKIN) beginif (RESETn=1'b

10、0)q2<=1'b0;elseq2<=q1;endassign d=q1 & q2;assign CLKOUT=q2;endmodule占空比不是50%只用了單沿觸發(fā)器,寄存器輸出 至于其他奇數(shù)要求50%勺或者不要求的占空比的,都可以參照上面兩個(gè)例子做 出。占空比為50%勺一個(gè)更好的實(shí)現(xiàn)。module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;/internal counter signalsreg1:0 count_a;regb,c;/regCLKOUT;wire CLKOUT;alway

11、s (negedge RESETn or posedge CLKIN)beginif (RESETn=1'b0)count_a<=2'b00;elseif (count_a=2'b10)count_a<=2'b00;elsecount_a<=count_a+1;endalways (negedge RESETn or negedge CLKIN)beginif (RESETn=1'b0)b<=1'b0;elseif (count_a=2'b01)b<=2'b0;elseb<=1'b1;e

12、ndalways (negedge RESETn or posedge CLKIN)beginif (RESETn=1'b0)c<=1'b0;elseif (count_a=2'b10) c<=1'b1;else if (count_a=2'b01) c<=1'b0;endassignCLKOUT=b & c;endmodule時(shí)鐘選擇器的Verilog寫法!CPRI有3種數(shù)據(jù)時(shí)鐘,61.44M 122.88M 245.76M,需要模塊能夠根據(jù)外部的速率指示信號(hào)(一個(gè)2位的輸入信號(hào),由模塊外部給定)選擇其中的一種時(shí)鐘作為

13、模塊的工作時(shí)鐘但由于所選用的FPGA工作頻率關(guān)系,不能超過(guò)400M,無(wú)法通過(guò)寄存器方式實(shí)現(xiàn)時(shí)鐘源的選擇.使用雙邊觸發(fā)的方式將最高的頻率進(jìn)行分頻,代碼如下,已經(jīng)通過(guò)ModelSim的仿真,可以實(shí)現(xiàn)。module clk_div(reset, /復(fù)位信號(hào)data_rate, / 數(shù)據(jù)速率指示clk2, /245.76M的時(shí)鐘輸入time1, / 分頻計(jì)數(shù)器 clk/選擇后的時(shí)鐘輸出);inputreset;input 1:0 data_rate;inputclk2;output 1:0 time1;output clk;reg 1:0 timel;reg clk;always(clk2 or re

14、set)if(reset)begintime1=2'b00;clk=1'b0;endelsebegintime1=time1+1'b1;case(data_rate)2'b00:if(time1=2'b00)clk=clk;elseclk=clk;2'b01:if(time10=1'b1)clk=clk;elseclk=clk;2'b10:clk=clk;2'b11:clk=clk;endcaseendendmoduleverilog 實(shí)現(xiàn)gray碼計(jì)數(shù)器/16位gray碼計(jì)數(shù)器,gary碼狀態(tài)改變時(shí)候每次只改變一個(gè)bit

15、/,可以有效防止競(jìng)爭(zhēng)和毛刺的產(chǎn)生。module gray_counter(clk,clr,start,stop,q,cout);input clk;input clr;input start,stop;output reg 3:0 q;output reg cout;reg flag=1;reg 3:0 s,next_s;/parameter S0=0, S1=1, S2=2, S3=3, S4=4, S5=5, S6=6, S7=7;/parameter S8=8, S9=9, S10=10, S11=11, S12=12, S13=13, S14=14, S15=15;parameter

16、s0=0000, s1=0001, s2=0011, s3=0010;parameter s4=0110, s5=0111, s6=0101, s7=0100;parameter s8=1100, s9=1101, s10=1111,s11=1110;parameter s12=1010, s13=1011, s14=1001, s15=1000;always (posedge clk)beginif (clr) s <= s0;else s <= next_s;end/*always (posedge start or posedge stop)beginif(start) fl

17、ag=1;else if (stop) flag=0;end*/always (s or flag)/*該進(jìn)程實(shí)現(xiàn)狀態(tài)的轉(zhuǎn)換 */begincase (s)50: beginif (flag) next_s <=s1;/ else next_s <=s0;end51: beginif (flag) next_s <= s2;end52: beginif (flag) next_s <=s3;/else next_s <=s0;end53: beginif (flag) next_s <=s4;/else next_s <=s3;end54: begin

18、if (flag) next_s <= s5;end55: beginif (flag) next_s <=s6;/else next_s <=s0;end56: beginif (flag) next_s <=s7;/else next_s <=s3;end57: beginif (flag) next_s <=s8;/else next_s <=s0;end58: beginif (flag) next_s <= s9;end59: beginif (flag) next_s <=s10;/else next_s <=s0;end

19、510: beginif (flag) next_s <=s11;/else next_s <=s3;end511: beginif (flag) next_s <= s12;end512: beginif (flag) next_s <=s13;/else next_s <=s0;end513: beginif (flag) next_s <=s14;/else next_s <=s3;end514: beginif (flag) next_s <=s15;/else next_s <=s0;end515: beginif (flag)

20、next_s <=s0;/elsenext_s <=s3;enddefault:next_s <=s0;/*default 語(yǔ)句 */endcaseendalways (s)/*該進(jìn)程定義組合邏輯(FSM的輸出)*/begincase(s)50: q=0;51: q=4;52: q=2;53: q=3;54: q=4;55: q=5;56: q=6;57: q=7;58: q=8;59: q=9;510: q=10;511: q=11;512: q=12;513: q=13;514: q=14;515: q=15;default:q=0; /*default語(yǔ)句,避免鎖存器的

21、產(chǎn)生 */endcaseendalways (s)beginif (s=s15) cout=1;/assign cout=q;else cout=0;endendmodule如何解決FPGA電路設(shè)計(jì)中的毛刺問(wèn)題隨著半導(dǎo)體技術(shù)的飛速發(fā)展, FPGA (Field Programmable Gate Array )的計(jì)算能力、容量以及可靠性也有了很大的提高。它正以高度靈活的用戶現(xiàn)場(chǎng)編程功能、靈活的反復(fù)改寫功能、高可靠性等優(yōu)點(diǎn),成為數(shù)字電路設(shè)計(jì)、數(shù)字信號(hào)處理等領(lǐng)域的新寵。但和所有的數(shù)字電路一樣,毛刺也是FPGA電路中的棘手問(wèn)題。 它的出現(xiàn)會(huì)影響電路工作的穩(wěn)定性、可靠性,嚴(yán)重時(shí)會(huì)導(dǎo)致整個(gè)數(shù)字系統(tǒng)的誤動(dòng)

22、作和邏輯紊亂。因此,如何有效正確的解決設(shè)計(jì)中出現(xiàn)的毛刺,就成為整個(gè)設(shè)計(jì)中的關(guān)鍵一環(huán)。本文就FPGA設(shè)計(jì)中出現(xiàn)的毛刺問(wèn)題,根據(jù)筆者自己的經(jīng)驗(yàn)和體會(huì),提出了幾種簡(jiǎn)單可行的解決方法和思路,供同行供交流與參考。1 : FPGA電路中毛刺的產(chǎn)生我們知道,信號(hào)在 FPGA器件中通過(guò)邏輯單元連線時(shí),一定存在延時(shí)。延時(shí)的大小不僅和連線的長(zhǎng)短和 邏輯單元的數(shù)目有關(guān),而且也和器件的制造工藝、工作環(huán)境等有關(guān)。因此,信號(hào)在器件中傳輸?shù)臅r(shí)候,所 需要的時(shí)間是不能精確估計(jì)的,當(dāng)多路信號(hào)同時(shí)發(fā)生跳變的瞬間,就產(chǎn)生了競(jìng)爭(zhēng)冒險(xiǎn)這時(shí),往往會(huì)出現(xiàn)一些不正確的尖峰信號(hào),這些尖峰信號(hào)就是毛刺”。另外,由于FPGA以及其它的CPLD器件

23、內(nèi)部的分布電容和電感對(duì)電路中的毛刺基本沒(méi)有什么過(guò)濾作用,因此這些毛刺信號(hào)就會(huì)被保留”并傳遞到后一級(jí),從而使得毛刺問(wèn)題更加突出??梢?jiàn),即使是在最簡(jiǎn)單的邏輯運(yùn)算中,如果出現(xiàn)多路信號(hào)同時(shí)跳變的情況,在通過(guò)內(nèi)部走線之后,就一定會(huì)產(chǎn)生毛刺。而現(xiàn)在使用在數(shù)字電路設(shè)計(jì)以及數(shù)字信號(hào)處理中的信號(hào)往 往是由時(shí)鐘控制的,多數(shù)據(jù)輸入的復(fù)雜運(yùn)算系統(tǒng),甚至每個(gè)數(shù)據(jù)都由相當(dāng)多的位數(shù)組成。這時(shí),每一級(jí)的 毛刺都會(huì)對(duì)結(jié)果有嚴(yán)重的影響,如果是多級(jí)的設(shè)計(jì),那么毛刺累加后甚至?xí)绊懻麄€(gè)設(shè)計(jì)的可靠性和精確性。下面我們將以乘法運(yùn)算電路來(lái)說(shuō)明毛刺的產(chǎn)生以及去除,在實(shí)驗(yàn)中,我們使用的編程軟件是QuartusII2.0 ,實(shí)驗(yàn)器件為Cyclo

24、ne EP1CF400I7 。需要說(shuō)明一點(diǎn),由于示波器無(wú)法顯示該整數(shù)運(yùn)算的結(jié)果,我們 這里將只給出軟件仿真的結(jié)果。而具體的編程以及程序的下載我們?cè)谶@里也不再詳述,可以參考相關(guān)的文 獻(xiàn)書籍。2:毛刺的消除方法首先,我們來(lái)設(shè)計(jì)一個(gè)簡(jiǎn)單的乘法運(yùn)算電路。運(yùn)算電路如圖1所示。 圖1乘法運(yùn)算運(yùn)算電路及結(jié)果(略)如圖1(c)所示,如果在不加任何的去除毛刺的措施的時(shí)候,我們可以看到結(jié)果c中含有大量的毛刺。產(chǎn)生的原因就是在時(shí)鐘的上升沿,每個(gè)輸入(a和b)的各個(gè)數(shù)據(jù)線上的數(shù)據(jù)都不可能保證同時(shí)到達(dá),也就是說(shuō) 在時(shí)鐘讀取數(shù)據(jù)線上的數(shù)據(jù)的時(shí)候,有的數(shù)據(jù)線上讀取的已經(jīng)是新的數(shù)據(jù),而有的數(shù)據(jù)線上讀取的仍然是 上一個(gè)數(shù)據(jù),這

25、樣無(wú)疑會(huì)產(chǎn)生毛刺信號(hào),而當(dāng)數(shù)據(jù)完全穩(wěn)定的時(shí)候,毛刺信號(hào)也就自然消失了。a:輸出加D觸發(fā)器這是一種比較傳統(tǒng)的去除毛刺的方法。原理就是用一個(gè)D觸發(fā)器去讀帶毛刺的信號(hào),利用D觸發(fā)器對(duì)輸入信號(hào)的毛刺不敏感的特點(diǎn),去除信號(hào)中的毛刺。這種方法在簡(jiǎn)單的邏輯電路中是 常見(jiàn)的一種方法,尤其是對(duì)信號(hào)中發(fā)生在非時(shí)鐘跳變沿的毛刺信號(hào)去除效果非常的明顯。但是對(duì)于大多數(shù)的時(shí)序電路來(lái)說(shuō),毛刺信號(hào)往往發(fā)生在時(shí)鐘信號(hào)的跳變沿,這樣D觸發(fā)器的效果就沒(méi)有那么明顯了(見(jiàn)圖2,加D觸發(fā)器以后的輸出q,仍含有毛刺)。另外, D觸發(fā)器的使用還會(huì)給系統(tǒng)帶來(lái)一定的延時(shí),特 別是在系統(tǒng)級(jí)數(shù)較多的情況下,延時(shí)也將變大,因此在使用D觸發(fā)器去除毛刺的

26、時(shí)候,一定要視情況而定,并不是所有的毛刺都可以用D觸發(fā)器來(lái)消除圖2加D觸發(fā)器后的運(yùn)算電路及結(jié)果(略)b:信號(hào)同步法在很多文章中都提到,設(shè)計(jì)數(shù)字電路的時(shí)候采用同步電路可以大大減少毛刺。另外,由于大多數(shù)毛刺都比較短(大概幾個(gè)納秒),只要毛刺不出現(xiàn)在時(shí)鐘跳變沿,毛刺信號(hào)就不會(huì)對(duì)系統(tǒng)造成危 害了。因此很多人認(rèn)為,只要在整個(gè)系統(tǒng)中使用同一個(gè)時(shí)鐘就可以達(dá)到系統(tǒng)同步的目標(biāo)了。但是這里面有 一個(gè)非常嚴(yán)重的問(wèn)題,就是時(shí)鐘信號(hào)和其他所有的信號(hào)一樣,在 FPGA器件中傳遞的時(shí)候是有延時(shí)的,這 樣根本就無(wú)法預(yù)知時(shí)鐘跳變沿的精確位置。也就是說(shuō)我們無(wú)法保證在某個(gè)時(shí)鐘的跳變沿讀取的數(shù)據(jù)是一個(gè) 穩(wěn)定的數(shù)據(jù),尤其是在多級(jí)設(shè)計(jì)中

27、,這個(gè)問(wèn)題就更加突出了。因此,做到真正的"同步"就是去除毛刺信號(hào)的關(guān)鍵問(wèn)題。我認(rèn)為這里同步的關(guān)鍵就是保證在時(shí)鐘的跳變沿讀取的數(shù)據(jù)是穩(wěn)定的數(shù)據(jù)而不是毛刺數(shù)據(jù)。以這個(gè)思想為出發(fā)點(diǎn),提出了以下幾種具體的信號(hào)同步方法。c:信號(hào)延時(shí)同步法首先,我們給出了一個(gè)兩級(jí)乘法(c=a b; q=d c)的運(yùn)算結(jié)果(如圖 3所示,這里不再給出運(yùn)算電路)。可以看到,在沒(méi)加任何處理過(guò)程的時(shí)候,兩級(jí)結(jié)果c和q中都含有大量的毛刺信號(hào)。其中毛刺信號(hào)產(chǎn)生的原因就是在計(jì)算時(shí)鐘跳變時(shí)刻,數(shù)據(jù)信號(hào)同時(shí)發(fā)生了跳變。另外,第一級(jí)信號(hào)c中含有大量的毛刺,在經(jīng)過(guò)第二次乘法運(yùn)算以后被明顯放大了,從圖 3可以看出q中毛刺更加

28、嚴(yán)重了。但在很 多實(shí)際工作中,我們最關(guān)心的往往是最后的輸出結(jié)果( q),只要中間信號(hào)的毛刺對(duì)后面的輸出沒(méi)有什么影 響我們就不需要對(duì)它們作任何處理了。因此,這里所提出的信號(hào)同步的核心思想就是消除這些中間毛刺信 號(hào)的影響。 圖3兩級(jí)乘法運(yùn)算的結(jié)果仿真(略)信號(hào)延時(shí)法,它的原理就是在兩級(jí)信號(hào)傳遞的過(guò)程中加一個(gè)延時(shí)環(huán)節(jié),從而保證在下一個(gè)模塊中讀取到的數(shù)據(jù)是穩(wěn)定后的數(shù)據(jù),即不包含毛刺信號(hào)。這里 所指的信號(hào)延時(shí)可以是數(shù)據(jù)信號(hào)的延時(shí),也可以是時(shí)鐘信號(hào)的延時(shí)。由于篇幅的關(guān)系,這里我們主要以對(duì) 時(shí)鐘信號(hào)的延時(shí)來(lái)說(shuō)明信號(hào)延時(shí)法的原理。對(duì)上述計(jì)算過(guò)程加時(shí)鐘信號(hào)延時(shí)的原理及結(jié)果如圖4所示。圖4加了時(shí)鐘延時(shí)的兩級(jí)乘法運(yùn)算及結(jié)果(略)圖4中的clkdelay就是時(shí)鐘延時(shí)環(huán)節(jié)。在加這個(gè)環(huán)節(jié)以前的時(shí)鐘信號(hào)是直接連到模塊 b上的,這樣兩個(gè)模塊使用同一時(shí)鐘,好像已經(jīng)做到了同步,但是如圖3所示,結(jié)果中含有大量的毛刺,其原因就是產(chǎn)生毛刺的根本原因-競(jìng)爭(zhēng)冒險(xiǎn)"現(xiàn)象沒(méi)有得到根本性的消除。加時(shí)鐘延時(shí)環(huán)節(jié)的作用就是要從根

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論