基于vhdl的数字频率计设计内容摘要:

器 当收到使能信号 ,分频器启动 ,将标准 1 kHz 信号经 3 次 10 分频 ,得到 100 Hz, 10 Hz, 1 Hz 信号。 1 Hz 信号既作为开关控制的时钟信号 ,也作为显示电路自锁存器的取样时钟 (即锁存器的输出使能信号 )。 1 kHz,100 Hz, 10 Hz 信号作为计数器闸门信号来控制计数 ,以实现不同量程 ,具体输出哪种频率的信号 ,由锁存器发出的量程选择信号控制。 具体实现模块如下 图 2 所示。 图 2 信号的具体实现 t10 为 10 进制计数器 ,对输入时钟进行计数 ,计到 10 输出一进位。 通过这 31 kHz 1Hz 输出 量程选择信号 t10 t10 t10 3选1模块 8 个十进制计数 器级联 ,可将 1 kHz 标准信号分频为 100 Hz,10 Hz,1 Hz。 由 3 选 1模块 ,根据量程选择信号选择 1 kHz,100Hz, 10 Hz 之一输出。 再考虑具体的实现,在测频率的时候,由于采用输入信号作为时基,以输入信号为时钟,用一个计数器测量在一个时基周期里,输入信号的周期数目,如此就可以得到输入信号的频率。 但是一个时基信号,例如频率为 100Hz 的脉冲信号,在整个 100ms 的周期里,根据占空比,有高电平也有低电平,这就给计数器计数的判断带来了麻烦。 最好是能够产生一个高电平为 100ms 的脉冲信号作为时基, 那么就能够在程序中以“如果时基信号为 1”作为判断条件,如果满足条件则计数器计数,方便了程序的书写。 同理,在这个设计中还要产生高电平为 10ms 和 1ms 的脉冲信号作为时基。 另外,也 可以 考虑使用状态机来实现这 3 种时基,因为采用状态机来控制时序很清楚,不容易出错。 状态机用 1kHz(周期为 1ms)的脉冲信号触发,因为所要生产的时基中,频率最大(周期最小)的就是 1kHz 的脉冲,要产生高电平为 10ms 和 1ms 的脉冲信号,可以采用 100 个状态的状态机,从状态 1,状态 2......到状态 1ms 的脉冲信 号,只要在状态 99 的时候产生高电平,状态 100 的时候回到低电平即可;要产生高电平为 10ms 的脉冲信号,则要在状态 90 的时候产生高电平,在状态 100 的时候回到低电平。 需要产生哪个时基得根据此时频率计所在的挡作为判断条件进行控制。 在 100 个状态中,有很多状态的功能相同的,可以将它们合并。 计数器的设计 计数控制器 计数控制模块将输入的分频信号处理 ,产生计数闸门信号、计数清零信号和锁存信号。 各信号 时序如图 3 所示。 图 3 各信号时序图 由于分频信号的不同 ,可产生不同频率的闸门信号。 1 kHz, 100 Hz, 10 Hz 分清零信号 锁存信号 闸门信号 分频信号 9 频信号对应产生脉宽为 s, s, s 的脉冲方波 (闸门信号 ),也分别对应 1 MHz, 100 kHz, 10 kHz 量程。 在闸门信号为高时计数 ,为低时终止计数。 计数一结束 ,即发出锁存信号 ,将计数结果送锁存器锁存。 锁存信号由高变低后 ,发出计数器清零信号 [6]。 计数器 采用 3 个 具有使能功能的 十 进制计数器级联作为计数模块。 闸门信号与待测信号相与作为计数输入, 计数结果直 接输出给锁存器。 计数器可以直接定义成一个整型信号,这样计数器计数(即加 1)就十分方便,只要使用语句“计数器 =计数器 +1;”就可以。 但是这个计数值要作为显示输出,就要将这个计数器用个位、十位、百位分开表示,而且要遵循加法“逢十进一”的规则。 这样可以直接通过 7 段译码器进行显示。 因为在不同的挡位,小数点的位置是不同的,所以小数点的显示以所在挡为判断条件 , 计数器模块 源 程序如下: library ieee。 use。 use。 use。 entity frequency is port(treset:in std_logic。 异步复位端口 tclk:in std_logic。 时钟输入 tsig:in std_logic。 信号输入 tkeep1:out std_logic_vector(3 downto 0)。 计数值个位 tkeep2:out std_logic_vector(3 downto 0)。 计数值十 位 tkeep3:out std_logic_vector(3 downto 0))。 计数值百位 end entity frequency。 architecture one of frequency is signal tcou1:std_logic_vector(3 downto 0)。 内部计数值个位 signal tcou2:std_logic_vector(3 downto 0)。 内部计数值十位 signal tcou3:std_logic_vector(3 downto 0)。 内部计数值百位 begin ctrcou:process(treset,tclk)控制计数功能的进程 begin if treset=39。 139。 then tcou1=0000。 tcou2=0000。 tcou3=0000。 10 else if tclk39。 event and tclk=39。 139。 then if tsig=39。 139。 then时基信号高电平为判断条 件有效的时候遇到时 钟上升沿触发 if tcou3=1010 then tcou3=1010。 如果百位为 10,百位数值不变 else if tcou1=1001 and tcou2=1001 and tcou3=1001 then 如 果计数值为 999 tcou1=0000。 tcou2=0000。 tcou3=1010。 则计数值百位变成 10,十位、个位变成 0 elsif tcou1=1001 and tcou2=1001 then 如果百位小于 9,十位为 9 且个位为 9 的时候 tcou1=0000。 tcou2=0000。 tcou3=tcou3+1。 百位数值加 1,十位、个位清零 elsif tcou1=1001 then 如果百位和十位都小于 9 且个位为 9 的时候 tcou1=0000。 tcou2=tcou2+1。 个位清零,十位数值加 1 else tcou1=tcou1+1。 其他情况就是个位数值加 1 end if。 end if。 else 如果时基信号为 0,那么判断条件无效 tcou1=0000。 tcou2=0000。 tcou3=0000。 end if。 end if。 end if。 end process ctrcou。 oputctr:process(treset,tsig)控制数值输出的进程 begin if treset=39。 139。 then tkeep1=0000。 tkeep2=0000。 tkeep3=0000。 else if tsig39。 event and tsig=39。 039。 then 11 时钟下降沿触发输出各位数值 tkeep1=tcou1。 tkeep2=tcou2。 tkeep3=tcou3。 end if。 end if。 end process oputctr。 end one。 该模块生成的引脚符号如 图 4 所示。 图 4 计数器模块引脚符号图 锁存器设计 每当锁存使能信号来临 ,锁存器便将锁存结果读入、锁存。 锁存器还完成量程选择功能。 锁存器对计数结果进行判断 ,若计数结果在 099~999 之间时 ,不改变量程选择信号。 若结果大于 999,则输出溢出标志 ,并改变量程选择信号 ,使量程增大一档。 若结果小于 099,则使量程减小一档。 锁存器还根据当前量程 ,选择合适的小数点位置输出。 锁存器源 程序如下: library ieee。 use。 use。 use。 entity lock is port(reset:in std_logic。 lockin:in std_logic。 lockout:out std_logic)。 end lock。 architecture behave of lock is signal inlock:std_logic。 begin process(reset,lockin) begin 图 5 锁存器模块引脚符号图 if reset=39。 139。 then inlock=39。 039。 elsif lockin39。 event and lockin=39。 139。 then inlock=not inlock。 end if。 12 计 数 器 数码 管选择信号 7 位数码驱动 1 kHz t3 位选择 7段译码器 位译码 end process。 lockout=inlock。 end behave。 该模块 生成的引脚 符号 如图 5 所示。 七 段译码器的设计 由于小数点由锁存器输出 ,故 仅 需要 考虑数码管 7 段驱动, 采用循环扫描方式。 译码显示电路的 具体实现如图 6 所示。 Cnt3 是一个 3 进制计数器 ,计数状态0、 2 分别应数码管的个、十、百位。 它控制哪个数码管 就 选中及输出相应的数据。 位选择是一个 3 选 1 模块 ,位译码是一个 23 译码器 ,它的输出循环选通数码管。 7 段译码器将计数值译成相应的 7 段数码驱动值。 7 段译码器将输入的 4位 BCD 码以 7 段译码的方式输入。 可以使用一个 7 位向量来分别表示 7 段译码器中的 7 段。 图 6 译码 显示电路的实现 译码器模块 源 程。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。