由于对任意分频器不熟悉,所以我的思路是把奇分频、偶分频分开做,然后再把他们合在一起
首先我做的是偶分频,偶分频是分频中比较简单的,需要对上升沿进行计数,当计数到
(N/2-1)
的时候,时钟进行反转,然后再计时,再反转,以此类推
//偶分频
always@(posedge clk_in or negedge rst_n)
begin
if(!rst_n)
begin
cnt<=4'b0000;
clk_out1<=0;
end
else if(cnt==(N/2-1))
begin
clk_out1<=~clk_out1;
cnt<=4'b0000;
end
else
begin
cnt<=cnt+1;
end
end
然后进行的奇分频的实验,相对于偶分频,他是比较难的,需要分别对上升沿和下降沿进行检测,然后进行相或的操作,上升沿计数到(
N-1
)
/2
的时候进行反转,到
N-1
的时候在进行反转,同理,对下降沿的操作也是一样
always@(posedge clk_in or negedge rst_n)
begin
if(!rst_n)
begin
cnt1 <= 4'b0000;
clk_p <= 0;
end
else if(cnt1 == ((N-1)/2))
begin
cnt1 <= cnt1+1'b1;
clk_p <= ~clk_p;
end
else if(cnt1 == (N-1))
begin
cnt1 <= cnt1+1'b1;
clk_p <= ~clk_p;
cnt1 <= 4'b0000;
end
else// if(cnt1 == (N-1))
begin
//cnt1 <= 4'b0000;
//clk_p <= ~clk_p;
cnt1 <= cnt1+1'b1;
end
end
always@(negedge clk_in or negedge rst_n)
begin
if(!rst_n)
begin
cnt2 <=4'b0000;
clk_n <= 0;
end
else if(cnt2 == ((N-1)/2))
begin
cnt2 <= cnt2+1'b1;
clk_n <= ~clk_n;
end
else if(cnt2 == (N-1))
begin
cnt2 <= cnt2+1'b1;
clk_n <= ~clk_n;
cnt2 <= 4'b0000;
end
else
begin
cnt2 <= cnt2+1'b1;
end
end
assign clk_out2 = clk_p | clk_n;
assign clk_out = N%2? clk_out2:clk_out1;
根据自己的理解选择的方式,接受各种建议
![睡觉](http://static.blog.csdn.net/xheditor/xheditor_emot/default/sleep.gif)
工程文件下载地址:
点击打开链接