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