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

更新,更新一下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

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

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




  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值