基于可编程器件的任意进制计数器的设计方法
扫描二维码
随时随地手机看文章
1 引言
目前计数器设计主要有软件、硬件电路搭建和EDA技术编程实现等多种方式。其中,EDA技术编程实现方式由于具有软件的灵活性和接近硬件电路计数器的最高计数频率而应用广泛。但对于位宽8 bit以上,模式较复杂的计数器采用EDA技术编程、调试却非常繁琐。Altera公司考虑到工程上的具体应用,增加MAX+plus II设计软件的灵活性,设置LPM(Librarv of Parameterized Moclules)元件库供设计人员使用。该库包含一些常用功能模块所生成的元件,其元件引脚和参数由用户直接指定,可适应不同设计需要(如利用LPM元件库中的lpm_counter元件设计任意进制计数器)。使用LPM元件库优点如下:(1)LPM设计的电路与结构无关;(2)设计人员利用LPM设计时,不用担心芯片利用率和效率等问题,无需自行设计基本的标准逻辑单元来构造某种功能,直到设计结束,设计人员都无需考虑其最终结构,设计输入和模拟仿真独立于物理结构。作为EDIF(电子设计交换格式)标准的一部分,LPM得到EDA界的广泛支持。
2 lpm_counter元件介绍
lpm_counter是LPM元件库的可调参数计数器元件,其最大计数位宽为32 bit,最小计数时钟周期达8 ns(125 MHz,使用EPM7032LC44-6实现);实现加、减或可逆计数;同步或异步清零/置数功能可选;通过参数设置,实现任意进制、输出位宽不超过32 bit的加、减或可逆同步/异步计数器。
2.1 引脚及功能描述
1pm_counter元件的引脚端中,只有时钟端是必选的,需要外界提供计数信号;其他引脚端都为可选,当这些引脚端未选中时,其值为缺省值,引脚在计数器图形符号中不显示。
各引脚端功能描述如下:
data[]:数据输入总线端,输入信号位宽由LPM_WIDTH决定,用于异步或同步置数。
clock:时钟端,上升沿触发。
clk_en:时钟信号输入允许端;缺省值为“1”(允许)。
cnt_en:计数允许端,缺省值为“1”(允许)。在同步置数、同步输入设置或同步清零时为“0”(禁止)。
updown:计数方向控制端,缺省值为“l”(加计数)。若选择“LPM_DIRECTION”参数,则该引脚端禁止使用。
cin:低位进位端,若省略,其缺省值为“0”。
aclr:异步清零端,缺省值为“0”(禁止)。如果同时输入异步清零和异步输入设置信号,则异步清零信号有效,屏蔽异步输入设置信号。
aset:异步输入设置端,缺省值为“0”(禁止)。当aset端输入“1”时,q[]输出全“1”或为“LPM_AVALUE”指定值。
aload:异步置数端,缺省值为“O”(禁止)。若选用“异步置数”端,必须连接“data[]”端。该aload端可置入计数初始值。
sclr:同步清零端,缺省值为“O”(禁止)。如果同时输入同步清零和同步输入设置信号,则同步清零信号有效,屏蔽同步输入设置信号。
sset:同步输入设置端,缺省值为“0”(禁止)。当sset端输入“1”时,q[]输出全“l”或为“LPM_SVALUE”指定值。
sload:同步置数端,缺省值为“O”(禁止)。若选用“同步置数”端,必须连接“dat[]”端。该sload端可置入计数初始值。
q[]:计数值输出端,输出位宽由“LPM_WIDTH”决定。
eq[15..0]:输出端,计数器模值必须小于16。当计数值为c时,则输出端eq[c]为1(高电平)。例如:当计数值c=0时,则输出端eq[0]=l;当计数值c=1时,则输出端eq[1]=1;……。
cout:进位端。
2.2 参数及功能
lpm_counter元件参数中LPM_WIDTH参数是必选项.其他参数为可选项。各参数的功能说明如下:
LPM_WIDTH(计数位宽):该参数最大取值为32。它决定计数器置数端(data[])和输出端(q[])的位宽;决定LPM_MODULUS的最大取值(2 LPM_WIDTH)。若LPM_MODULUS参数取值大于2 LPM_WIDTH,则计数器不能正常工作。
LPM_DIRECTION(计数方向):有“UP”,“DOWN”和“UNUSED”3种取值。如果使用LPM_DIRECTION参数,则updown端不连接,其参数默认值为“UP”。
LPM_MODULUS(计数模数):该参数决定计数器的进制:如果该参数不设置,则其缺省值为二进制,且其最大计数值为2 LPM_WIDTH;如果aload(或sload、asel、sset)所置数值比LPM_MODULUS参数大,则计数值出错。
LPM_AVALUE(异步计数初值):如果aset=1,则该计数初值被加载。如果该指定值比LPM_MODULUS大,则计数器输出值出错。
LPM_SVALUE(同步计数初值):如果sset=1,则该计数初值被加载。如果该指定值比LPM_MODULUS大,则计数器输出值出错。
3 设计实例
某型带峰谷费率设置的数字电能表要安装一实时钟模块,实现日、时、分、秒等计时功能,实现不同时段用户所耗电能以不同费率计费。图l为该电能表计时模块原理框图。
由于日、时、分、秒计数器的结构除计数进制不同外,其他部分完全一样,因此图1中仅给出秒计数电路部分。本设计实例以其中的秒脉冲计数器为例,以lpm_counter元件为基础,设计一个可异步清零、可置数的60进制异步计数器.说明采用lpm_counter元件设计任意进制计数器的方法。
3.1 调入lpm_counter元件
首先打开MAX+plus II软件,然后建立图形输入文件“S_count60.gdf”,在图形编辑器的空白处双击鼠标左键,打开元件输入对话框。在对话框的Symbol Libraries窗口中双击X:maxplus2max21ibmega_lpm(X为MAX+plus II软件所在盘的盘符);在Symbol Files窗口中双击lpm_counter,得到LPM_COUNTER元件。
3.2 参数设置
从mega_lpm元件库调入的LPM_COUNTER元件,其缺省状态为二进制计数器,必须根据设计要求对其设置,得到符合设计要求的计数器。LPM_COUNTER元件的设置包括参数设置和引脚端设置两部分,下面分别加以说明:
(1)参数设置设计一个60进制的计数器,必须设置LPM_WIDTH(计数位宽)和LPM_MODULUS(计数模数)两个参数,LPM_MODULUS=60;又因为LPM_MODULUS必须小于2 LPM_WIDTH,因此必需满足LPM_WIDTH≥6,这里设置LPM_WIDTH=6。如果通过总线置计数器计数初值,则其他参数可不设置。
(2)引脚端设置 根据设计要求,该计数器为可异步清零、可置数60进制异步计数器,因此对外连接的引脚端应包括:clock、clk_en、data[]、aclr、aload、q[]端和进位端cout。此处data[]和q[]端位宽由LPM_WIDTH(计数位宽)参数决定。
(3)操作步骤在Symbol Files窗口中双击lpm_counter在得到LPM_COtINTER元件的同时,将打开如图2所示的参数设置对话框。
在对话框中的“Ports”区的“Name”窗口中选中所需引脚端,然后在“Port Status”区选择“Used”,重复上述过程,直到所需的引脚端全部设置完毕。在对话框中的“Parameters”区的“Name”窗口中选中需要设置的参数。然后在“ParametersValue”编辑窗口中填入相应的参数值,单击按钮“Change”,即可完成该参数的设置;重复上述过程,直到所需参数全部设置完毕,点击“OK”,退出LPM元件参数设置对话框。以上设置完成后,就可按常规图形输入方式给元件添加输入、输出引脚,并对引脚命名,从而完成整个设计。完成设计后的电路如图3所示。
3.3 仿真测试
对上述电路进行波形仿真,得到图4所示的仿真结果。从仿真结果可看出,该计数器实现60进制加计数、清零和置数功能,进位脉冲正常。并将其下载到FPGA器件进行测试,各控制端功能正常,计数器运行良好,性能稳定,达到设计目标。
3.4 方案实现
采用上述方法分别设计出秒、分、时、日计数器及秒脉冲形成分频器。该分频器对系统时钟11.059 2 MHz脉冲进行分频,从而形成秒脉冲。通过对这些计数器进行组合,共同构成完整的实时钟模块。该模块清零、校时等功能由上位机通过RS485总线对其控制实现。通过装机运行,测得月误差在27 s内,达到较高的计时精度。
4 结束语
由于MAX+plus II设计软件的mega_lpm元件库(可调参数元件)所提供的库元件都经Ahera公司的测试和优化.可保证元件的逻辑稳定性,保证可编程器件的芯片利用率及效率达到最优。因此使用LPM库元件设计计数器电路时,可使设计人员摆脱硬件电路的束缚以及避免软件编程、调试等烦琐细节问题,从而系统设计大大提高设计效率。