一開始我是6分頻的基礎(chǔ)上做了2倍 頻,,結(jié)果描述內(nèi)容過于繁瑣,,以致寫著寫著就放棄掙揣,沒經(jīng)歷過得東西是編不出來的,?;貋碓诰W(wǎng)上找到了許多解決奇、偶數(shù)的分頻實現(xiàn),。說實話,,理論知識還是比 較多的,就是代碼實現(xiàn)有些欲蓋迷彰,,我抄寫下來驗證幾乎都是錯的,。好在理論知識分析透徹,而后我自己嘗試編寫了一下,,寫下作為分享,。 偶數(shù)分頻,例如二分頻,,簡單講就是一個時鐘周期的高電平和一個時鐘周期的低電平,。設(shè)reg cnt,默認一位,,每一個時鐘上升沿自加1,,則cnt的電平變化就可以作為二分頻輸出。由此,,設(shè)reg [3:0] cnt,,則cnt[1],cnt[2],cnt[3]對應(yīng)4/8/16分頻,。這些操作,我們常常在led延時處理上用到,。 語言描述如下: module test2_1(clk,rst_n,clk_out2,clk_out4,clk_out8); input clk; input rst_n; output clk_out2; output clk_out4; output clk_out8; reg [2:0]cnt; always@(posedge clk or negedge rst_n) if(!rst_n) cnt <=>=> else cnt <= cnt="" +1'b1;="">=> assign clk_out2 = cnt[0]; assign clk_out4 = cnt[1]; assign clk_out8 = cnt[2]; endmodule 另類偶數(shù)分頻如6/10/12分頻,,可在前3/5/6個整數(shù)周期處理輸出高/低電平,,后3/5/6個整數(shù)周期取反,,操作相對簡單,可實現(xiàn)輸出為占空比為1:1的分頻信號,。占空比不等的情況就更簡單,。 關(guān)鍵語言描述如下: (N=6) if(cnt <> cnt <= cnt="" +="">=> end else begin cnt <=>=> clk_out <=>=> End 在設(shè)計中,我處理為cnt < n/2,或cnt小于等于="" n/2-1,,結(jié)果實現(xiàn)均為8分頻,。我開始分析cnt="">< 3,那cnt就只有取0,1,2為一種狀態(tài)的電位,,記滿到3時,,電位取反,cnt清零,,重復(fù)執(zhí)行得到效果,。而事實上cnt=""><> 奇數(shù)分頻占空比為1:1的實現(xiàn)比較復(fù)雜,以5分頻為例,,我采用兩個計數(shù)器,,一個計數(shù)器在時鐘上升沿觸發(fā)計數(shù),另一個計數(shù)器在時鐘下降沿觸發(fā)計數(shù)(或clk_n = ~clk),。各自控制產(chǎn)生一個5分頻信號,,調(diào)節(jié)占空比為3:2(容易)。第一個5分頻比第二個5分頻快半個周期,,兩個信號取或,,完美將占空比分配為1:1,通俗點說,,就是3-0.5 = 2+0.5,。 此時,我也遇到了cnt < n-1和cnt2="=" (n-1)/2的問題,,尤其是cnt2="="> 因為上升沿和賦值幾乎一條線,,我沒有混淆是先采集還是先賦值,而是會糾結(jié)于多算一個周期或少算一個周期,。我還發(fā)現(xiàn)自己的邏輯設(shè)計不熟練導(dǎo)致與理想效果還是有差距的,。調(diào)試時,花在邏輯優(yōu)化的時間較長,,另外在后仿真中cnt始終為Z態(tài),,不便于我觀察,,這是我的疑惑,也是接下來要解決的吧,。 電子工程師的靈感設(shè)計之源▼點擊原文看更多文章 |
|