1 系统结构及基本设计原理
以一个8位十进制、测量范围为1Hz~100MHz的数字频率计为例,采用100MHz的标准频率信号,说明设计的基本原理及实现。设计的数字频率计由测量频率模块、计算模块和译码模块组成,如图1所示。测频模块采用两个十进制计数器分别测出门控时间内的标准信号和被测信号的周期数Ns和Nx。计算模块则根据公式Fx/Nx=Fs/Ns算出Fx,通过译码即可得到被测信号频率的7段数码显示。
数字频率计的设计原理实际上是测量单位时间内的周期数。这种方法免去了实测以前的预测,同时节省了划分频段的时间,克服了原来高频段采用测频模式而低频段采用测周期模式的测量方法存在换挡速度慢的缺点。
为克服低频段测量的不准确问题,采用门控信号和被测信号对计数器的使能信号进行双重控制,大大提高了准确度,如图2所示。
当门控信号为1时,使能信号并不为1,只有被测信号的上升沿到来时,使能端才开始发送有效信号,两个计数器同时开始计数。当门控信号变为0时,使能信号并不是立即改变,而是当被测信号的下一个上升沿到来时才变为0,计数器停止计数。因此测量的误差最多为一个标准时钟周期。当采用100MHz的信号作为标准信号时,误差最大为0.01μs。
2 高速串行BCD码除法运算原理
利用FPGA实现二进制除法运算,一种方法是采用逼近法,这种方法速度低、准确性不高。另一种方法是采取被除数与除数的倒数相乘的方法,即将除数作为寄存器的地址,其倒数的小数部分作为寄存器的内容,通过一次寄存器寻址来计算除数的倒数。这种方法在一个时钟周期内即可完成一个完整的除法运算,虽然速度较高,但对于多字节除法运算,不仅程序复杂,而且占用资源较多。根据频率计的实际情况,本设计采用串行除法运算,利用多个时钟周期完成一个完整的除法运算,从而兼顾了频率计对速度和资源两方面的要求。
2.1 多位串行BCD码减法原理
在数字串行除法运算中,减法运算是必不可少的部分。数字串行BCD码的减法运算是将P位的BCD码分为P个宽为4的二进制数,然后从低位开始相减,在P个时钟周期内完成减法操作。如果输入的操作数位数为8,那么串行BCD码减法器可以在8个时钟周期内完成8位BCD码减法运算。
数字串行减法的控制也比较简单,1位BCD码减法运算完成,进行移位操作,并且移位次数加1,然后通过采用start信号指示新计算周期。当移位次数为n时,输出移位寄存器完成串/并转换,输出结果。设计者可以根据实际情况,通过选择不同的n,提高设计的灵活性。本设计选择n=8。
该设计在提高速度的同时,节省了资源。实验证明,采用1OOMHz的工作频率,实现一个8位BCD码串行减法运算,耗用的资源却小于实现2位BCD码并行减法运算所耗用的资源。
2.2 多位串行BCD码除法原理
本设计采用循环式除法运算,循环原理可以用下面的公式表示[1]:
ω[j+1]=rω[j]-dqj+1
式中,ω[j]为第j步的余数,ω[0]为被除数;d为除数;qj+1为第j+1步所得的商;r为与移位步长有关的常数,在此取为16。
除法运算循环图表如图3所示。
循环步骤如下:
·将ω[j]左移四位,构成rω[j]。
·通过多次BCD码减法运算,求得部分商qJ+1,得到部分余数。
·部分余数、部分商移位,准备下次循环。
高速串行BCD码除法是建立在BCD码减法运算基础上的循环运算。用被除数减除数得到部分余数的BCD码,如果够减,则使商加1;否则,余数和商同时左移四位,并记录移位的次数m,根据对有效位数的不同要求,可以对m进行赋值,如果要求保留8位有效数字,则m=8。
在这种循环除法运算中,减少循环的次数是提高运算速度比较有效的方法。在一般循环式除法运算中,是从低位开始进行循环相减,循环次数等于商。如果是8位除法运行,则得到一个8位的商,要进行8位次的BCD码减法循环,例如:56895230/8=7111903.8,要进行7111903.8次循环,计算的速度可想而知。
在本设计中借鉴了一般十进制除法的运算方法,从高位开始相减,大大减少了循环次数。下面以一个例子说明它的原理:
·将被除数和除数移位,使其第一位BCD码不为0000,并记录移位的次数P(例如:56895230/80000000,p=8)。
·比较最高位的大小,如果除数的最高位大于被除数的最高位,则将除数右移4位,同时将P减1(即:56895230/08000000,且p=7)。
·得到的数卢为小数点的位置(F:7说明小数点的位置在第七位数后)。
·循环相减。当部分余数小于08000000,再将部分余数左移四位,继续进行相减。循环m次后即可得到m个有效数字的结果,然后根据p可以确定小数点的位置。
使用这种方法计算一个8位数的除法运算,循环减法次数最大为80次,每次循环使用时间为8个时钟周期。如果工作频率为100MHz,则最长的运算时间为6.4μs,运算速度大大提高。
3 设计实现
采用VHL语言设计一个复杂的电路系统,运用自顶向下的设计思想[2],将系统按功能逐层分割的层次化设计方法进行设计。在顶层对内部各功能块的连接关系和对外的接口关系进行了描述,而功能块的逻辑功能和具体实现形式则由下一层模块来描述。根据频率计的系统原理框图(图1),运用自顶向下的设计思想。各功能模块采用VHDL语言来描述。
在计数模块中,通过译码完成的信号COMP和标准信号计数器的溢出信号ov2对门控信号CL进行控制。可以根据不同的情况选择门控信号的时间范围,使设计具有一定的灵活性。采用门控信号CL和被测信号BSN对两个8位十进制计数器进行同步控制。根据D触发器的边沿触发的特点,可以将输入的门控信号CL作为D触发器的输入信号,而将被测信号BSN作为D触发器的脉冲控制信号,使触发器的输出端只有在被测信号BSN上升沿时才发生变化,实现了对使能信号的双重控制。
本设计比较重要的一部分是运算单元。由于在运算单元中采用的是串行运算,因此其工作频率必须足够高。在FPGA中实现时,如何提高串行BCD码除法运算的速度是比较关键的问题。
BCD码减法运算采用行波进位方法,因此必须尽量减小进位逻辑上的延迟。ACEX 1K系列的每个LE中都提供了一个专用的进位链和级联链,充分利用这些资源可以提高多位串行BCD码减法的性能。根据ACEX1K系列周期约束,其延时为:
Tclk=Tco+B+Tsu-(E-C)
式中,Tco为clock-output的延时,Tsu为建立时间,两个时间均可达到1~2ns;B表示数据延时,为0.6ns;E-C)表示时钟倾斜[4]。因此,总时钟延时为4.6ns,即工作频率可以达到200MHz以上。本文采用100MHz的工作频率,提高了运算速度。为了减小延时、提高工作效率,在对布局布线进行精确控制以后,把BCD码减法运算做成模块,在除法运算过程反复调用,达到了模块复用效果,大大提高了资源的利用率。
在整个BCD码除法运算单元,首先通过输入数据决定信号是否超出测量范围。
·当ov1为1时,该信号的频率大于1Hz;
·当NS<NX,该信号的频率大于100MHz;
·当NS=NX,该信号的频率为1Hz;
·当NS>NX,该信号频率在测量范围内。
根据输入的NS和NX计算输入信号的频率。
除法运算通过双状态机的设计控制一个BCD码减法运算。所有状态用同一时钟进行控制,实现了系统的同步设计,消除了异步逻辑中存在的种种险象。各个状态之间的关系如图4所示。当计数模块完成计数时,则将数输入除法模块,开始移位以确定输入的值;然后发clrs信号到BCD码减法运算单元开始运算,循环相减。当循环结束时,发回一个HNS信号,部分余数开始移位,进行下一轮的循环。最终输出FOUT,即运算单元结束。