【频率计】基于FPGA的频率计设计

       利用Altera公司的FPGA器件为主控器;在软件上,采用VHDL硬件描述语言编程,再MAXPLUSII中开发,极大地减少了硬件资源的占用。该数字频率计的lHz10MHz输入被测脉冲信号具有频率测量用途。频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的频率值就越准确,但闸门时间越长则每测一次频率的间隔就越长。闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。通过两种不同的设计思路,设计两个不同的频率计,通过观察实验结果,得出频率计精度,作出对比。在此次设计中,均以1秒为闸门时间,在该时间内计算待测信号的脉冲个数,并显示频率值。

      目前,FPGA的设计方法主要有两种,自下而上的设计方法与自上而下的设计方法。另外。还可根据实际情况,利用这两种方法的组合进行综合设计,即综合设计方法。

所以,在本系统,我们也将对其进行自顶向下的设计方法,其顶层代码如下所示:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY FREQ IS



PORT(FSIN:IN STD_LOGIC;

     CLK:IN STD_LOGIC;

     DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));

END ENTITY FREQ;



ARCHITECTURE ART OF FREQ IS

COMPONENT CNT10 IS



PORT(CLK,CLR,ENA:IN STD_LOGIC;

     CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

     CARRY_OUT:OUT STD_LOGIC);

END COMPONENT CNT10;



COMPONENT REG32B IS



PORT(LOAD:IN STD_LOGIC;

     DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);

     DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));

END COMPONENT REG32B;



COMPONENT TESTCTL IS



PORT(CLK:IN STD_LOGIC;

     TSTEN:OUT STD_LOGIC;

     CLR_CNT:OUT STD_LOGIC;

     LOAD:OUT STD_LOGIC);



END COMPONENT TESTCTL;

SIGNAL SE,SC,SL:STD_LOGIC;

SIGNAL S1,S2,S3,S4,S5,S6,S7,S8:STD_LOGIC;

SIGNAL SD:STD_LOGIC_VECTOR(31 DOWNTO 0);

BEGIN

U0:TESTCTL PORT MAP(CLK=>CLK,TSTEN=>SE,CLR_CNT=>SC,LOAD=>SL);

U1:CNT10 PORT MAP(CLK=>FSIN,CLR=>SC,ENA=>SE,

                  CQ=>SD(3 DOWNTO 0),CARRY_OUT=>S1);

U2:CNT10 PORT MAP(CLK=>S1,CLR=>SC,ENA=>SE,

                  CQ=>SD(7 DOWNTO 4),CARRY_OUT=>S2);

U3:CNT10 PORT MAP(S2,SC,SE,SD(11 DOWNTO 8),S3);

U4:CNT10 PORT MAP(S3,SC,SE,SD(15 DOWNTO 12),S4);

U5:CNT10 PORT MAP(S4,SC,SE,SD(19 DOWNTO 16),S5);

U6:CNT10 PORT MAP(S5,SC,SE,SD(23 DOWNTO 20),S6);

U7:CNT10 PORT MAP(S6,SC,SE,SD(27 DOWNTO 24),S7);

U8:CNT10 PORT MAP(S7,SC,SE,SD(31 DOWNTO 28),S8);

U9:REG32B PORT MAP(LOAD=>SL,DIN=>SD(31 DOWNTO 0),DOUT=>DOUT);

END ARCHITECTURE ART;

2计数器模块

该十进制计数模块由八个一位十进制计数器组成,计数器的特殊之处是,有一个时钟使能输入端ENA,用于锁定计数值。当高电平是计数允许,低电平时计数禁止。

该测频的八位十进制频率计的计数模块,先通过VHDL语言编写一位十进制计数器,再将其原件例化后搭建一个八位十进制计数模块。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY CNT10 IS

PORT(CLK:IN STD_LOGIC;

     CLR:IN STD_LOGIC;

     ENA:IN STD_LOGIC;

     CQ:OUT INTEGER RANGE 0 TO 15;

     CARRY_OUT:OUT STD_LOGIC);

END ENTITY CNT10;

ARCHITECTURE ART OF CNT10 IS

SIGNAL CQI:INTEGER RANGE 0 TO 15;

BEGIN

PROCESS(CLK,CLR,ENA)IS

BEGIN

IF CLR='1'THEN CQI<=0;

ELSIF CLK'EVENT AND CLK='1'THEN

IF ENA='1'THEN

IF CQI<9 THEN CQI<=CQI+1;

ELSE CQI<=0;END IF;

END IF;

END IF;

END PROCESS;

PROCESS(CQI) IS

BEGIN

IF CQI=9 THEN CARRY_OUT<='1';

ELSE CARRY_OUT<='0';END IF;

END PROCESS;

CQ<=CQI;

END ARCHITECTURE ART;

3数字存模块

       锁存模块由锁存器构成,主要功能是数据的稳定显示,不会由于周期行的清零信号而不断闪烁。在信号LOAD的上升沿后即被所存到寄存器的内部,并由锁存器的输出端输出,然后由实验板的7段译码器译成能在数码管上显示的相对应的数值。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY REG32B IS

PORT(LOAD:IN STD_LOGIC;

     DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);

     DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));

END ENTITY REG32B;

ARCHITECTURE ART OF REG32B IS

BEGIN

PROCESS(LOAD,DIN) IS

BEGIN

IF LOAD'EVENT AND LOAD='1' THEN DOUT<=DIN;

END IF;

END PROCESS;

END ARCHITECTURE ART;



    最后我们开始系统的仿真,由于在仿真过程中,1S钟时间将会仿真很长时间,所以我们考虑缩短仿真时间,我们首先假设系统时钟频率1hz对于设置参数为如下所示(左图),而输入的被测试信号的频率为(右图):

 

图1 参数设置一

这里表示输入的时钟是系统时钟的10倍,即10hz,那么其仿真结果为:

图2 系统仿真结果

检测到信号的频率为10hz。

参考文献

[01] 章彬宏,EDA应用技术,北京理工大学出版社,2007                  

[02] 杨刚等,现代电子技术——VHDL与数字系统设计,电子工业出版社,2004   

[03] 张亦华等,数字电路EDA入门---VHDL程序实例集,北京邮电大学出版社,2004 A35-02

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值