數(shù)字IC手撕代碼-分頻器(任意偶數(shù)分頻)
????????大家好我是酸菜魚(yú),這個(gè)系列著重講解數(shù)字ic或FPGA實(shí)習(xí)面試及秋招面試的高頻手撕代碼題 。
往期題目:
數(shù)字IC手撕代碼-序列檢測(cè)(狀態(tài)機(jī)寫(xiě)法) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(cè)(移位寄存器寫(xiě)法) - 嗶哩嗶哩 (bilibili.com)
? ? ? ? 什么是分頻
????????分頻就是生成一個(gè)新時(shí)鐘,該新時(shí)鐘的頻率是原有時(shí)鐘頻率的整數(shù)分之一倍,新周期是原有周期的整數(shù)倍。
????????再簡(jiǎn)單來(lái)說(shuō),讓你手撕一個(gè)四分頻電路,就是寫(xiě)代碼生成一個(gè)周期是原來(lái)四倍的時(shí)鐘,如果手撕一個(gè)三分頻電路,就是寫(xiě)代碼生成一個(gè)周期是原來(lái)三倍的時(shí)鐘。

????? ? 如上圖所示,就是一個(gè)四分頻電路的波形,四分頻后,新的clk_out的頻率是原來(lái)的1/4,也即周期是原來(lái)的4倍,從圖中可以看到,clk每過(guò)4個(gè)周期,clk_out過(guò)1個(gè)周期。
????????同理三分頻也一樣,但是奇數(shù)分頻會(huì)比偶數(shù)分頻復(fù)雜一些,在奇數(shù)分頻部分會(huì)講。
? ? ??偶數(shù)分頻
????????我們先來(lái)講偶數(shù)分頻。逐步加大難度,先說(shuō)二分頻,怎么實(shí)現(xiàn)二分頻呢?
????????????答:檢測(cè)參考時(shí)鐘,每一個(gè)上升沿到來(lái)時(shí),新的時(shí)鐘翻轉(zhuǎn)一次。即:
always @ (posedge clk or negedge?rstn)
? ? ??if (!rstn)
? ? ? ? ? clk_out?<= 1'b0; ????????? // 復(fù)位置零
????? else
? ? ? ? ? clk_out <= !clk_out; ????// 否則q信號(hào)翻轉(zhuǎn)

? ? ? ? 搞定!從圖中可以看到,clk_out每過(guò)兩個(gè)clk時(shí)鐘上升沿就flip-flop一次,這樣一個(gè)clk_out的周期就是clk周期的兩倍,也即實(shí)現(xiàn)了二分頻。
????????那如果是任意偶數(shù)分頻呢,這就得數(shù)經(jīng)過(guò)了多少上升沿,如果是四分頻,那就每過(guò)兩個(gè)時(shí)鐘上升沿(兩周期),新信號(hào)flip-flop一次,flip-flop兩次為新信號(hào)的一個(gè)周期,即是周期是原時(shí)鐘的四倍。同理,8分頻就是每數(shù)4個(gè)上升沿,flip-flop一次,以此類(lèi)推,可以實(shí)現(xiàn)任意偶數(shù)分頻了。
????????下面拿8分頻舉例,貼出所有代碼以及testbench。
代碼:

testbench:

????得到的八分頻的波形如下:

????????從波形我們可以看到,clk每過(guò)4個(gè)時(shí)鐘上升沿,clk_out 翻轉(zhuǎn)一次,和設(shè)計(jì)的一樣,在RTL文件中的 number 是可以修改的,可以改成任意偶數(shù)從而實(shí)現(xiàn)任意偶數(shù)分頻(改為2也行,即每次時(shí)鐘上升沿到來(lái)時(shí),if語(yǔ)句一直滿(mǎn)足,clk_out 翻轉(zhuǎn)一次,每次時(shí)鐘上升沿翻轉(zhuǎn)一次,就是我們之前提到的二分頻。)注意翻轉(zhuǎn)的時(shí)間點(diǎn)是number/2-1!因?yàn)楫?dāng)cnt 是從0開(kāi)始計(jì)數(shù)的,
當(dāng)cnt == 3 時(shí)(八分頻舉例),cnt被重置到0,持續(xù)一個(gè)clk。
? ? 檢測(cè)到上升沿,cnt再持續(xù)一個(gè)clk,cnt=1。
再檢測(cè)到上升沿,cnt再持續(xù)一個(gè)clk,cnt=2。
再檢測(cè)到上升沿,cnt再持續(xù)一個(gè)clk,cnt=3。
再檢測(cè)到上升沿,此時(shí)cnt=3,cnt又被置零。

????????更加直觀一些可以把cnt作為div_8這個(gè)module的輸出信號(hào),查看cnt隨時(shí)間的變化值,找感覺(jué)。
占空比分析:我們上面寫(xiě)的任意偶數(shù)分頻代碼的占空比都是50%,實(shí)際上面試手撕代碼不會(huì)讓你50%占空比,那怎么辦?
????????答:進(jìn)行計(jì)數(shù),對(duì)于一個(gè)八分頻,開(kāi)始就把時(shí)鐘設(shè)為高電平,我用cnt 計(jì)數(shù)到兩個(gè)時(shí)鐘上升沿后再把它拉低,計(jì)數(shù)到7后cnt 拉低 時(shí)鐘拉高,這樣就實(shí)現(xiàn)了兩個(gè)周期高,六個(gè)周期低,占空比為2/8 即 25% 的八分頻。
????????本篇專(zhuān)欄到此結(jié)束,感興趣的小伙伴可以關(guān)注我, 一起學(xué)習(xí),備戰(zhàn)秋招。
??