一看就会的奇偶分频电路
目錄
前言
題目
二分頻電路
第一步:畫波形圖
第二步:寫狀態機
三分頻電路——1/3占空比
第一步:畫波形圖
第二步:寫狀態機
三分頻電路——1/2占空比
第一步:畫波形圖
第二步:寫狀態機
4/5/6/7...分頻電路
第一步:畫波形圖
總結
前言
最近又到了招聘季,招聘就離不開筆試面試,而在筆試面試過程中經常出現的一道題就是寫出分頻電路的verilog代碼(以及電路圖?),因此在這篇文章里,我們使用一個公式將所有分頻電路套進去,以便于在考場上和仿真工具中輕松實現分頻電路。
題目
實現2/3/4/5分頻電路,給出一個模板:
module clk_div(reset,clk_in,clk_out) input reset ; input clk_in ; output clk_out ;//#功能實現模塊endmodule二分頻電路
第一步:畫波形圖
分頻電路是將原始信號頻率分成頻率更小的衍生信號,信號頻率變為二分之一,也就意味著周期變為2倍,因此直接將原本的2個周期所占用的時間現在變為一個周期,即可以生成一個二分頻的信號。之所以采用波形圖是因為波形圖的直觀性便于理解和思考,相對于抽象的代碼和難以理解的電路圖來說。
第二步:寫狀態機
按照三段式狀態機的標準寫法(以往文章有過介紹),寫一個序列發生器,產生我們想要的信號。在二分頻電路里,我們實際上是想實現重復的01信號的產生,這就是最簡單的序列發生器。
//#功能實現模塊 //三段式狀態機//狀態聲明 parameter s0 = 0 ; parameter s1 = 1 ;reg cs,ns always@(posedge clk_in) beginif (reset)cs <= s0;elsecs <= ns; end//狀態改變 always@(*) begincase(cs)s0: ns = s1 ;s1: ns = s0 ; end//輸出 always@(*) begincase(cs)s0: clk_out = 0 ;s1: clk_out = 1 ; end在二分頻電路中產生的是循環的01信號,所以狀態機只需要2個狀態。二分頻電路就這樣產生了,接下來看三分頻。
三分頻電路——1/3占空比
第一步:畫波形圖
如上圖所示,三分頻電路即就是將原始clk信號三個周期的時間,變為新信號clk_out_3的一個周期。我們常見的周期信號都是占空比1/2的信號,但是在上圖中我們可以看到三分頻電路可以分為兩種,一種就是1/2占空比(1.5,1.5?),而另一種就是1/3占空比的三分頻信號(001,010,100)。按照本文的公式,后者這種規則的循環序列信號很容易產生。由易向難,我們先看1/3占空比的三分頻電路。
第二步:寫狀態機
//#功能實現模塊 //三段式狀態機//狀態聲明 parameter s0 = 0 ; parameter s1 = 1 ; parameter s2 = 2 ;reg [1:0]cs,nsalways@(posedge clk_in) beginif (reset)cs <= s0;elsecs <= ns; end//狀態改變 always@(*) begincase(cs)s0: ns = s1 ;s1: ns = s2 ;s2: ns = s0 ; end//輸出 always@(*) begincase(cs)s0: clk_out = 0 ;s1: clk_out = 0 ;s2: clk_out = 1 ; end要實現三分頻電路,那么要產生的序列就是001或者010或100,此時狀態機有三個狀態,所以需要2位寄存器。簡單的1/3占空比三分頻電路實現后,現在來看1/2占空比的三分頻電路。
三分頻電路——1/2占空比
第一步:畫波形圖
如上圖所示,clk_out_3_2即為上面的1/3占空比電路,而現在我們要生成1/2占空比的三分頻電路clk_out_3,那么我們就需要在下降沿控制原始信號。但是我們無法使用下降沿和上升沿同時去控制一根信號,所以我們可以使用clk_in的下降沿產生一個010序列信號clk_out_3_1。接下來將clk_out_3_1和clk_out_3_2信號進行或[ | ]操作,即可得到1/2占空比的3分頻信號clk_out_3。
第二步:寫狀態機
//#功能實現模塊 //三段式狀態機 //上升沿觸發 //狀態聲明 parameter s0 = 0 ; parameter s1 = 1 ; parameter s2 = 2 ;reg [1:0]cs,nsalways@(posedge clk_in) beginif (reset)cs <= s0;elsecs <= ns; end//狀態改變 always@(*) begincase(cs)s0: ns = s1 ;s1: ns = s2 ;s2: ns = s0 ; end//輸出 always@(*) begincase(cs)s0: clk_out_1 = 0 ;s1: clk_out_1 = 0 ;s2: clk_out_1 = 1 ; end//三段式狀態機 //下降沿觸發 //狀態聲明 reg [1:0]cts,ntsalways@(negedge clk_in) beginif (reset)cts <= s0;elsects <= nts; end//狀態改變 always@(*) begincase(cts)s0: nts = s1 ;s1: nts = s2 ;s2: nts = s0 ; end//輸出 always@(*) begincase(cts)s0: clk_out_2 = 0 ;s1: clk_out_2 = 1 ;s2: clk_out_2 = 0 ; end//final out clk_out = clk_out_1 | clk_out_2 ;4/5/6/7...分頻電路
根據上面的模式,我們想實現一個任意分頻任意占空比的分頻電路已經不是難事了,只要畫出波形圖,仔細分析想要實現的功能,然后剩下的就只是套用公式了。
第一步:畫波形圖
四分頻電路波形圖如下,用2分頻電路再2分頻即可得到,只需要再次例化二分頻電路模塊,不用修改模塊內部代碼即可實現。亦可直接用原始信號寫一個具有4種狀態的狀態機,實現0011序列發生器。當然如果需要實現什么1/4占空比,3/8占空比,那也是被這套公式所支持的。
如下圖所示,5分頻電路其實就是3分頻電路的擴展。使用上升沿實現00011的序列發生器,再使用下降沿實現00110的序列發生器,最后將產生的兩個2/5占空比的5分頻電路或起來,即可得到1/2占空比的5分頻信號clk_out_5。奇分頻電路的實現最重要的一點就是使用下降沿觸發來實現那0.5,將多出來的這個1分成2個0.5給高電平和低電平。
總結
總的來說,實現奇偶分頻電路,只需要套用上述公式,即可輕松得到任意分頻任意占空比的分頻信號。
最后再次總結一下公式:
1.畫波形圖 :偶數分頻只需要數好周期數,即可找到中間點。而奇數分頻可以先實現簡單的接近中點的分頻,例如1/3(1.5/3)占空比分頻,2/5(2.5/5)占空比分頻等等,然后將這個接近1/2占空比的信號利用下降沿平移半個原始信號的周期,即可出現那缺少的0.5,最后再通過或[ | ]得到最終的1/2占空比的信號。
2.寫狀態機:使用狀態機實現序列發生器,通過觀察波形圖得到想要的是什么序列,然后依據本文中的代碼示例狀態機的格式和寫法進行擴展,主要是狀態機的狀態個數。
希望這篇文章能夠讓你對奇偶分頻增加更多的了解,歡迎指出錯誤和互相交流。
總結
以上是生活随笔為你收集整理的一看就会的奇偶分频电路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ## stm32F1 VL53L0X例程
- 下一篇: 机器视觉(十):印刷体字符识别