​​​​​​​基于FPGA的数字频率计的设计与实现

基于FPGA的数字频率计的设计与实现

其主要实现代码如下所示:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY TESTCTL  IS

PORT(CLKK: IN STD_LOGIC;

     CNT_EN,RST_CNT,LOAD:OUT STD_LOGIC);

END TESTCTL;

ARCHITECTURE BEHAVIOR OF TESTCTL IS

SIGNAL div2clk:STD_LOGIC;

BEGIN

  PROCESS(CLKK)

   BEGIN

    IF CLKK'EVENT AND CLKK='1' THEN

       div2clk<=NOT div2clk;

    END IF;

  END PROCESS;

PROCESS(CLKK,div2clk)

  BEGIN

IF (CLKK='0' AND div2clk='0') THEN

        RST_CNT<='1';

     ELSE RST_CNT<='0';

    END IF;

END PROCESS;

LOAD<=NOT div2clk;CNT_EN<=div2clk;

END BEHAVIOR;

    测频测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求测频率控制信号发生器的计数使能信号EN能产生一个1秒脉宽的周期信号,并对频率计的每一个计数器CNT10的ENA使能端进行同步测控。当TSTEN高电平,允许计数;低电平时,停止计数,并保持其所计的数。在停止计数期间,首先需要一个所存信号LOAD的上升沿将计数器在前1秒中的计数值所存进锁存器中,并由外部的7段译码器译出并稳定的显示。所存信号之后,必须有一个清零的信号对计数器进行清零,为下一秒的计数操作做准备。测频控制信号发生器工作时序图。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT10 IS

   PORT(CLK,RST,ENA:IN STD_LOGIC;

             OUTY:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

             COUT:OUT STD_LOGIC);

END CNT10;

ARCHITECTURE JISHU OF CNT10 IS

    SIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);

  BEGIN

    PROCESS(CLK,RST,ENA)

       BEGIN

         IF(RST='1') THEN

            CQI<=(OTHERS=>'0');

         ELSIF(CLK'EVENT AND CLK='1') THEN

              IF(ENA='1') THEN

                IF(CQI="1001") THEN

                    CQI<="0000";

                    COUT<='1';

                ELSE

                    CQI<=CQI+1;

                    COUT<='0';

                END IF;

              END IF;

          END IF;

    END PROCESS;

        OUTY<=CQI;

END JISHU;

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

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

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY REG4B IS

  PORT(LOAD:IN STD_LOGIC;

       DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

       DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END REG4B;

ARCHITECTURE XIANSHI OF REG4B IS

  BEGIN

    PROCESS(LOAD,DIN)

      BEGIN

        IF(LOAD'EVENT AND LOAD='1') THEN

            DOUT<=DIN;

        END IF;

     END PROCESS;

END XIANSHI;

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

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY SHIYAN6 IS

  PORT(CLK:IN STD_LOGIC;

       fin:IN STD_LOGIC;

     dout:OUT STD_LOGIC_VECTOR(31 DOWNTO 0);

     coutt:out std_logic);

END SHIYAN6;

ARCHITECTURE M OF SHIYAN6 IS

 SIGNAL cnt_ent,rst_cntt,loadt:STD_LOGIC;

 SIGNAL dout1,dout2,dout3,dout4,dout5,dout6,dout7,dout8:STD_LOGIC_VECTOR(3 DOWNTO 0);

 SIGNAL cout1,cout2,cout3,cout4,cout5,cout6,cout7:STD_LOGIC;

  COMPONENT TESTCTL

     PORT(CLKK:IN STD_LOGIC;

          CNT_EN,RST_CNT,LOAD:OUT STD_LOGIC);

  END COMPONENT;

   COMPONENT CNT10

      PORT(CLK,RST,ENA:IN STD_LOGIC;

             OUTY:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

              COUT:OUT STD_LOGIC);

  END COMPONENT;

    COMPONENT REG4B

       PORT(LOAD:IN STD_LOGIC;

           DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

          DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

  END COMPONENT;

BEGIN

   U1:TESTCTL PORT MAP(CLK,cnt_ent,rst_cntt,loadt);

   U2:CNT10 PORT MAP(fin,rst_cntt,cnt_ent,dout1,cout1);

   U3:CNT10 PORT MAP(cout1,rst_cntt,cnt_ent,dout2,cout2);

   U4:CNT10 PORT MAP(cout2,rst_cntt,cnt_ent,dout3,cout3);

   U5:CNT10 PORT MAP(cout3,rst_cntt,cnt_ent,dout4,cout4);

   U6:CNT10 PORT MAP(cout4,rst_cntt,cnt_ent,dout5,cout5);

   U7:CNT10 PORT MAP(cout5,rst_cntt,cnt_ent,dout6,cout6);

   U8:CNT10 PORT MAP(cout6,rst_cntt,cnt_ent,dout7,cout7);

   U9:CNT10 PORT MAP(cout7,rst_cntt,cnt_ent,dout8,coutt);

   U10:REG4B PORT MAP(loadt,dout1,dout(3 downto 0));

   U11:REG4B PORT MAP(loadt,dout2,dout(7 downto 4));

   U12:REG4B PORT MAP(loadt,dout3,dout(11 downto 8));

   U13:REG4B PORT MAP(loadt,dout4,dout(15 downto 12));

   U14:REG4B PORT MAP(loadt,dout5,dout(19 downto 16));

   U15:REG4B PORT MAP(loadt,dout6,dout(23 downto 20));

   U16:REG4B PORT MAP(loadt,dout7,dout(27 downto 24));

   U17:REG4B PORT MAP(loadt,dout8,dout(31 downto 28));

END M;

    以上是顶层的模块调用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.3 系统总体仿真

        下面我们将对系统进行测试。

·编译代码:

图5-1 编译执行方法

图5-2 编译结果

·建立波形仿真文件:

图5-3 建立波形仿真文件

图5-4 添加仿真管脚

图5-5 2500HZ频率测试

图5-5 1HZ频率测试

图5-6 10HZ频率测试

图5-7 10KHZ频率测试

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值