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è),還剩8頁(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ǔ)上 做一個(gè)

2、簡(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);in put clk;output clk_div;reg 15:0 coun ter;always (posedge clk)if(co un ter=56817) coun ter = 0;e

3、lse coun ter = coun ter+1;assig n clk_div = coun ter|15;en dmodule下面我們來(lái)算一下它的占空比:我們清楚地知道,這個(gè)輸出波形在cou nter為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);in put clk;output clk_div;reg 14:0 cou nter;always

4、 (posedge elk)if(cou nter=28408) eou nter = 0;else coun ter = coun ter+1;reg clk_div;always (posedge clk)if(cou nter=28408) clk_div = clk_div;en dmodule占空比是不是神奇地變成50% 了呢?呵呵。繼續(xù)讓我們來(lái)看如何實(shí)現(xiàn)任意占空比,比如還是由50 M分頻產(chǎn)生880 Hz,而分頻得到的信號(hào)的占空比為30%。56818X 30%=17045module div(clk,reset,clk_div,co un ter);in put clk,reset;

5、output clk_div;output 15:0 coun ter;reg 15:0 coun ter;reg clk_div;always (posedge clk)if(!reset) coun ter = 0;else if(co un ter=56817) coun ter = 0;else coun ter = coun ter+1;always (posedge clk)if(!reset) clk_div = 0;else if(counter17045) clk_div = 1;else clk_div = 0;en dmodule三分頻的Verilog實(shí)現(xiàn)/很實(shí)用也是筆試

6、面試時(shí)??嫉?,已經(jīng)經(jīng)過(guò)仿真占空比要求50%0不要求占空比差別會(huì)很大,先看一個(gè)占空比50%勺描述module div3(CLKIN,CLKOUT,RESET n);input CLKIN,RESETn; output CLKOUT;/internal counter signals reg1:0 count_a;reg1:0 count_b;reg CLKOUT;always (negedge RESETn or posedge CLKIN) beginif (RESETn=1b0) count_a=2b00;else if (count_a=2b10) count_a=2b00;else co

7、unt_a=count_a+1; end always (negedge RESETn or negedge CLKIN) beginif (RESETn=1b0)count_b=2b0;elseif (count_b=2b10)count_b=2b00;elsecount_b=count_b+1;end always (count_a or count_b or RESETn) beginif (RESETn=1b0)CLKOUT=1b0;else if(count_a+count_b=4)|(count_a+ count_b=1)CLKOUT=CLKOUT;end endmodule 0

8、1 2 0 1 2 / / / / 0 1 2 0 1 2下面是一個(gè)非 50%的描述,只用了上升沿 module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;wire d;reg q1,q2;wire CLKOUT;always (negedge RESETn or posedge CLKIN) beginif (RESETn=1b0)q1=1b0;elseq1=d;endalways (negedge RESETn or posedge CLKIN) beginif (RESETn=1b0) q2=1b0;else q

9、2=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;reg b,c;/reg CLKOUT;wire CLKOUT;always (negedge RESETn or pose

10、dge CLKIN)beginif (RESETn=1b0) count_a=2b00;elseif (count_a=2b10) count_a=2b00;else count_a=count_a+1;endalways (negedge RESETn or negedge CLKIN)beg inif (RESET n=1bO)b=1bO;elseif (cou nt_a=2b01)b=2b0;elseb=1b1;endalways (n egedge RESET n or posedge CLKIN) beg inif (RESET n=1b0)c=1b0;elseif (cou nt_

11、a=2b10)c=1b1;else if (cou nt_a=2b01)c=1b0;endassign CLKOUT=b & c;en dmodule時(shí)鐘選擇器的 Verilog寫法!CPRI有3種數(shù)據(jù)時(shí)鐘,61.44M 122.88M 245.76M,需要模塊能夠根據(jù)外部的速率指示信號(hào)(一個(gè)2位的輸入信號(hào),由模塊外部給定)選擇其中的一種時(shí)鐘作為模塊的工作時(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)d

