6、任意小数分频

6、任意小数分频

小数分频器是分频器中最难的一种,而且不能像整数分频那样得到均匀且占空比为50%的分频输出。
以8.7分频为例:
小数分频,8.7分频,87个输入上升沿对应10个输出上升沿

在这里插入图片描述

87 = 10 * 8.7
87 = 9 * 9 + 1 * 6
87 = 8 * 9 + 2 * 7.5
87 = 7 * 9 + 3 * 8
87 = 6 * 9 + 4 * …
87 = 5 * 9 + 5 * …
然后采用若干种(一般是两种)整数分频在87个原周期clk_in内产生10个新时钟周期clk_out。整数分频的分频系数有很多种选择,但要尽可能接近,提高clk_out的均匀度一般推荐在小数分频系数 N的附近选取。因为 8 < N < 9 , 所以两个整数分频系数是8和9。接着要计算87个clk_out周期分别有多少个是8分频和9分频的。设每10个clk_out中有x个8分频输出和y个9分频输出,则可列出如下方程:
x + y = 10;
8x+9y = 87;
可得x = 3,y=7。3个8分频和7个9分频一组,循环输出,就等效于8.7分频。

在这里插入图片描述

`timescale 1ns/1ns
module div_M_N
(
	input  wire clk_in,
	input  wire rst,
	output wire clk_out
);
	parameter M_N   = 8'd87; 
	parameter c89   = 8'd24;  // 8/9时钟切换点
	parameter div_e = 5'd8;   // 偶数周期
	parameter div_o = 5'd9;   // 奇数周期
	//*************code***********//
	reg [7:0] cnt;
	reg [4:0] cnt1,cnt2;
	reg clk_temp;
	//总计数器
	always@(posedge clk_in or negedge rst)begin
	    if(!rst)
	        cnt <= 0;
	    else if(cnt == M_N-1)	//计数到最大值清零
	        cnt <= 0;
	    else 
	        cnt <= cnt + 1;
	end 
	//分开计数器
	always@(posedge clk_in or negedge rst)begin
	    if(!rst)begin
	        cnt1 <= 0;
	        cnt2 <= 0;
	    end
	    else if(cnt < c89)begin
	        if(cnt1 == div_e-1)	//计数到偶数最大值清零
	            cnt1 <= 0;
	        else
	            cnt1 <= cnt1 + 1;
	    end
	    else begin
	        if(cnt2 == div_o-1)	//计数到奇数最大值清零    	
	            cnt2 <= 0;
	        else
	            cnt2 <= cnt2 + 1;
	        end
	end
	//判断输出
	always@(posedge clk_in or negedge rst)begin
	    if(!rst)
	        clk_temp <= 0;   
	    else if(cnt < c89)begin
	        if(cnt1 < 3'd4)			//在0~24之间,计数0~3翻转,8分频
	            clk_temp <= 1;
	        else 
	            clk_temp <= 0;
	    end
	    else begin
	        if(cnt2 < 3'd4)			//在24~87之间,计数0~3翻转,9分频
	            clk_temp <= 1;
	        else
	            clk_temp <= 0;
	    end
	end 
	assign clk_out = clk_temp;
	//*************code***********//
endmodule

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值