和單片機(jī)一樣,FPGA開(kāi)發(fā)板上也都會(huì)配有晶振用來(lái)生成板載時(shí)鐘。前一篇我們提到了小腳丫的固定板載時(shí)鐘頻率為12MHz,這個(gè)頻率實(shí)際上就是作為我們的時(shí)間參考基準(zhǔn)。正如歌里唱的那樣:
嘀嗒嘀嗒嘀嗒嘀嗒
時(shí)針?biāo)煌T谵D(zhuǎn)動(dòng)
因此,小腳丫只要在通電之后,它的內(nèi)部時(shí)鐘就會(huì)每隔83.8ns滴答一次。這個(gè)時(shí)間真的很快,連光速還沒(méi)來(lái)得及跑出小區(qū)大門(mén)就被掐斷了。那么問(wèn)題來(lái)了:如果在某些應(yīng)用場(chǎng)合中,我們不需要這么快的嘀嗒該怎么辦?比如,我們想讓小腳丫上的LED燈以可觀察的頻率閃爍,如1Hz,也就是1秒閃一下。
相信大家和我的想法一樣,就一個(gè)字:等。既然一秒鐘可以嘀嗒一千兩百萬(wàn)次,那我們每次點(diǎn)亮LED之前就先等你跳一千兩百萬(wàn)次好了,畢竟也不耗油。換句話說(shuō),就是把內(nèi)部時(shí)鐘頻率放慢12,000,000倍。這個(gè)操作就叫做時(shí)鐘分頻,也就是我們今天要掌握的內(nèi)容。
先說(shuō)偶數(shù)分頻,也就是說(shuō)將內(nèi)部時(shí)鐘放慢的除數(shù)為偶數(shù)。在這里,我們只考慮占空比為50%的波形(高電平和低電平對(duì)半分)。圖1中,我們?cè)O(shè)定內(nèi)部時(shí)鐘為我們的輸入頻率,也就是12MHz,那么如果想獲得一個(gè)6MHz的輸出頻率,只需要等第二次上沿信號(hào)即可,因此分頻除數(shù)為2。
圖1
如果想得到更低的輸出頻率,比如1MHz,則除數(shù)調(diào)整12;如果1KHz,除數(shù)調(diào)成12000,依次類(lèi)推。注意,這種方法只對(duì)除數(shù)為偶數(shù)的情況下才管用!以下是生成1Hz輸出的代碼,于是我們將除數(shù)調(diào)成了12,000,000。
moduleclkdivider(clock_in,clock_out);
inputclock_in;
outputregclock_out;
reg[23:0]counter=24'd0;
parameter DIVISOR = 24'd12000000;
always@(posedgeclock_in)
begin
counter<=?counter?+?24'd1;
if(counter>=(DIVISOR-1))
counter<=?24'
clock_out<=?(counter
2 )?1'b1:1'b0;//條件賦值end
endmodule
在代碼中我們注意到了這一行代碼:
reg[23:0] counter=24’0
這個(gè)實(shí)際上就是用于存儲(chǔ)小腳丫固定時(shí)鐘頻率的一個(gè)數(shù)據(jù)格式,至于為什么是24位寬直接參考圖2就可以。打開(kāi)你們電腦里的計(jì)算器,調(diào)成碼農(nóng)模式即可。
圖2
再說(shuō)奇數(shù)分頻。比如說(shuō)我們想獲得一個(gè)4MHz的頻率,按道理說(shuō)我們把分頻除數(shù)調(diào)成3即可。而實(shí)際上奇數(shù)分頻的故事還是稍微多一點(diǎn)。我們看一下圖3就明白了。
圖3
不難發(fā)現(xiàn),當(dāng)除數(shù)為奇數(shù)時(shí),此刻對(duì)應(yīng)的時(shí)間為內(nèi)部時(shí)鐘的下沿,如果僅靠上沿觸發(fā)的話,此時(shí)輸出是不會(huì)改變的。所以奇數(shù)分頻需要經(jīng)歷上沿觸發(fā)和下沿觸發(fā)才能完成。還好,在Verilog里,我們先不用研究邊沿觸發(fā)的構(gòu)造原理,只需要通過(guò)行為級(jí)描述即可直接完成指令:
always@(posedgeclk)//上沿觸發(fā)
always @(negedge clk) //下沿觸發(fā)
現(xiàn)在我們來(lái)看一個(gè)分頻倍數(shù)為3的例子。圖3中,不論輸出信號(hào)是高電平還是低電平,都只涵蓋了兩個(gè)邊沿信號(hào),也就是說(shuō),不論是上沿還是下沿時(shí)鐘,我們只需要分別等待2次觸發(fā)后進(jìn)行賦值即可。
moduleclk_div3(clk,clk_out);
inputclk;
outputclk_out;
0]pos_count,neg_count; :
wire [1:0] r_nxt;
always@(posedgeclk)//處理上沿時(shí)鐘觸發(fā)部分
=2)//等待輸入時(shí)鐘上沿觸發(fā)2次 =
0; =
else
pos_count <= pos_count +1;
always@(negedgeclk)//處理下沿時(shí)鐘觸發(fā)部分
=2) //等待輸入時(shí)鐘下沿觸發(fā)2次 =
0; =
else
neg_count+1; =
((pos_count==2)|(neg_count==2));//每等待2次觸發(fā)后進(jìn)行賦值 =
endmodule
了解了3倍分頻之后,如何實(shí)現(xiàn)通用的奇數(shù)分頻自然也就不在話下了,這一部分就交給愿意動(dòng)手嘗試的朋友們?nèi)プ孕芯毩?xí)了。
最后,我們的任務(wù)是,讓小腳丫上的L1-L4這四個(gè)燈以2Hz的頻率閃爍,另外四個(gè)燈L5-L8分別以1Hz的頻率閃爍,看看能否實(shí)現(xiàn)呢?
責(zé)任編輯:xj
原文標(biāo)題:基于FPGA的數(shù)字電路實(shí)驗(yàn)6:時(shí)序邏輯電路之時(shí)鐘分頻
文章出處:【微信公眾號(hào):FPGA入門(mén)到精通】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
FPGA
+關(guān)注
關(guān)注
1645文章
22040瀏覽量
618222 -
電路
+關(guān)注
關(guān)注
173文章
6026瀏覽量
175014 -
數(shù)字
+關(guān)注
關(guān)注
1文章
1698瀏覽量
51895
原文標(biāo)題:基于FPGA的數(shù)字電路實(shí)驗(yàn)6:時(shí)序邏輯電路之時(shí)鐘分頻
文章出處:【微信號(hào):xiaojiaoyafpga,微信公眾號(hào):電子森林】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論