12、ata_rate,/數(shù)據(jù)速率指示clk2,/245.76M的時(shí)鐘輸入time1,/分頻計(jì)數(shù)器clk/選擇后的時(shí)鐘輸出);inputreset;input 1:0 data_rate;input clk2;output 1:0 timel;output clk;reg 1:0 timel;reg clk;always(clk2 or reset)if(reset)begintime1=2b00;clk=1b0;endelsebegintime1=time1+1b1; case(data_rate) 2b00:if(time1=2b00) clk=clk;elseclk=clk;2b01:if(t

13、ime10=1b1) clk=clk;elseclk=clk;2b10:clk=clk;2b11:clk=clk;endcaseendendmoduleverilog 實(shí)現(xiàn)gray碼計(jì)數(shù)器16位gray碼計(jì)數(shù)器,gary碼狀態(tài)改變時(shí)候每次只改變一個(gè)bit/,可以有效防止競(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

14、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 s0=0000, s1=0001, s2=0011, s3=0010;parameter s4=0110, s5=0111, s6=0101, s7=0100;parameter s8=1 100, s9=1101, s10=1111,s11=1 110;parameter s12=1010, s13=1011, s14=1001, s15=1

15、000;always (posedge clk)beginif (clr) s = s0;else s = next_s;end/*always (posedge start or posedge stop) beginif(start) flag=1;else if (stop) flag=0;end*/always (s or flag)/* 該進(jìn)程實(shí)現(xiàn)狀態(tài)的轉(zhuǎn)換 */begincase (s)s0: beginif (flag) next_s =s1;/ elsenext_s =s0;ends1: beginif (flag) next_s = s2;ends2: beginif (fl

16、ag) next_s =s3;/else next_s =s0;ends3: beginif (flag) next_s =s4;/elsenext_s =s3;ends4: beginif (flag) next_s = s5;ends5: beginif (flag) next_s =s6;/elsenext_s =s0;ends6: beginif (flag) next_s =s7;/elsenext_s =s3;ends7: beginif (flag) next_s =s8;/elsenext_s =s0;ends8: beginif (flag)next_s = s9;ends9

17、: beginif (flag)next_s =s10;/elsenext_s =s0;ends10: beginif (flag)next_s =s11;/elsenext_s =s3;ends11: beginif (flag)next_s = s12;ends12: beginif (flag)next_s =s13;/elsenext_s =s0;ends13: beginif (flag)next_s =s14;/elsenext_s =s3;ends14: beginif (flag)next_s =s15;/elsenext_s =s0;ends15: beginif (flag

18、) next_s =s0;/else next_s =s3;enddefault: next_s =s0; /*default 語(yǔ)句 */endcaseendalways (s)/* 該進(jìn)程定義組合邏輯( FSM 的輸出) */begincase(s)s0: q=0;s1: q=4;s2: q=2;s3: q=3;s4: q=4;s5: q=5;s6: q=6;s7: q=7;s8: q=8;s9: q=9;s10: q=10;s11: q=11;s12: q=12;s13: q=13;s14: q=14;s15: q=15;default:q=0; /*default 語(yǔ)句,避免鎖存器的產(chǎn)生

19、 */ endcaseendalways (s)beginif (s=s15) cout=1;/assign cout=q;else cout=0;endendmodule如何解決FPGA電路設(shè)計(jì)中的毛刺問(wèn)題隨著半導(dǎo)體技術(shù)的飛速發(fā)展,F(xiàn)PGA ( 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)

20、作和邏輯紊亂。因此,如 何有效正確的解決設(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以及其它的CPL

21、D器件內(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)中,我們使用的編程軟件是Quartus112.0,實(shí)驗(yàn)器件為Cy

22、clone 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ù)

23、據(jù),這樣無(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ā)器去除毛刺

24、的時(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è)

25、計(jì)中,這個(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中毛刺更加嚴(yán)重了。但在很多

26、實(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é)的作用就是要從根本上消除競(jìng)爭(zhēng)冒險(xiǎn)”,其過(guò)程是將控制模塊 b的時(shí)鐘延時(shí)一段時(shí)間,使得模塊b的控制時(shí)鐘在上跳變化時(shí)數(shù)據(jù)c已經(jīng)達(dá)到了穩(wěn)定,即不含

溫馨提示

  • 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)論