數(shù)字IC手撕代碼-分頻器(任意奇數(shù)分頻)
????????大家好我是酸菜魚(yú),這個(gè)系列著重講解數(shù)字ic或FPGA實(shí)習(xí)面試及秋招面試的高頻手撕代碼題。
往期題目:
數(shù)字IC手撕代碼-分頻器(任意偶數(shù)分頻,任意奇數(shù)分頻,任意小數(shù)分頻)----分頻大師 - 嗶哩嗶哩 (bilibili.com)
數(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ù)分頻?
????????先易后難,拿三分頻舉例再推廣到任意奇數(shù)分頻。怎么寫(xiě)一個(gè)三分頻呢?一個(gè)占空比不是50%的三分頻是好寫(xiě)的,同樣利用一個(gè)cnt變量對(duì)上升沿計(jì)數(shù)來(lái)實(shí)現(xiàn)。比如實(shí)現(xiàn)占空比為1/3的三分頻,那么只要數(shù)一個(gè)上升沿,輸出高電平,數(shù)兩個(gè)上升沿輸出低電平就能解決。?

? ? ? ? 代碼如上,除去rstn信號(hào)操作外,其實(shí)寫(xiě)一個(gè)三分頻就幾行,容易出錯(cuò)的點(diǎn)是:什么時(shí)候把 clk_out 拉高,什么時(shí)候把 clk_out 拉低,才能實(shí)現(xiàn)題目要求的占空比?!
? ? ? ? 最不容易出錯(cuò)的方法,就是自己畫(huà)波形,畫(huà)出波形后,自己多演算幾個(gè)周期,剛開(kāi)始寫(xiě)要畫(huà)畫(huà)波形,之后熟練了可能在腦子里過(guò)一下就知道寫(xiě)多少,所以還不熟悉的情況下不要偷懶,畫(huà)波形,就像下面貼出的波形圖一樣,寫(xiě)出計(jì)數(shù)器 cnt 的值以及對(duì)應(yīng)的波形走勢(shì)就不會(huì)出錯(cuò)。

? ? ? ? 那么如何實(shí)現(xiàn)一個(gè)占空比50%的三分頻呢?
? ? ? ? 答:將一個(gè)占空比1/3 上升沿采樣的三分頻和一個(gè)占空比1/3下降沿采樣的三分頻結(jié)果,做或運(yùn)算。
? ? ? ? 什么意思?怎么想到這樣做的?下面來(lái)解答!
? ? ? ? 任何奇數(shù) 2N-1 (除1分頻外)分頻都可以表示由 N-1個(gè)高電平周期和 N個(gè)低電平周期組成。(占空比最接近50%,但小于50%)
? ? ? ? 寫(xiě)兩個(gè)這樣的分頻器,一個(gè)上升沿采樣的分頻器——div1,一個(gè)下降沿采樣的分頻器——div2,在相同 cnt 判斷切換高低電平的條件下,就一定有 div1 領(lǐng)先(或滯后)于 div2 半個(gè)參考周期,這樣他們相與后會(huì)使得新的結(jié)果還是 2N-1 分頻,但是高電平周期變?yōu)?N-1+1/2,低電平周期變?yōu)?N-1/2,從而高低電平持續(xù)時(shí)間相等,實(shí)現(xiàn)50%占空比的任意奇數(shù)分頻器。?

????????如上圖所示,從上往下分別為,原始時(shí)鐘信號(hào)clk,或運(yùn)算結(jié)果 clk_out,上升沿采樣七分頻信號(hào) clk_out1,下降沿采樣七分頻信號(hào) clk_out2。(assign clk_out = clk_out1 | clk_out2)
? ? ? ? 下面就以七分頻為例,寫(xiě)一個(gè)占空比為50%的奇數(shù)分頻器。?
代碼:

testbench:

?????????到此,我們就實(shí)現(xiàn)了任意50%占空比的奇數(shù)分頻器,總結(jié)一下。說(shuō)了那么多我們已經(jīng)可以獨(dú)立寫(xiě)出任意合理占空比的偶數(shù)分頻器,以及任意50%占空比的技術(shù)分頻器。但是,如果讓手撕一個(gè)不是50%占空比的奇數(shù)分頻器怎么辦??
? ? ? ? 我在看2022數(shù)字IC秋招面經(jīng)的時(shí)候,就看到有個(gè)人面試被問(wèn)了一個(gè)非常規(guī)占空比的奇數(shù)分頻器,比如 3/10占空比的五分頻, 5/18占空比的九分頻?怎么做呢。
? ? ? ? 其實(shí)聰明的人已經(jīng)想到了,這個(gè)和上面實(shí)現(xiàn)50%任意奇數(shù)分頻器的原理是類(lèi)似的,但是采用與運(yùn)算。用占空比為 2/5 上升沿采樣的信號(hào)和 2/5占空比下降沿采樣的信號(hào)相與,這樣由于下降沿采樣信號(hào)滯后上升沿采樣信號(hào)半個(gè)參考周期。
? ? ? ? 所以相與后,占空比就為 2/5 - 1/10 = 3/10 ,示意圖如下:

????????明白了這個(gè)原理,那么同樣的道理5/18占空比的九分頻也不在話(huà)下了。
? ? ? ? 下面給出 5/18 占空比的九分頻代碼:
代碼:?

testbench:?

????5/18占空比的九分頻就是用上升沿采樣的3/9占空比九分頻 和下降沿采樣的3/9占空比九分頻相與,最后結(jié)果為3/9-1/18 = 5/18 占空比。具體修改只需要改cnt判斷數(shù)值以及把clk_out 的賦值從clk_out1,clk_out2相或改成相與。?

????????具體波形如上,和我們的分析一致,任意占空比的小數(shù)分頻手撕代碼到此結(jié)束。