在定时电路中,合适而准确的时钟脉冲基准信号极其重要,一般用晶振作为基准信号。但晶体产品因制造的不一致性,或者恶劣的环境干扰(如高温高压等),会带来晶振时基有别,如果电路设计中没有加以考虑,同类电路产品之间也就会带来定时的误差。用简单计数器分频法可以解决这个问题,但是,简单分频器是整数分频,定时时间越长,累计误差越大。若用分数分频器,由于计算近似值不易处理,也会带来较大的累计误差。对于一些精度要求高的场合,尤为明显。本文就此给出了一种较合理的解决方法:在时域,对时钟周期差给予累计,进而校正计时时钟。
1 基本原理
在所需定时的时间间隔里,对实际时钟周期与标准时钟周期之差进行累积,累积到一个周期,对计时时钟修改一次,这样,不断累积,不断修改,从而将实际时基信号(慢或快)校正为一个标准时基信号。为此,首先采用同步加法器,对周期差进行累计,其进位输出可以表明累计值达到一个周期;其次,通过采集进位端输出,并区分开实际比标准时钟慢或快,从而产生插入脉冲或扣除脉冲;最后,将产生的插入脉冲和扣除脉冲与实际时钟脉冲相叠加后变成标准时钟脉冲信号,作为定时电路的时基信号,这样,就解决了时钟校正问题。
本设计的核心是加法器与脉冲产生时序:
(1)加法器 加法器位数(二进制)决定了校正的精度,位数越高,精度越高。加法器原理图如图1所示,图中cy是加法器的进位输出端,ck_time为实际时钟或待校时钟。
设加法器位数14位,标准时钟周期为Ts,待校时钟ck_time周期为Tx。则周期差:Tx-Ts,由比例因子关系可得:
加法器一个加数:A=(Tx-Ts)/Tx×214另一个加数:B是加法器的和数
例如:Tx=51.42μs,Ts=20μs则A10 011
若定时1 s,则最大可能累计误差为一个周期加上由于计算误差引起的累计误差之和:
可见累计误差是较小的。
(2)脉冲产生时序 为了产生正确时序,首先将实际时钟ck经4分频之后,生成一个ck_time的脉冲信号,作为实际时钟对待;生成一个脉冲信号ck_inc和ck_dec,以产生插入脉冲inc_o和扣除脉冲dec_o,如图2所示。
2 VHDL语言代码的设计
VHDL硬件描述语言是IEEE国际工业标准,具有描述能力强、可以与工艺无关、易于共享与复用等特点。多VHDL语言以及MAXPLUSⅡ平台的。根据以上原理设计VHDL代码,总体分为3个功能模块:加法器模块、时钟校正模块以及定时模块。
(1)加法器模块(add14) 直接引用MAXPLUSⅡ的参数化设计库PLM内容。
(2)时钟校正模块(updat_ck) 代码中clr_a和IC_dc为全局清零信号和被校时钟快慢标志,id_dc为1表示Tx比Ts慢,则插入脉冲inc端有输出;反之,扣除脉冲dec端有输出。inc,dec即为图2的inc_o,dec_o。主要代码如下(省去了加法器的元件例化及IEEE库说明等):
(3)定时模块 主要是将updat_ck模块的输出时钟校正信号inc和dec被校时钟信号timp_ck作为输入,在使能en信号有效时,并行置入定时初始值data_in之后,定时开始,当定时到,输出一个具有一定脉宽的tm_over信号。仿真波形如图2所示。为了简便起见,仿真的Grid size设为2.5μs,定时位数是8位二进制,用计数器count表示。当count=255时,表示定时到,tm_over=“1”。另外,时钟快慢标志ic_dc为“1”时表示被校时钟慢于标准时钟,data_in=FAH;当ic_dc为‘0’,被校时钟快于标准时钟,置入data_in=FCH。VHDL主要原代码如下:
3 结语
本设计的主要部分——时钟校正不仅可以用在定时电路中,也可以作为分数分频器用于其他电路中。其主要优点是电路简单、使用资源少、精度控制灵活等。