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