您的位置:首页 > 其它

FPGA利用待分频时钟实现任意分频

2017-07-24 14:29 309 查看
更新,更新一下25分频的奇数分频代码,待分频时钟频率50M。

module	FretoFre(
input									clk,
input									rst_n,

output									clk_2M,
output		reg			[4:0]				Count
);

//——————————————————————————————————————————————————————————————————-————————————————
//				分频时钟计数器
//reg			[4:0]				Count;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
Count <= 'd0;
else if(Count >= 5'd24)
Count <= 'd0;
else
Count <= Count + 1'b1;
end

//———————————————————————————————————————————————————————————————————————————————————
//	根据带分频时钟上升沿触发产生12/25占空比的时钟
reg								Pos_clk;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
Pos_clk <= 'd0;
else if(Count >= 5'd13)
Pos_clk <= 1'b1;
else
Pos_clk <= 'd0;
end

//———————————————————————————————————————————————————————————————————————————————————
//根据待分频时钟下降沿触发产生12/25占空比的时钟
reg								Neg_clk;
always @ (negedge clk or negedge rst_n)
begin
if(!rst_n)
Neg_clk <= 'd0;
else if(Count >= 5'd13)
Neg_clk <= 1'b1;
else
Neg_clk <= 'd0;
end

//———————————————————————————————————————————————————————————————————————————————————
//			或运算
assign	clk_2M = Pos_clk | Neg_clk;

endmodule

modelsim仿真



——————————————————————————————————————————————————————————————————

之前转载的一篇博客,今天晚上仔细阅读,发现写的很乱,不具备可读性和实验性。又在网上找了些资料,自己来写这个FPGA实现任意分频,看到一篇博客是利用DDS做到真正的任意分频。在误差允许的情况下对50Mclk进行任意分频也是可以的,而且开发时间短。

——————————————————————————————————————————————————————————

(一)、第一种方案是我们可以通过Quartus的PLL Ip core实现倍频和分频。

(二)、偶数倍分频很简单,大家很熟悉,通过计数器实现。若想进行N倍偶数分频,那么可以通过50Mclk触发计数器计数,当计数到(N/2 - 1)时,分频时钟翻转一次,并计数器复位。循环往复就可实现任意的偶数分频。

(三)、奇数倍分频是本篇博客的一个重点。可以分为50%占空比和非50%占空比。非50%占空比简单很多,和偶数倍分频一样,一个计数器就可以做到。

先写一下非50%占空比,以三分频为例。

module	ArbitraryFre(
input						clk,
input						rst_n,
output			[1:0]			Count_3,
output						clk_Arb3
);

reg			[1:0]				Count;//计数器
always @ (posedge clk or negedge rst_n)
if(!rst_n)
Count <= 'd0;
else if(Count >= 2'd2)
Count <= 'd0;
else
Count <= Count + 1'b1;

reg								clk_div3;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
clk_div3 <= 'd0;
else if(Count == 2'd0)
clk_div3 <= 'd0;
else if(Count == 2'd2)
clk_div3 <= 1'b1;
else
clk_div3 <= clk_div3;

assign		clk_Arb3 = clk_div3;
assign		Count_3 = Count;
endmodule



50%占空比的奇数分频可以利用上面写的利用待分频时钟上升沿触 产生占空比不为50%的奇数分频和下降沿产生占空比不为50%的奇数分频,然后二者或运算就能够得到占空比50%的奇数分频。既先根据待分频时钟的上升沿下降沿产生(N - 1)/2N分频,再将二者作或运算。以三分频为例。首先根据待分频时钟产生占空比为1/3的两个时钟信号。最后做一个或运算。

module	ArbitraryFre(
input						clk,
input						rst_n,
output			[1:0]			Count_3,
output						clk_Arb3
);

reg			[1:0]			Count;//计数器
always @ (posedge clk or negedge rst_n)
if(!rst_n)
Count <= 'd0;
else if(Count >= 2'd2)
Count <= 'd0;
else
Count <= Count + 1'b1;

reg						Posclk;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
Posclk <= 'd0;
else if(Count == 2'd0)
Posclk <= 'd0;
else if(Count == 2'd2)
Posclk <= 1'b1;
else
Posclk <= Posclk;

reg						Negclk;
always @ (negedge clk or negedge rst_n)
if(!rst_n)
Negclk <= 'd0;
else if(Count == 'd0)
Negclk <= 'd0;
else if(Count == 2'd2)
Negclk <= 1'b1;
else
Negclk <= Negclk;

assign	Count_3 = Count;
assign  clk_Arb3 = Posclk | Negclk;
endmodule



—————————————————————————————————————————————————————————————————————————————

关于小数倍的分频,等时间足够的时候,我再研究下,更上来。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: