分频器是数字系统设计中最常见的电路之一 ,在数字系统设计中 , 经常需要对时钟进行小数倍分频 。
分频器是一种应用十分广泛的电路 ,其功能是对较高频率的信号分频, 以得到所需要的低频信号 。实际应用中,所需要的分频系数可能为整数或小数 。整数分频的实现比较简单, 可采用计数器芯片或用可编程逻辑器件设计 。
现代电子系统设计中 ,数字电子系统所占的比例越来越大 ,现代电子系统发展的趋势是数字化和集成化 。而在数字系统中 ,时钟是各模块协同工作的根本保障 ,特别是时序数字系统 ,没有时钟根本无从工作 。在数字系统设计中 ,经常需要对基准时钟进行不同倍数的分频而得到各模块所需的时钟频率 ,分频器是数字系统设计中最常见的基本电路之一 。数字分频器一般有两类 : 一类是脉冲波形均匀分布的分频器 , 即常规分频器 ; 另一类是脉冲波形不均匀分布的分频器 。常规分频器一般只能进行整数倍分频 ,且分频倍数须为偶数 。但在某些场合 ,时钟源与所需的频率不成偶数倍数关系 ,此时就需要波形不均匀的分频器 , 这种分频器除可进行整数倍分频外 ,还能进行小数倍分频 ,从而可以得到相对连续的频率输出 ,可应用于很多数字系统中 ,如直接数字频率合成中输出波形的频率控制以及步进电机中转速的控制等 。
小数分频的基本原理
小数分频器的实现方法很多, 但其基本原理一样, 即在若干个分频周期中采取某种方法使某几个周期多计或少计 1 个数 , 即吞脉冲或插入脉冲的方法 ,从而在平均意义上获得 1 个小数分频比 ,设要进行分频比为 N 的小数分频 , N 可表示为N =K +X*10^(-n)式中 , n , K , X 均为正整数 ; n 为0到X 的位数,即 N 有n 位小数 。
另一方面 ,分频比又可以写成 :N =M/P式中 : M 为分频器输入脉冲数;P 为输出脉冲数 。M = NP =( K +X*10^(-n)) P令 P =10^n , 则有M =10^n*K +X,以上是小数分频器的一种实现方法 , 即在进行K 次分频前, 输入端设法多输入 X 个脉冲 。
电路组成及工作原理
整个电路由整数/半整数分频器、计数( 10 分频) 器和译码器 、D 触发器、输出选择器等组成。分频器完成对输入信号的整数或半整数分频功能, 计数和译码部分完成输入脉冲的计数和控制信号产生功能 ,触发器产生控制所需要的信号。n =5 ,即实现小数点后 5位分频。原理图和程序的对应关系为 : 5 个预置数( E、F 、G) 从左到右依次记为 pdata0 、pdata1 、pdata2 、pdata3 、pdata4 , 输出数据选择器的选择端记为 equal05 , 分频系数的整数部分记为 data in 。
该电路是在单片机或 CPLD 的其它模块配合下工作的 ,当需要实现某个系数的分频时,单片机等控制电路向该模块设置参数 ,包括分频系数的整数部分 、预置数、hight05 、和 equal05 。当分频系数 N =0 . 5时 , equal05 =1 , 整数分频系数为 N 。当分频系数N ≠0 . 5时 ,如果小数部分小于 0 . 5 ,如分频系数为 N=0 . 23456 ,则控制方法为 equal05 =0 、high05 =0 、datain =N 、pdata0 、pdata1 、pdata2 、pdata3 、pdata4 分别为2 、3 、4 、5 、6 ; 小数部分大于 0 . 5 时 , 则用 1 减去小数部分后的差值作为预置数 , 如分频系数为 N =0 . 765 67 ,则控制方法为 equal05 =0 、high05 =1 、datain =N 、pdata0 、pdata1 、pdata2 、pdata3 、pdata4 分别为 2 、3 、4 、3 、3 ,即 pdata0 、pdata1 、pdata2 、pdata3 、pdata4 =1 -0 . 765 67 =0 . 234 33 。
计数器( 10 分频)和译码器就是确定输入多少个脉冲,在整数/半整数分频器的输出中增加或去除半个脉冲。该电路小数的位数可以根据需要任意设置 ,主要取决于CPLD 的硬件资源情况。
VHDL 语言的实现
原理图所对应的源程序包括顶层模块和底层模块,顶层模块主要是通过元件语句将各模块进行连接, 而各底层模块则完成相应的功能。底层模块主要有整数/半整数分频器 、计数和译码器、D 触发器等。下面仅介绍顶层模块和分频 、译码模块的源程序 ,程序中的库调用、元件声明和信号定义等由于篇幅均已删除。
( 1) 顶层模块
顶层模块包括底层模块之间的连接和输出信号的选择 2 部分 ,模块连接用元件语句,输出的选择直接用进程描述 。由于某些模块的连接是类同的, 为节省篇幅而又不失其总体框架, 已将类同部分删除。
ENTITY nbit pset pdivfre2 IS
GENERIC( leng : INTEGER: =7);
PORT( inclk ,EN ,reset : IN STD LOGIC ;
high05 ,equal05 : IN STD LOGIC ;
pdata0 , pdata1 , pdata2 , pdata3 , pdata4 : IN STD
LOGIC VECTOR( 2 DOWNTO 0
data in : IN STD LOGIC VECTOR( leng -1 DOWNTO0);
outclk , test1 , test2 : OUT STD LOGIC—);
END nbit pset pdivfre2 ;
ARCHITECTURE nppdf2 OF nbit pset pdivfre2 ISBEGIN
outclk <= outclk tmp ;
modecontmp<= high05 XOR ( requst0 OR requst1 OR requst2 OR requst3 OR requst4);
ff0d <= requst0 ;ff1 d <=( NOT requst0) AND requst1 ;
ff2d <=( NOT requst0) AND ( NOT requst1) ANDrequst2 ;
ff3d <=( NOT requst0) AND ( NOT requst1) AND( NOT requst2) AND requst3 ;
ff4d <=( NOT requst0) AND ( NOT requst1) AND( NOT requst2) AND ( NOT requst3) AND requst4 ;
U0 : nbit psetp divfre —整数/半整数分频PORTMAP( inclk =>inclk , EN =>EN , reset =>reset , mode con =>mode con tmp , data in =>data in ,outclk21 = >clk21 tmp , outclkn = >clkn tmp ,clkb =>clkb tmp);
PROCESS ( equal05 , data in , pdata0 , pdata1 , pdata2 , pdata3 , pdata4)—输出信号的选择BEGINIF ( equal05 =' 0' ) THEN outclk tmp <=clkn tmp ;
ELSIF ( equal05 = ' 1' ) THEN outclk tmp<=clk21 tmp ;
ELSIF( data in =1 AND pdata0 =0 AND pdata1 =0 AND pdata2 =0 AND pdata3 =0 AND pdata4 =0) THENoutclk tmp <= inclk ;
END IF ;
END PROCESS ;
U1 : difre dec —计数译码部分的元件连接PORTMAP( EN =>EN , reset =>reset , difre in
=>clkb tmp , clr requst =>clr requst0 , pset data =>pdata0 , requst =>requst0 , cnt co =>cnt0 co);
……U5 : difre decPORTMAP( EN =>cnt3 co , reset =>reset , difrein =>clkb tmp , clr requst =>clr requst4 , pset data=>pdata4 , requst =>requst4 , cnt co =>cnt4 co);
U6 : D ff PORT MAP( D =>ff0 d , reset =>GND ,CLK =>clkb tmp , outq =>ff0 q); —触发器部分的连接……U15 : D ff PORT MAP( D =>ff4 q , reset =>GND ,CLK =>inclk , outq =>clr requst4);
END nppdf2 ;
( 2) 计数译码模块
该模块对输入脉冲计数, 以决定何时在输出中插入或去除 1 个脉冲(吞脉冲), 所以该模块由计数( 分频)、译码和控制信号产生等 3 部分构成 ,其中译码部分的源程序用流程图表示:
BEGIN
PROCESS( difre in , reset , EN)—10 分频的描述VARIABLE state : INTEGER RANGE 0 TO 1 ;
BEGINIF reset =' 1' THEN count q <=( OTHERS =>' 0' );
ELSIF ( difre in' EVENT AND difre in =' 1' ) THENIF EN =' 1' THENIF( count q =9) THENcount q <=”0000” ;
cnt co <=' 1' ;
ELSE count q <=count q +' 1' ;
cnt co <=' 0' ;
END IF ;
ELSE cnt co <=' 0' ;
count q <=count q ;
END IF ;
END IF ;
END PROCESS ;
—译码进程( 见右侧流程图)PROCESS ( dec out ,clr requst)
—控制信号( requst) 的产生
BEGIN
IF( clr requst =' 1' ) THEN requst <=' 0' ;
ELSIF( dec out' EVENT AND dec out =' 1' ) THENrequst <=' 1' ;
END IF ;
END PROCESS ;
END dd ;
( 3) N 位整数/半整数分频模块该模块根据单片机或 CPLD 等设置的参数不同,可以选择整数分频输出或半整数分频输出 ,取决于分频系数。
BEGIN
clk <=inclk XOR divide2 ;
coutclk <=outclk tmp ;
PROCESS ( clk , EN)BEGIN
IF ( CLK' EVENT AND CLK =' 1' ) THEN
IF ( EN =' 1' ) THEN
IF ( cnt q =0) THEN
FOR i IN 0 TO leng -1 LOOP
cnt q( i)<=data in( i);
END LOOP ;
outclk tmp <=' 1' ;
ELSE
cnt q <=cnt q -1 ;
outclk tmp <=' 0' ;
END IF ;
END IF ;
END IF ;
END PROCESS ;
PROCESS ( outclk tmp)
BEGIN
IF ( outclk tmp' EVENT AND outclk tmp =' 1' ) THEN divide2 <=NOT divide2 ;
END IF ;
END PROCESS ;
END nppdf ;
几种小数分频器的设计方法
小数分频器的实现方法很多 , 但其基本原理一样 : 在若干个分频周期中采取某种方法使某几个周期少计一个或几个数 , 即吞脉冲原理 , 从而在整个计数周期的总体平均意义上获得一个小数分频比 。以下简要说明三种比较常用的小数分频电路的原理及设计方法 :
用 BCD 比例乘法器 4527 加法级联能对基频进行 10 n /X 倍分频 , 其中 , n 为 4527 的级联级数 , X 为对 4527 的置数 ; 积分分频器是比较常见的小数分频器 , 其基本原理是将小数分频比转换为整数比值 ,再采用计数器对输入时钟进行计数 , 根据计数值吞掉一些脉冲 ,从而得到所需的频率输出 ; 累加器分频则是一种基于相位累加器基本原理的一种分频技术 ,将累加器最高位作为分频输出 , 根据送入累加器中不同的累加步长改变分频倍数 。
1 采用 BCD 乘法器 4527 实现
BCD 比例乘法器 4527 接成加法级联方式 , C LK 端输入基准时钟频率 f in 由晶振电路提供 ,高位置数 K 1 , 低位置数 K 2 , 在 10 个 C LK脉冲内 4527 (1)输出 K1 个脉冲 , 同时由 IN HO UT禁止低位 4527(2)对 CLK 进行比例分配 , K 1个脉冲直通 4527 (2)送出 。 10 个 C LK 脉冲结束时 , INHO UT 发出脉冲允许 4527 (2)的 CLK 进入 , 则可有一个脉冲插入 。如此下去 , 在 100 个 C LK 脉冲内 ,会有 10 ×K 1 个脉冲直通送出 , 以及 10 个 INHO UT 脉冲 , 这样输出端 f out 便有 K 2 个脉冲插入 ,共送出(10K 1 +K 2 )个脉冲 ,即输出时钟频率 :fout = (10K 1 +K 2 )f in /100 (1)
如同上述 , n 级 4527 级联 , 预置数分别为 K 1 , K 2 ,…… , K n后 ,设 CLK 时钟端输入的基准时钟频率为fin ,则级联输出频率 :f out =f in (10n - 1 ×K 1 +10n - 2 ×K 2 +… +10 ×K n - 1 +K n )/10n 其中为 n 片 4527 的预置数 ,改变预置数即可方便地改变输出频率 。
2 积分分频器
积分分频器的设计首先需将小数分频比转换为整数比值 ,再采用计数器对输入时钟进行计数 ,根据计数值对输入时钟及插入脉冲进行选择分配 , 从而得到 需 要的 频 率输 出 脉 冲。 设“1010101010”代表 5kH z 信号中的一段信号 , 在同样长的时间内设法得到另一脉冲串“1010100000”信号 ,若其‘0’ 、 ‘1’ 宽度与 5kH z 信号中的‘0’ 、 ‘1’宽度相同 ,即为输入时钟的宽度 ,则可得到 3kHz 的时钟信号 。这样 ,多路选择器可在前三个周期选择输入时钟直接输出 , 而在后两个周期选择输出‘0’ ,就可以得到脉冲串“ 1010100000” , 从而完成 3 /5 倍的分频 ,得到 3kH z 的信号 。
3 累加器分频
在 DDS 技术中经常采用相位累加器来进行频率控制 , 对于频率不变的输入基准时钟 ,可采用对相位累加器置不同的累加步长来得到不同的寻址速率 。从中得到启示 ,也可采用累加器进行小数分频。累加器由加法器与并行数据寄存器组成 , 频率控制字经数据转换模块转换为累加器的累加步长 , 将并行数据寄存器的高位作为时钟输出 。
设输入时钟为频率 fin , 相位累加器的位数为 N , 则输出频率的分辨率(当送入的频率控制字 K 为 1 时的输出频率)为f out min =f in2N (3)从式(3)可看出 , 在累加器位数足够高时 , 最小输出频率(频率分辨率)可接近零频 。实际设计过程中 , 可根据分频倍数的要求来选择累加器的位数 。
若设频率控制字为 K , 则输出频率为f out =K f in2N (4)以上三种小数分频器各有其特点 ,采用 4527 的分频电路比较复杂 , 适用于频率为 10 的幂的输入 ;积分分频器首先需把分频倍数转换为两整数之比值 , 故在使用中 ,对分频倍数要求比较严格,灵活性受到一定限制 ; 累加器分频则对频率为 2 的幂的输入时钟分频效果比较好 ,而且输出时钟有一定的抖动 , 但还是可以应用于一些特殊场合 。
小数分频器的应用
小数分频器在数字系统设计中的应用非常广泛 , 经常是各个模块需要的频率不相同 ,这就需要对时钟进行分频得到各模块需要的时钟频率。但常规的整数分频器(实际就是计数器)不能满足要求 , 例如, 若基准时钟频率为 100M H z , 对其进行整数分频,只能得到 50M H z 、25MH z 等频率值, 如想得到30M H z 、20MH z 等频率值, 就需要应用小数分频器对基准时钟进行小数分频 。
在 DDS 波形发生器设计和步进电机驱动中, 需要对输出信号频率进行控制 , 若采用一般计数器来进行分频 ,由上述分析可知,输出信号频率值的连续性就受到限制 。为了使输出信号频率值能连续可控,就需进行小数分频。
1 在 DDS 技术中的应用
频率控制字送入分频器,设基频频率为 fin ,分频倍数为 W , 则计数器的时钟频率为为 fin /W 。计数器在频率 fin /W 的时钟作用下计数对查找表寻址输出波形数据。若查找表存储深度为 M(一个周波存储 M 个点),则输出波形的频率为f o = f inWM (5)式中 , fin为基频频率、存储深度 M 为一定值, 这样就只需控制分频倍数 K 来控制合成波形的频率。
在 DDS 技术中,常用的技术是采用累加器对查找表寻址 。但采用这种方法时 ,在输出高频与低频波形时的寻址点数不同, 在高频寻址点数较少 ,而在低频时点数较多 ,为保证在频率较高时输出的波形失真度小, 在低频阶段 , 寻址的点数就比较多 , 需要较深的存储深度 。而采用图 4 所示的方法, 则不管在低频或高频, 寻址点数一样 ,这样就可以采用一致的存储深度,节约存储器 。特别是采用 CPLD 进行系统设计时, 查找表也可采用 CPLD 来设计, 易于系统集成 。
2 在步进电机驱动中的应用
步进电机是一种用电脉冲信号进行控制 , 将电脉冲信号转换为相应的角位移或线位移的控制电机。在步进电机的驱动中, 需要对步进电机转速进行控制。基准时钟在频率控制字作用下分频得到所需频率的脉冲作为脉冲分配器的时钟, 这样即可控制脉冲分配器输出驱动脉冲的速率 ,经功率放大后驱动步进电机 。
此外 ,步进电动机的最高起动频率(突跳频率)一般为几百 H z 到三、四千 H z , 而最高运行频率则可以达到几万 H z 。以超过最高起动频率的频率直接起动, 将出现“失步”(失去同步)现象 ,有时根本就转不起来 。而如果先以低于最高起动频率的某一频率起动, 再逐步提高频率, 使电机逐步加速 ,则可以到达最高运行频率。而且, 对于正在快速旋转的步进电动机 ,若需停转, 立即停发脉冲 , 令其立即准确锁定 ,也是很难实现的; 由于惯性, 电动机往往会冲过头 ,也会出现失步 。如果电动机的工作频率总是低于最高起动频率 ,当然不会失步 ,但电动机的潜力没有发挥 ,工作速度太低了 。