
许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。
锁相环路是一种反馈控制电路,简称锁相环(PLL)。锁相环的特点是:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。因锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
锁相环通常由鉴相器(PD)、环路滤波器(LF)和压控振荡器(VCO)三部分组成,原理框图如图3-1所示。
锁相环的工作原理如下:
1. 压控振荡器的输出经过采集并分频;
2. 和输入信号同时输入鉴相器;
3. 鉴相器通过比较上述两个信号的频率差,然后输出一个直流脉冲电压;
4. 控制VCO,使它的频率改变;
5. 这样经过一个很短的时间,VCO的输出就会稳定于某一期望值。
图3-1锁相环原理框图
锁相环可以用来实现输出和输入两个信号之间的相位同步。当没有基准(参考)输入信号时,环路滤波器的输出为零(或为某一固定值)。这时,压控振荡器VCO按其固有频率fv进行自由振荡。当有频率为fR的参考信号输入时,Ur 和Uv同时加到鉴相器进行鉴相。如果fr和fv相差不大,鉴相器对Ur和Uv进行鉴相的结果,输出一个与Ur和Uv的相位差成正比的误差电压Ud,再经过环路滤波器滤去Ud中的高频成分,输出一个控制电压Uc,Uc将使压控振荡器的频率fv(和相位)发生变化,朝着参考输入信号的频率靠拢,最后使fv=fr,环路锁定。环路一旦进入锁定状态后,压控振荡器的输出信号与环路的输入信号(参考信号)之间只有一个固定的稳态相位差,而没有频差存在。这时我们就称环路已被锁定。
环路的锁定状态是对输入信号的频率和相位不变而言的,若环路输入的是频率和相位不断变化的信号,而且环路能使压控振荡器的频率和相位不断地跟踪输入信号的频率和相位变化,则这时环路所处的状态称为跟踪状态。锁相环路在锁定后,不仅能使输出信号频率与输入信号频率严格同步,而且还具有频率跟踪特性,所以它在电子技术的各个领域中都有着广泛的应用。
一.2 全数字锁相环基本结构
随着数字电路技术的发展,数字锁相环在调制解调、频率合成、FM 立体声解码、彩色副载波同步、图象处理等各个方面得到了广泛的应用。数字锁相环不仅吸收了数字电路可靠性高、体积小、价格低等优点,还解决了模拟锁相环的直流零点漂移、器件饱和及易受电源和环境温度变化等缺点,此外还具有对离散样值的实时处理能力,已成为锁相技术发展的方向。
所谓数字PLL,就是指应用于数字系统的PLL,也就是说数字PLL中的各个模块都是以数字器件来实现的,是一个数字的电路。 数字锁相环的优点是电路最简单有效,可采用没有压控的晶振,降低了成本,提高了晶振的稳定性。但缺点是和模拟锁相环一样,一旦失去基准频率,输出频率立刻跳回振荡器本身的频率;另外还有一个缺点,就是当进行频率调整的时候,输出频率会产生抖动,频差越大,抖动会越大于密,不利于某些场合的应用。随着大规模、超高速的数字集成电路的发展,为数字锁相环路的研究与应用提供了广阔空间。由于晶体振荡器和数字调整技术的加盟,可以在不降低振荡器的频率稳定度的情况下,加大频率的跟踪范围,从而提高整个环路工作的稳定性与可靠性。
全数字锁相环主要由数字鉴相器、数字环路滤波器及数控振荡器三部分组成如图3-2所示。
其中数字环路滤及数控振荡器的时钟由外部晶振提供。不用VCO,可大大减轻温度及电源电压变化对环路的影响。同时,采用在系统可编程芯片实现有利于提高系统的集成度和可靠性。
图3-2 全数字锁相环结构框图
一.3 全数字锁相环的工作原理
当环路失锁时,数字鉴相器比较输入信号和输出信号之间的相位差异,并产生数字环路滤波器的计数方向控制信号。数字环路滤波器根据计数方向控制信号调整计数值,方向控制信号为高进行减计数,并当计数值到达0时,输出借位脉冲信号;为低进行加计数,并当计数值达到预设的值时,输出进位脉冲信号;数控振荡器则根据进位脉冲信号和借位脉冲信号在电路输出信号中进行脉冲的增加和扣除操作,来调整输出信号的频率。重复上面的调整过程,当环路进入锁定状态时,数字鉴相器的方向控制信号输出为一占空比50%的方波,而数字环路滤波器则周期性地产生进位脉冲输出和借位脉冲输出,导致脉冲加减电路的输出周期性的加入和扣除半个脉冲。这样对于输出的频率没有影响,也正是基于这种原理,可以把等概率出现的噪声很容易的去掉。
数字环路滤波器的性能优劣会直接影响到跟踪环路的性能。而采用数字化的K变模可逆计数器便于调试参数和提高系统可靠性。K变模可逆计数器的输出要直接控制频率合成器产生相应频率,使本地伪码能够准确跟踪发端信息。数字锁相环环中使用的K变模可逆计数器与模拟环中使用的环路滤波器作用一样,都对噪声及高频分量起抑制作用,并且控制着环路相位校正的速度与精度。适当选择K模的参数,可以改善环路的性能。K变模可逆计数器的设计原理是建立在模拟环路滤波器的。
第二章 数字锁相环的设计
二.2 基于FPGA的数字锁相环总体设计方案
本文设计的基于FPGA的数字锁相环结构框图如图4-1所示,主要由异或门鉴相器、K变模可逆计数器、脉冲加减器和N分频器四部分构成。时钟输入为50MHz,锁相范围为1Hz-6MHz。
图4-1 全数字锁相环结构框图
DPLL的工作过程如下:
1.当环路失锁时,异或门鉴相器比较输入信号和输出信号之间的相位差异,并产生K变模可逆计数器的计数方向控制信号也就是相位误差信号;
2.K变模可逆计数器根据计数方向控制信号调整计数值,相位误差信号为高进行减计数,并当计数值到达0时,输出借位脉冲信号;为低进行加计数,并当计数值达到预设的K模值时,输出进位脉冲信号;
3.脉冲加减电路则根据进位脉冲信号和借位脉冲信号在电路输出信号中进行脉冲的增加和扣除操作,来调整输出信号的频率;
4.重复上面的调整过程,当环路进入锁定状态时,异或门鉴相器的输出相位误差信号为一占空比50%的方波,而K变模可逆计数器则周期性地产生进位脉冲输出和借位脉冲输出,导致脉冲加减电路的输出周期性的加入和扣除半个脉冲。
这种PLL的设计方法,利用Verilog HDL语言为设计提供了极大的便利和性能保证。PLL中可逆计数器模值可随意修改,来控制PLL的跟踪补偿和锁定时间;同时,N分频器的分频值也可随意改变,使PLL可跟踪不同中心频率的输入信号,而这些只需在设计中修改几行代码即可完成。另外,设计好的PLL模块还可作为可重用的IP核,应用于其他设计。
假设输入信号的频率为,则位同步输出信号频率,脉冲加减器输出信号频率,则其时钟频率;K变模可逆计数器工作时钟可设为这里的M、N值一般均为的整数次幂,他们之间的具体关系需根据确定。
二.3 数字鉴相器的设计
鉴相器元件图如图4-2所示。两个输入信号通过鉴相器,鉴相器检测输入波形的异同,并输出两波形的相位差,以此鉴别两波形相位关系。
图4-2 鉴相器元件图
图4-2中,fin端和fout端都为输入端,fin是外部输入波形,fout是锁相后输出的波形,fin、fout输入信号都为方波;se端为输出端,输出信号为方波。
常用的鉴相器有两种类型:异或门(XOR)鉴相器和边沿控制鉴相器(ECPD),本设计中采用异或门(XOR)鉴相器。异或门鉴相器比较输入信号fin相位和输出信号fout相位之间的相位差Фse=Фfin-Фfout,并输出误差信号se作为K变模可逆计数器的计数方向信号。环路锁定时,se为一占空比50%的方波,此时的绝对相位差为90°。因此异或门鉴相器相位差极限为±90°。
数字鉴相器工作流程图如图4-3所示,当模块运行之后,鉴相器会将外部输入信号fin和fout进行比较,如果两个信号电平相同,相位差信号se输出就为高电平;如果两个信号电平不一致,则相位差信号se输出就为低电平。从而起到了鉴别波形相位的作用。
图4-3 数字鉴相器工作流程图
数字鉴相器仿真如图4-4所示,当fin和fout波形电平相同的时候se输出低电平,当两波形电平不相同时,se则会输出高电平。
图4-4 数字鉴相器仿真波形
二.4 K变模可逆计数器的设计
K变模可逆计数器根据鉴相器产生的相位差信号来进行加减运算,计数器根据输出结果生成输出进位脉冲和借位脉冲。
图4-5 K变模可逆计数器元件图
K变模可逆计数器的元件图如图4-5所示,图中kclock、reset、se、enable都为输入端,其中kclock输入信号为系统时钟方波,reset和enable输入信号为高低电平,电平从外部输入,se为鉴相器输出的相位差信号,kmode输入为三位二进制数,数值在模块内部设置;carryo和borrow为输出端,输出信号都为脉冲,脉冲分别输入到脉冲加减器中的inc和dec端口中。
K变模可逆计数器将异或鉴相器产生的相位差信号se加到K变模可逆计数器的输入端,计数器初始值设为kmode;进位脉冲到来时, 可逆计数器加1,借位脉冲到来时,可逆计数器减1。经过一段时间的计数后,当可逆计数器为ktop 时,表示本地信号超前, K变模可逆计数器输出扣脉冲信号,可逆计数器复位为kmode;当可逆计数器为0时,表示本地信号滞后, K变模可逆计数器输出增脉冲信号,可逆计数器复位为kmode。在DPLL的基本结构中,K变模可逆计数器始终起作用。
当环路锁定后,如果模数kmode较小,则K 变模可逆计数器会周期性输出超前脉冲和滞后脉冲,在脉冲加减电路中产生周期性的脉冲加入和扣除,其结果是在脉冲加减电路的输出信号中产生了周期性的误差,称为“波纹”;如果模数kmode足够大,这种误差通过N分频器后, 可以减少到N个周期出现一次,即K变模可逆计数器的超前脉冲和滞后脉冲的周期是N个参考时钟周期。kmode的大小决定了DPLL的跟踪步,kmode越大,跟踪步长越小,锁定时的相位误差越小, 但捕获时间越长kmode越小,跟踪步长越大,锁定时的相位误差越大,但捕获时间越短。
K变模可逆计数器工作流程图如图4-6所示,K变模可逆计数器根据相位差信号se来进行加减运算。在enable为高电平时,计数器开始运作。当se为高电平时,计数器进行加运算,如果相加的结果达到预设的模值,则输出一个进位脉冲信号carryo。se为低电平时,计数器进行减运算,如果结果为零,则输出一个借位脉冲信号borrow路。当输出波形同步于输入波形或只有随机干扰脉冲时,计数器加减的数目基本相等,计数结果在初始值处上下徘徊,不会产生进位和借位脉冲,滤除因随机噪声引起的相位抖动。计数器根据输出结果生成控制增减脉冲动作的控制指令。
图4-6 K变模可逆计数器工作流程图
K变模可逆计数器仿真如图4-7所示,在模块内部设置kmode值为010,当se长时间为低电平时,会有进位脉冲出现;而当se长时间为高电平,会有进位脉冲出现,se短暂的高低电平改变则不会出现脉冲信号。
图4-7 K变模可逆计数器仿真波形
二.5 脉冲加减器的设计
脉冲加减器主要处理K变模可逆计数器给出的进位脉冲和借位脉冲,并对输出波形进行周期的调整以达到锁定的效果。
图4-8 脉冲加减器元件图
脉冲加减器元件图如图4-8所示,IDclock、reset、inc、dec为输入端,其中IDclock输入信号为系统时钟方波,reset输入信号为高低电平,inc、dec输入信号为脉冲,脉冲由k变模可逆计数器中carryo和borrow中输入,,IDout为输出端,输出信号输入到N分频器中。
脉冲加减电路的实现,根据K变模可逆计数器的给出的进位脉冲信号和借位脉冲信号进行输出脉冲的调整。当没有进位脉冲信号和借位脉冲信号是,脉冲加减信号就是对时钟进行二分频输出,当有进位脉冲信号时,脉冲加减模块会增加一个脉冲,相当于减少了脉冲周期,而增加了输出频率;同理,当有借位脉冲信号时,脉冲加减模块会减少了一个脉冲,相当于增加了脉冲周期,而减少输出了频率;这样通过脉冲增减模块的对输入信号频率和相位的跟踪和调整,最终使输出信号锁定在输入信号的频率和信号上。
图4-9 脉冲加减器工作流程图
脉冲加减器工作流程图如图4-9所示,当模块运行之后,将reset置高电平使系统复位,再将reset置低电平开始工作,当输入端没有进位或借位脉冲输入时,内部反转触发器将参考时钟信号二分频。当有进位脉冲信号时,且翻转触发器又为高电平时,触发器保持低电平两个周期,而当翻转触发器为低电平时,下一个时钟脉冲到来时仍然翻转,在之后的两个周期内保持低电平。这样翻转触发器就减少了半个脉冲,从而输出就增加了半个脉冲,在分频之后fout相位就会提前,这样不断循环就能达到锁相的效果。当有借位脉冲信号时,且翻转触发器又为低电平时,触发器保持高电平两个周期,而当翻转触发器为高电平时,下一个时钟脉冲到来时仍然翻转,在之后的两个周期内保持高电平。这样翻转触发器就增加了半个脉冲,从而输出就减少了半个脉冲,在分频之后fout相位也相当于提前,这样不断循环就能达到锁相的效果。
脉冲加减器仿真如图4-10所示,当有借位脉冲dec时,脉冲加减器会减少了一个脉冲,相当于增加了脉冲周期,而减少输出了频率,当有进位脉冲inc时,脉冲加减模块会增加一个脉冲,相当于减少了脉冲周期,而增加了输出频率。
图4-10 脉冲加减器仿真波形
二.6 N分频器的设计
N分频器根据在模块内部设置分频值n,对输入信号进行分频,从而获得所需频率的波形信号。在此设置n为8,即8分频。
图4-11 N分频器元件图
N分频器元件图如图4-11所示,图中clkin是输入端,输入信号为方波,由脉冲加减器输出提供;clkout为输出端,输出信号为锁相后得到的信号。
分频器是数字电路中最常用的电路之一,在FPGA 的设计中也是使用效率非常高的基本设计。基于FPGA 实现的分频电路一般有两种方法:一是使用FPGA 芯片内部提供的锁相环电路,如 ALTERA 提供的PLL (Phase Locked Loop),Xilinx提供的 DLL (Delay Locked Loop );二是使用硬件描述语言,如VHDL 、Verilog HDL等。使用锁相环电路有许多优点,如可以实现倍频;相位偏移;占空比可调等。因此使用硬件描述语言实现分频电路经常使用在数字电路设计中,消耗不多的逻辑单元就可以实现对时钟的操作,具有成本低、可编程等优点。
N分频器对脉冲加减电路的输出脉冲再进行N分频,得到整个环路的输出信号fout。同时,因为fout=clk/2N=fc,因此通过改变分频值N可以得到不同的环路中心频率fc。
图4-12 N分频器工作流程图
N分频器工作流程图如图4-12所示,首先设置分频值n,当reset为高电平时,clkout赋低电平,并且清零计数器count;当reset为低电平时,如果计数器count的值不小于(n/2)-1,则clkout的电平翻转,并清零计数器,否则计数器count值加1。
N分频器仿真如图4-13所示,n为8,即8分频,输入信号clkin即为输出信号clkout的8倍频率。
图4-13 N分频器仿真波形
第三章 实验仿真与调试
三.2 数字锁相环的仿真
本设计中,使用得编译软件是由Altera公司生产的QuartusII进行整体的程序编译。编译过程如下:
首先,应该先建立一个与所编写的程序同名的工程名,再将所需要编译的文本输入到软件中,然成之后保存,点击编译后,软件自动进行程序的编译,如果程序中出现错误,系统会自动停止并且提示设计者错误出现的原因以及错误出现的语句,设计者对所出现的错误进行及时地更改,再重新编译,直到本程序没有任何错误为止。
此外在编译时,当系统提示出现多个错误时,应遵循从上到下的原则,进行错误的改正,当更改一个错误后重新进行一次编译,直到无错为止。
当子模块编译之后,可以通过软件自动生成该模块的器件图,在器件图中的输入和输出引脚均为程序中所设计的输入输出端口,将生成器件的元件图进行连接从而形成最终的系统电路图。
基于FPGA的数字锁相环设计的仿真关键是对锁相环设计的顶层文件进行整体仿真,各个模块的仿真只是评定该模块的设计是否正确,只能衡量各个模块的各自参数,从而确定各个模块所实现的实际功能。本文的设计就是在这个不断循环的过程中对设计进行仿真调试,最终得到满足系统要求的设计结果。
在本设计中,是通过对系统电路图进行编译,较为简单、直观,在系统电路编译没有错误后就可以对顶层文件进行系统的仿真。数字锁相环的系统元件图如图5-1所示。
图5-1 数字锁相环的系统电路图
图5-2 数字锁相环的综合仿真波形
综合仿真结果如图5-2所示,由输入时钟分频出输入信号fin,当enable为1时,fin经过锁相环路输出fout,随着两个频率的推进,经过一段时间fin和fout波形刚好正交,即完成锁相;而相位差信号逐渐变为占空比为50%的方波也能从侧面反应锁相的过程。输入时钟为16Mhz,输入信号频率为1MHz,通过以上仿真验证的设计的正确性。对于不同的设计,只需计算好频率关系,修改一下分频器的值,就可以实现不同输入信号的同步。
三.3 数字锁相环的系统实验
数字锁相环实验使用的是北京革新科技有限公司产的GX-SOC/SOPC-Dev-Lab型实验箱。实验箱上的FPGA芯片选用的是Altera公司的CycloneII系列的EP2C35F672C8芯片。
实验箱上使用的元器件包括外部时钟,FPGA适配器接口,2个LED。由于实验条件所限,这里用发光二极管来模拟锁相环信号的锁定状态。实验步骤如下:
(1) 首先在Quartus II软件的Assignment菜单下Pins 中对EP2C35F672C8芯片进行引脚配置。
(2)重新对设计顶层模块进行综合编译;
(3)利用Quartus II中 Programmer对器件进行编程配置,采用的是USB下载电缆,JTAG配置方式。
下载到实验箱中,分别对锁相环的功能进行了测试,实验表明其锁相功能可以正确实现。实验箱默认时钟为50MHz,实际实验中,为了使人眼能够识别闪烁的LED,程序中另外加入一分频器,分频值为3125000,即实际时钟为16Hz,输入波形频率为2Hz。
实验步骤如下:
(1)先将reset置高,enable置低,即开关SW1A为ON,SW2A为OFF;
(2)然后再将Reset置低,enable置高,即开关SW1A为OFF,SW2A为ON;
(3)观察LED0和LED2闪烁情况。
实验结果如图5-3所示:
刚开始运行程序,实验箱中LED0(左灯,代表输入信号fin)和LED2(右灯,代表锁相后信号fout)一起闪烁,即先一起亮,后一起灭,如图5-3中(b)(d)所示。经过一段时间,两灯亮灭不同步;再过一段时间,两灯闪烁顺序如图5-3(a)(b)(c)(d)所示,两灯以波形1/4周期时间差交替闪烁,LED闪烁过程为LED2先亮,过1/4周期时间LED0亮,过1/4周期LED2灭,过1/4周期LED0灭,即两波形已正交,完成锁相过程。
(a)锁相环调试图1
(b)锁相环调试图2
(c)锁相环调试图3
(d)锁相环调试图4
图5-3锁相环调试图
结束语
本文利用EDA技术,采用自顶向下的设计方法,在Quartus II开发平台上,使用Verilog HDL语言设计了一个基于FPGA的数字锁相环。该锁相环具有电路结构简单、控制灵活、跟踪精度高、环路性能好、易于集成的特点。理论分析和仿真实验表明,改变控制参数,可以很方便地调节锁相系统的锁相速度和稳定性,因而简化了设计过程。硬件测试结果证实,应用EDA 技术设计的全数字锁相环能够实现其锁相功能。
参考文献
[1] 张厥盛,郑继禹,万心平.锁相技术.西安:西安电子科技大学出版社,1994
[2] 胡华春,石玉.数字锁相环路原理与应用.上海:上海科学技术出版社,1990
[3] RolandE1Best著,李永明译.锁相环设计、仿真与应用.北京:清华大学出版社,2003
[4] 段吉海,黄智伟.基于CPLD/FPGA的数字通讯系统建模与设计.北京:电子工业出版社,2004
[5] 黄仰博.基于FPGA的数字滤波器实现技术研究.湖南:国防科学技术大学,2004
[6] 徐欣.VHDL与FPGA设计.北京:机械工业出版社,2005
[7] 龚建荣,李晓飞.利用 FPGA数字锁相及频率转换.南京邮电学院学报,1998,18(4):83-86.
[8] Floyd M.Gardner,姚剑清译.锁相环技术:第3版.北京:人民邮电出版社,2007.11
[9] 袁文波,张皓,唐振中.FPGA应用开发从实践到提高.北京:中国电力出版社,2007
[10] 江国强.EDA技术与应用.北京:电子工业出版社,2005
[11] 吴继华,王诚. Altera FPGA/CPLD设计(初级篇).北京:人民邮电出版社,2005.7
[12] 吴继华,王诚. Altera FPGA/CPLD设计(高级篇).北京:人民邮电出版社,2005.7
[13] 褚振勇,翁木云. FPGA设计及应用. 西安:电子科技大学出版社,2002.7
[14] 黄智伟,王彦,陈琼,潘礼,黄松. FPGA系统设计与实践.北京:电子工业出版社, 2005.1
[15] 北京理工大学ASIC 研究所.VHDL语言100例祥解.北京:清华大学出版社,2003.
[16] 边计年,薛宏熙.用VHDL设计电子线路.北京:清华大学出版社,2002.
[17] 董介春,李万玉.基于VHDL语言的数字锁相环的设计与实现.青岛大学学报,2004,19(2):84— 87.
[18] 单长虹,邓国杨,孟宪元.基于FPGA 的线性可变码位控制全数字锁相环的设计与仿真.计算机仿真,2003,20(2):111-113.
[19] 周立功.EDA实验与实践.北京:航空航天大学出版社,2007.9
[18] 王振红.VHDL数字电路设计与应用实践教程.北京:机械工业出版社,2003.6
附 录
1.鉴相器模块程序
module xormy(fin,fout,se);//异或门鉴相器
input fin,fout;
output se;
reg se;
always @(fin or fout)
begin
se=fin^fout;
end
endmodule
2.K变模可逆计数器程序
module KCounter(Kclock,reset,se,enable,carryo,borrow);
parameter Kmode=010;
input Kclock;
input reset;
input se;
input enable;
output carryo;
output borrow;
wire carryo,borrow;
reg [8:0]Count;
reg [8:0]Ktop;
always @(Kmode)
begin
case(Kmode)
3'b001:Ktop<=7;
3'b010:Ktop<=15;
3'b011:Ktop<=31;
3'b100:Ktop<=63;
3'b101:Ktop<=127;
3'b110:Ktop<=255;
3'b111:Ktop<=511;
default:Ktop<=15;
endcase
end
always @(posedge Kclock or posedge reset)
begin
if(reset)
Count<=0;
else if(enable)
begin
if(!se)
begin
if(Count==Ktop)
Count<=0;
else
Count<=Count+1;
end
else
begin
if(Count==0)
Count<=Ktop;
else
Count<=Count-1;
end
end
end
assign carryo=enable&(!se)&(Count==Ktop);
assign borrow=enable&se&(Count==0);
endmodule
3.
脉冲加减器模块程序
module IDCounter (IDclock,reset,inc,dec,IDout);
input IDclock,reset,inc,dec;
output IDout;
reg IDout;
reg inc_new,dec_new,inc_pulse,dec_pulse;
reg delayed,advanced,Tff;
always @(posedge IDclock)
begin
if(!inc)
begin
inc_new<=1;
inc_pulse<=0;
end
else if (inc_pulse)
begin
inc_new<=0;
inc_pulse<=0;
end
else if (inc&&inc_new)
begin
inc_pulse<=1;
inc_new<=0;
end
else
begin
inc_pulse<=0;
inc_new<=0;
end
end
always @(posedge IDclock)
begin
if(!dec)
begin
dec_new<=1;
dec_pulse<=0;
end
else if (dec_pulse)
begin
dec_new<=0;
dec_pulse<=0;
end
else if (dec&&dec_new)
begin
dec_pulse<=1;
dec_new<=0;
end
else
begin
dec_pulse<=0;
dec_new<=0;
end
end
always@(posedge IDclock)
begin
if (reset)
begin Tff<=0; delayed<=1;advanced<=1; end
else
begin
if (inc_pulse)
begin advanced<=1;Tff<=!Tff; end
else if(dec_pulse)
begin delayed<=1; Tff<=!Tff; end
else if (Tff==0)
begin
if(!advanced)
Tff<=!Tff;
else if(advanced)
begin Tff<=Tff; advanced<=0; end
end
else
begin
if (!delayed)
Tff<=!Tff;
else if(delayed)
begin Tff<=Tff;delayed<=0; end
end
end
end
always @(IDclock or Tff)
begin
if (Tff)
IDout=0;
else
begin
if(IDclock)
IDout=0;
else
IDout=1;
end
end
endmodule
4.
N分频器模块程序
module Ncounter (clkin,reset,clkout);
parameter n=8;
input clkin,reset;
output clkout;
reg clkout;
integer count;
always@(posedge clkin)
if(reset)
begin
clkout=0;
count=0;
end
else
begin
if(count>=(n/2)-1)
begin clkout<=~clkout;count<=0;end
else
count<=count+1;
end
endmodule
