和單片機(jī)一樣,FPGA開發(fā)板上也都會(huì)配有晶振用來生成板載時(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í)間真的很快,連光速還沒來得及跑出小區(qū)大門就被掐斷了。那么問題來了:如果在某些應(yīng)用場合中,我們不需要這么快的嘀嗒該怎么辦?比如,我們想讓小腳丫上的LED燈以可觀察的頻率閃爍,如1Hz,也就是1秒閃一下。
相信大家和我的想法一樣,就一個(gè)字:等。既然一秒鐘可以嘀嗒一千兩百萬次,那我們每次點(diǎn)亮LED之前就先等你跳一千兩百萬次好了,畢竟也不耗油。換句話說,就是把內(nèi)部時(shí)鐘頻率放慢12,000,000倍。這個(gè)操作就叫做時(shí)鐘分頻,也就是我們今天要掌握的內(nèi)容。
先說偶數(shù)分頻,也就是說將內(nèi)部時(shí)鐘放慢的除數(shù)為偶數(shù)。在這里,我們只考慮占空比為50%的波形(高電平和低電平對(duì)半分)。圖1中,我們設(shè)定內(nèi)部時(shí)鐘為我們的輸入頻率,也就是12MHz,那么如果想獲得一個(gè)6MHz的輸出頻率,只需要等第二次上沿信號(hào)即可,因此分頻除數(shù)為2。

圖1
如果想得到更低的輸出頻率,比如1MHz,則除數(shù)調(diào)整12;如果1KHz,除數(shù)調(diào)成12000,依次類推。注意,這種方法只對(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)begincounter<=?counter?+?24'd1;if(counter>=(DIVISOR-1))counter<=?24'clock_out<=?(counter2 )?1'b1:1'b0;//條件賦值endendmodule
在代碼中我們注意到了這一行代碼:
reg[23:0] counter=24’0
這個(gè)實(shí)際上就是用于存儲(chǔ)小腳丫固定時(shí)鐘頻率的一個(gè)數(shù)據(jù)格式,至于為什么是24位寬直接參考圖2就可以。打開你們電腦里的計(jì)算器,調(diào)成碼農(nóng)模式即可。

圖2
再說奇數(shù)分頻。比如說我們想獲得一個(gè)4MHz的頻率,按道理說我們把分頻除數(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)造原理,只需要通過行為級(jí)描述即可直接完成指令:
always@(posedgeclk)//上沿觸發(fā)always @(negedge clk) //下沿觸發(fā)
現(xiàn)在我們來看一個(gè)分頻倍數(shù)為3的例子。圖3中,不論輸出信號(hào)是高電平還是低電平,都只涵蓋了兩個(gè)邊沿信號(hào),也就是說,不論是上沿還是下沿時(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;elsepos_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入門到精通】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
FPGA
+關(guān)注
關(guān)注
1660文章
22415瀏覽量
636514 -
電路
+關(guān)注
關(guān)注
173文章
6077瀏覽量
178431 -
數(shù)字
+關(guān)注
關(guān)注
1文章
1700瀏覽量
52557
原文標(biāo)題:基于FPGA的數(shù)字電路實(shí)驗(yàn)6:時(shí)序邏輯電路之時(shí)鐘分頻
文章出處:【微信號(hào):xiaojiaoyafpga,微信公眾號(hào):電子森林】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
CDC5801A:低抖動(dòng)時(shí)鐘倍頻器與分頻器的卓越之選
LMK01801雙時(shí)鐘分頻緩沖器:高精度時(shí)鐘解決方案
【「龍芯之光 自主可控處理器設(shè)計(jì)解析」閱讀體驗(yàn)】--LoongArch邏輯綜合、芯片設(shè)計(jì)
RE時(shí)鐘高次諧波解決方案
vivado時(shí)序分析相關(guān)經(jīng)驗(yàn)
時(shí)鐘移項(xiàng)電路加速模塊的設(shè)計(jì)
?CDC5801A低抖動(dòng)時(shí)鐘倍頻/分頻器技術(shù)文檔總結(jié)
咨詢符合國標(biāo)GB/T 4728.12-2022的邏輯門電路設(shè)計(jì)軟件
FPGA時(shí)序分析工具TimeQuest詳解
瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(29)CGC(時(shí)鐘生成電路)時(shí)鐘控制
實(shí)用電子電路設(shè)計(jì)(全6本)——數(shù)字邏輯電路的ASIC設(shè)計(jì)
時(shí)鐘電路的組成與設(shè)計(jì)要點(diǎn)介紹
FPGA時(shí)序約束之設(shè)置時(shí)鐘組
時(shí)序邏輯電路:時(shí)鐘分頻
評(píng)論