
任意数(整数、小数)分频器.doc
5页任意数(整数、小数)分频器任意数(整数、小数)分频器一、一、 分频原理分频原理1.1 偶数倍分频 偶数倍分频通过计数器计数是很容易实现的如进行 N 倍偶数分频,那么可以通过由待 分频的时钟触发计数器计数,当计数器从 0 计数到 N/2-1 时,输出时钟进行翻转,并给计数器 一个复位信号,使得下一个时钟从零开始计数以此循环下去这种方法可以实现任意的偶 数分频 1.2 奇数倍分频 奇数倍分频通过计数器也是比较容易实现的,如进行三分频,通过待分频时钟上升沿触 发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到 1 时,输出时钟进行翻转,计数到 2 时再次进行翻转即是在计数值在邻近的 1 和 2 进行了两 次翻转这样实现的三分频占空比为 1/3 或者 2/3要实现占空比为 50%的三分频时钟,可 以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生 的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为 50%的三分频时钟这 种方法可以实现任意的奇数分频归类为一般的方法为:对于实现占空比为 50%的 N 倍奇 数分频,首先进行上升沿触发进行模 N 计数,计数选定到某一个值进行输出时钟翻转,然后经 过(N-1)/2 再次进行翻转得到一个占空比非 50%奇数 n 分频时钟。
与此同时进行下降沿触 发的模 N 计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样 经过(N-1)/2 时,输出时钟再次翻转生成占空比非 50%的奇数 n 分频时钟两个占空比非 50%的 n 分频时钟相或运算,得到占空比为 50%的奇数 n 分频时钟如图 1-1 所示,是一个 3 分频器的仿真时序图图 1-13 分频器时序图1.3 小数分频 1.3.1 原理 小数分频有很多方法,基本原理都是一样,在若干分频周期中,使某几个周期多计或 少计一个数,从而在整个周期的总体平均意义上获得一个小数分频比 设:K 为分频系数;N 为分频系数的整数部分;X 为分频系数的小数部分;M 为输入脉 冲个数;P 为输入脉冲个数;n 为小数部分的位数 则有:K=N+10-n *X 1 K=M/P 2 由式 1 和式 2 可得 M=K*P=(N+10-n *X)*P 3 令 P 约等于 10n ,则:M= 10n *N+X 4 可知在进行次 N 分频时,多输入 X 个脉冲,则可实现小数分频。
1.3.2 电路组成 每个周期分频 N+10-n.X,其电路双模前置小数分频器电路由÷N/N+1 双模分频器、控 制计数器和控制逻辑 3 部分组成当 a 点电平为 0 时,进行÷N 分频;当 a 点电平为 1 时 进行÷N+1 分频适当设计控制逻辑,使在 10n个分频周期中分频器有 X 次进行÷N+1 分频, 这样,当从 fo输出 10n个脉冲时,在 fi处输入了 X.(N+1)+(10n-X).N 个脉冲,也就是 10n.N+X 个脉冲,其原理如图 1-2 所示图 1-2双模前置分频电路结构图若是电路从 N 分频切换到 N+1 分频和从 N+1 分频切换到 N 分频都会产生一个随时间增 长的相位,如果简单的先进行 n 次 N 分频后做 n1 次 N+1 分频会产生很大的相位抖动所以 采用“均匀”法将两种分频混合均匀 具体方法如下: ⑴:若 K 为一位小数形式,则: 设累加变量 a ;常量 b = 10 – 小数位 * 10 ①:a >= 10 ,a = a – 10 以 N 分频; ②:a = 100 ,a = a – 100 以 N 分频; ②:a 20023800341400 -> 400251000 -> 02÷N/N+1控制计数器控制逻辑afofi图 1-32.4 倍分频器时序图分频器的精度受控制计数器的影响,当 N 值 100 时,小数分频精度达到 1/100,当 N 值为 1 000 时,小数分频的精度达到 1/1 000,依次类推。
因此,此分频器在分频系数值 较小时相位误差大,故在实际应用中很少用,但应输出时钟较高,分频系数较大时还是可 以满足一些应用的 2.2 功能现实 分频系数可能通过参数 INT_DIV 或 POI_DIV 修改,方便应用于不同的程序程序代码 如下所示若参数 INT_DIV 为 0 时,输出无时钟;当输入时钟占空比为 50%,输出时钟占 空比也为 50% //*******************************************************// // 任意数(整数、小数)分频模块 // // 原理:双模前置小数分频 // //*******************************************************// //功能:对输入时钟 clock 进行(INT_DIV + POI_DIV/1000)倍分频后 //输出 clk_out其中 INT_DIV 为分频系数整数部分,POI_DIV 为分频 //系数小数部分,范围为 1~2^n 的任意数,小数点后保留三位。
其中 //(n=INT_DIV_WIDTH) //若要改变分频系数,改变参数 INT_DIV 或 POI_DIV 到相应范围即可 //若输入时钟占空比为 50%当分频系数为整数倍时,则输出时钟占 //空比为是 50%,且误差为 0;当分频系不为整数倍时,输出时钟的 //每个周期占空比也为 50%,只是输出时钟精度为:1/N (N 为分频系 //数的整数部分) 所以当 N 越大时,其输出精度越高故当为小数 //分频时,输出时钟误差大(宏观上是无误差或误差很小) ,不能 //用于对时钟要求高的场合module float_div(clock,clk_out);//I/O 口声明 input clock;//输入时钟 outputclk_out;//输出时钟//内部寄存器 regclk_odd_p;//奇数倍分频上升沿输出时钟 reg clk_odd_n;//奇数倍分频下降沿输出时钟 reg clk_even;//偶数倍分频输出时钟 reg[INT_DIV_WIDTH - 1:0] count_odd_p;//奇数倍分频上升沿脉冲计数器 reg[INT_DIV_WIDTH - 1:0] count_odd_n;//奇数倍分频下降沿脉冲计数器 reg[INT_DIV_WIDTH - 1:0] count_even_p; //偶数倍分频上升沿脉冲计数器 reg[10:0] count_c;//N/N+1 分频控制计数器 reg flag;//N/N+1 分频控制标志位//参数--分频系数>1) - 1) : (count_even_p >1) - 1); assign odd_full_div_p = INT_DIV[0] ? (count_odd_p >1) - 1) : (count_odd_p >1) - 1); assign odd_full_div_n = INT_DIV[0] ? (count_odd_n >1) ) : (count_odd_n >1));//时钟输出 assignclk_out = ((~flag //*************************************************************** //偶数倍分频,只有分频系数为偶数时才使能计数 //上升沿脉冲计数 always @(posedge clock) begin if((INT_DIV[0] flag = 1'b0;//控制 N 分频 end else flag = 1'b1;//控制 N+1 分频 endendmodule。












