几种常用时钟分频实现方法

这篇具有很好参考价值的文章主要介绍了几种常用时钟分频实现方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在我们学习中,常常需要对时钟进行分频处理,本文将介绍几种常用分频方法。

一、2的整数次幂分频

这种分频很简单,只需要设置一个计数器,对计数器进行计数,计数器的第i位则对应的2的i-1次幂分频。此方法适用于占空比为1/2,如果占空比不为1/2,则可用下面讲述的偶分频方法实现。

例如:现在对时钟进行2,4,8,16分频

module div_24816(
	input clk,rst,
	output clk_2,clk_4,clk_8,clk_16);
reg [3:0] count;
always@(posedge clk or posedge rst)
begin
	if(rst) 
		count <= 4'd0;
	else if(&count)  //判断计数器的四位是否全为1
		count <= 4'd0;
	else
		count <= count + 1'b1;
end 
assign clk_2 = count[0]; //2分频
assign clk_4 = count[1]; //4分频
assign clk_8 = count[2]; //8分频
assign clk_16 = count[3]; //16分频
endmodule 

仿真结果如下:

计数器分频如何实现分频,小白学FPGA,fpga开发

 二、偶分频

首先设置一个计数器,计数器的位数根据分频系数来定,然后根据计数器的值来确定分频的占空比即可。

例如:现在对时钟进行6分频,要求占空比1/2

module div(
    input reset,clk,
    output div6);
reg div6;
reg [2:0] counter;

always @(posedge   clk or posedge reset)
begin 
	if(reset)
		counter<=0;
	else
	begin
	if(counter==5)
		counter<=0;
	else
		counter<=counter+1;
	end
end 

always @(posedge clk or posedge reset)
begin
	if(reset)
		div6<=0;
	else if(counter<3) //设置占空比1/2
		div6<=1;
	else
		div6<=0;
end

endmodule 

仿真结果如下:

计数器分频如何实现分频,小白学FPGA,fpga开发

例如 :现在对时钟进行6分频,要求占空比1/3

module div(
input reset,clk,
output div6);
reg div6;
reg [2:0] counter;

always @(posedge   clk or posedge reset)
begin 
	if(reset)
		counter<=3'd0;
	else
	begin
	if(counter==3'd5)
		counter<=3'd0;
	else
		counter<=counter+1'b1;
	end
end 

always @(posedge clk or posedge reset)
begin
	if(reset)
		div6<=1'b0;
	else if(counter<3'd2) //设置占空比1/3
		div6<=1'b1;
	else
		div6<=1'b0;
end

endmodule 

仿真结果如下:

计数器分频如何实现分频,小白学FPGA,fpga开发

 三、奇分频

对于占空比不为1/2的奇分频,其步骤与占空比不为1/2的偶分频一样,这里不再重复说明。对于占空比为1/2的奇分频,我们的主要思想就是利用两个占空比不为1/2的信号相或得到。具体请看如下例子:

要求5分频,占空比1/2

module div(clk,clk_out,clk_1,clk_2,reset);
input 	clk;
input 	reset;

output 	clk_out,clk_1,clk_2;

reg 			 clk_1;
reg 			 clk_2;
reg 	[2:0]  cnt;

always@(posedge clk)
begin
	if(reset)
		cnt <= 1'd0;
	else if(cnt == 3'd4)
		cnt <= 3'd0;
	else
		cnt <= cnt + 1'd1;
end

always@(posedge clk) 
begin
	if(reset)
		clk_1 <= 1'd0;
	else if(cnt == 3'd2)
		clk_1 <= 1'd1;
	else if(cnt == 3'd4)
		clk_1 <= 1'd0;
	else
		clk_1 <= clk_1;
end

always@(negedge clk)
begin
	if(reset)
		clk_2 <= 1'd0;
	else if(cnt == 3'd2)
		clk_2 <= 1'd1;
	else if(cnt == 3'd4)
		clk_2 <= 1'd0;
	else
		clk_2 <= clk_2;
end

assign clk_out = (clk_1 | clk_2);

endmodule 

仿真结果如下;

计数器分频如何实现分频,小白学FPGA,fpga开发

 文章到此就结束了,希望上述的方法能够帮到大家!!!文章来源地址https://www.toymoban.com/news/detail-529363.html

到了这里,关于几种常用时钟分频实现方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包