专题二.经典模块设计——分频器设计专题内容:1.分频器的原理2.二进制分频器的设计3.偶数分频器的设计4.奇数分频器的设计5.占空比可调的分频器的设计6.小数分频器的设计1.分频器的原理分频器就是对较高频率的信号进行分频,得到较低频率的信号。常见的分频器有二进制分频器、偶数分频器、奇数分频器、占空比可调的分频器和小数分频器。分频系数(倍率)rate=fin/fout2.二进制分频器的设计二进制分频就是对输入时钟进行2的整数次幂分频。设计原理:(rate=2N,N是整数)定义一个N位的计数器,对输入的时钟脉冲进行计数,计数结果的第N-1位就是对输入时钟的2的N次幂分频。将相应的位数取出即可得到分频时钟。二进制分频器的VHDL源程序Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityfdivisgeneric(N:integer:=3);--rate=2N,N为正整数port(clkin:INstd_logic;clkout:OUTstd_logic);Endfdiv;Architectureaoffdivissignalcnt:std_logic_vector(N-1downto0);Beginprocess(clkin)beginif(clkin'eventandclkin='1')thencnt=cnt+1;endif;endprocess;clkout=cnt(N-1);Enda;仿真结果从波形图可以看到,clkout是clkin的8分频,也就是2的3次幂分频。如果要产生其他次幂分频,直接修改generic类属变量参数即可。3.偶数分频器的设计rate=even(偶数),占空比50%设计原理:定义一个计数器对输入时钟进行计数,在计数的前一半时间里,输出高电平,在计数的后一半时间里,输出低电平,这样输出的信号就是占空比为50%的偶数分频信号。例如,6分频,计数值为0~2输出高电平,计数值为3~5输出低电平。偶数分频器的VHDL源程序(1)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityfdivisgeneric(N:integer:=6);--rate=N,N是偶数port(clkin:INstd_logic;clkout:OUTstd_logic);Endfdiv;Architectureaoffdivissignalcnt:integerrange0ton-1;Beginprocess(clkin)--计数beginif(clkin'eventandclkin='1')thenif(cntn-1)thencnt=cnt+1;elsecnt=0;endif;endif;endprocess;process(cnt)--根据计数值,控制输出时钟脉冲的高、低电平beginif(cntn/2)thenclkout='1';elseclkout='0';endif;endprocess;Enda;偶数分频器的VHDL源程序(2)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityfdivisgeneric(N:integer:=6);--rate=N,N是偶数port(clkin:INstd_logic;clkout:OUTstd_logic);Endfdiv;Architectureaoffdivissignalcnt:integerrange0ton/2-1;signaltemp:std_logic;Beginprocess(clkin)beginif(clkin'eventandclkin='1')thenif(cnt=n/2-1)thencnt=0;temp=NOTtemp;elsecnt=cnt+1;endif;endif;endprocess;clkout=temp;Enda;仿真结果从波形图可以看到,clkout是clkin的6分频。如果要产生其他分频,直接修改generic类属变量参数即可。4.奇数分频器的设计rate=odd(奇数),占空比50%设计原理:定义两个计数器,分别对输入时钟的上升沿和下降沿进行计数,然后把这两个计数值输入一个组合逻辑,用其控制输出时钟的电平。这是因为计数值为奇数,占空比为50%,前半个和后半个周期所包含的不是整数个clkin的周期。例如,5分频,前半个周期包含2.5个clkin周期,后半个周期包含2.5个clkin周期。奇数分频器的VHDL源程序Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityfdivisgeneric(N:integer:=5);--rate=N,N是奇数port(clkin:INstd_logic;clkout:OUTstd_logic);Endfdiv;architectureaoffdivissignalcnt1,cnt2:integerrange0toN-1;beginprocess(clkin)beginif(clkin‘eventandclkin=’1‘)then--上升沿计数if(cnt1N-1)thencnt1=cnt1+1;elsecnt1=0;endif;endif;endprocess;process(clkin)beginif(clkin‘eventandclkin=’0‘)then--下降沿计数if(cnt2N-1)thencnt2=cnt2+1;elsecnt2=0;endif;endif;endprocess;clkout='1'whencnt1(N-1)/2orcnt2(N-1)/2else'0';enda;仿真结果从波形图可以看到,clkout是clkin的5分频。如果要产生其他分频,直接修改generic类属变量参数即可。5.占空比可调的分频器的设计占空比为m:n设计原理:定义一个计数器,对输入时钟脉冲进行计数。根据计数值来判断输出高电平还是低电平。例如,占空比为3:10的偶数分频器,当计数值为0~2时,输出高电平;当计数值为3~9时,输出低电平。占空比可调的分频器VHDL源程序Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityfdivisgeneric(n:integer:=10;m:integer:=3--占空比m:n,rate=n);port(clkin:INstd_logic;clkout:OUTstd_logic);Endfdiv;architectureaoffdivissignalcnt:integerrange0ton-1;beginprocess(clkin)beginif(clkin'eventandclkin='1')thenif(cntn-1)thencnt=cnt+1;elsecnt=0;endif;endif;endprocess;clkout='1'whencntmelse'0';enda;仿真结果从波形图可以看到,clkout是clkin的10分频,且占空比为3:10。如果要产生其他分频,直接修改generic类属变量参数即可。6.小数分频器的设计时钟源与用户所需的频率不成整数倍关系,此时可采用小数分频器进行分频。比如,分频系数为2.5、3.5等半整数分频器。设计原理:先设计两个不同分频比的整数分频器,然后通过控制单位时间内两种分频比出现的不同次数来获得所需要的小数分频值。例如,10.1分频,可以设计出9次10分频,1次11分频,这样总的分频值为:F=(9×10+1×11)/(9+1)=10.1这种实现方法,由于分频器的分频值不断改变,因此分频后得到的信号抖动较大,实际应用中不常用。而当分频系数为N-0.5时,可控制扣除脉冲的时间,而不是一次N分频,一次N-1分频,这样可以得到一个稳定的脉冲频率。半整数分频器(N-0.5)的设计框图分频系数为N-0.5的半整数分频器电路可由一个异或门、一个模N计数器和一个二分频组成。异或门模N计数器f0/(N-0.5)二分频器f0/(2N-1)f0半整数分频器VHDL源程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;ENTITYfdivISgeneric(N:integer:=5);--分频系数N-0.5PORT(clkin:INSTD_LOGIC;--时钟源clkout:BUFFERSTD_LOGIC--输出时钟);ENDfdiv;ARCHITECTUREaOFfdivISSIGNALclk,div2:STD_LOGIC;SIGNALcount:integerrange0toN-1;BEGINclk=clkinXORdiv2;--clkin与div2异或后作为模N计数器的时钟PROCESS(clk)BEGINIF(clk'eventANDclk='1')THENIF(count=0)THENcount=N-1;--置整数分频值Nclkout='1';ELSEcount=count-1;--模N计数器减法计数clkout='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(clkout)BEGINIF(clkout'eventANDclkout='1')THENdiv2=NOTdiv2;--输出时钟二分频ENDIF;ENDPROCESS;ENDa;仿真结果从波形图可以看到,clkout是clkin的4.5分频。如果要产生其他分频,直接修改generic类属变量参数即可。任意整数分频LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYPULSEISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC_VECTOR(7DOWNTO0);FOUT:OUTSTD_LOGIC);END;ARCHITECTUREoneOFPULSEISSIGNALFULL:STD_LOGIC;中间信号,溢出标志信号FULLBEGINP_REG:PROCESS(CLK)VARIABLECNT8:STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFCLK'EVENTANDCLK='1'THENIFCNT8=11111111THENCNT8:=D;--当CNT8计数计满时,输入数据D被同步预置给计数器CNT8FULL='1';--同时使溢出标志信号FULL输出为高电平ELSECNT