Quartus数字频率计VHDL代码仿真

名称:Quartus数字频率计VHDL代码仿真

软件:Quartus

语言:VHDL

代码功能:

挡位1:当被测频率在0—9999Hz时,直接显示fx值(单位Hz)

挡位2:当被测频率在10k-9999kHz时,显示10—999(单位kHz)。当被测频率fx送入时,挡位1,挡位2能自动换挡。在挡位1:有1只标志LED点亮(表示“Hz”)。挡位2:有2只LED灯点亮(表示“kHz”)

当tx>9999kHz时,显示“E.(其余熄灭)”,表示“溢出”

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com



演示视频:


设计文档:

频率计设计.doc

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 程序仿真

Testbench

仿真图



部分代码展示:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY frequence_test IS
   PORT (
      clk        : IN STD_LOGIC;--1MHZ基准频率
      signal_in  : IN STD_LOGIC;--待测信号输入
      LED_1     : OUT STD_LOGIC;--档位指示灯1
      LED_2     : OUT STD_LOGIC;--档位指示灯2
      HEX1        : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--共阳极8段数码管1
   HEX2        : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--共阳极8段数码管2
   HEX3        : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--共阳极8段数码管3
   HEX4        : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --共阳极8段数码管4
   );
END frequence_test;
ARCHITECTURE behave OF frequence_test IS
   SIGNAL count_1s     : integer:= 0;--计时
   SIGNAL second_en      : STD_LOGIC := '0';--second_en用来产生周期为2s,占空比为50%的单位脉冲(即一个周期内高电平和低电平持续时间均为1s)
   SIGNAL latch    : STD_LOGIC := '0';--锁存标志
   --8位频率计数值
   SIGNAL bit1     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL bit2     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL bit3     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL bit4     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL bit5     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL bit6     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL bit7     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL bit8     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   --8位频率锁存计数值
   SIGNAL cnt1     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL cnt2     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL cnt3     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL cnt4     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL cnt5     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL cnt6     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL cnt7     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL cnt8     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL Gear : STD_LOGIC:= '0';--档位,为高电平时切换为KHz单位,低电平时单位Hz
   SIGNAL fre_cnt    : integer:= 0;
   SIGNAL fre_cnt_buf : integer:= 0;
   SIGNAL data_1     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL data_2     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL data_3     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
   SIGNAL data_4     : STD_LOGIC_VECTOR(3 DOWNTO 0):= "0000";
BEGIN
--产生占空比为50%,周期为2s的单位脉冲second_en
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN--基准时钟为1M时,计数1000000得到1s
         IF (count_1s = 10000) THEN--为加快仿真速度,1000000修改为10000
            count_1s <= 0;
            second_en <= NOT(second_en);
         ELSE
            count_1s <= count_1s + 1;
         END IF;
      END IF;
   END PROCESS;
--****统计待测信号在单位时间1s内产生的脉冲数就是单位为Hz的频率****  
   PROCESS (signal_in)
   BEGIN
      IF (signal_in'EVENT AND signal_in = '1') THEN
         IF (second_en = '1') THEN--second_en为高电平期间(1s),统计待测信号产生的脉冲数
            if cnt1="1001" then 
cnt1<="0000"; --此IF语句完成个位十进制计数
if cnt2="1001" then 
cnt2<="0000"; --此IF语句完成十位十进制计数
if cnt3="1001" then 
cnt3<="0000"; --此IF语句完成百位十进制计数
if cnt4="1001" then 
cnt4<="0000"; --此IF语句完成千位十进制计数
if cnt5="1001" then 
cnt5<="0000"; --此IF语句完成万位十进制计数
if cnt6="1001" then 
cnt6<="0000"; --此IF语句完成十万位十进制计数
if cnt7="1001" then 
cnt7<="0000"; --此IF语句完成百万位十进制计数
if cnt8="1001" then 
cnt8<="0000"; --此IF语句完成千万位十进制计数
else 
cnt8<=cnt8+"0001";--计数
end if;
 else 
cnt7<=cnt7+"0001";--计数
 end if;
else 
cnt6<=cnt6+"0001";--计数
end if;
else 
cnt5<=cnt5+"0001";--计数
end if;
else 
cnt4<=cnt4+"0001";--计数
end if;
 else 
cnt3<=cnt3+"0001";--计数
 end if;
else 
cnt2<=cnt2+"0001";--计数
end if;
else 
cnt1<=cnt1+"0001";--计数
end if;
fre_cnt<=fre_cnt+1;--计数
latch <= '0';
         ELSE--second_en为低电平期间(1s),读取待测信号产生的脉冲数
            if (latch='0') then--将个十百千为锁存到bit1,bit2,bit3,bit4中
   bit1 <= cnt1;
bit2 <= cnt2;
bit3 <= cnt3;
bit4 <= cnt4;
   bit5 <= cnt5;
bit6 <= cnt6;
bit7 <= cnt7;
bit8 <= cnt8;
fre_cnt_buf<=fre_cnt;--频率计数锁存
                  latch <= '1';
             else--将cnt清零,为下一个高电平期间脉冲数的统计做准备
                  cnt1 <= "0000";
cnt2 <= "0000";
cnt3 <= "0000";
cnt4 <= "0000";
                  cnt5 <= "0000";
cnt6 <= "0000";
cnt7 <= "0000";
cnt8 <= "0000";
fre_cnt<=0;
            end if;
         END IF;
      END IF;
   END PROCESS;
 PROCESS (clk)
 begin
 IF (clk'EVENT AND clk = '1') THEN
 if(fre_cnt_buf>9999) then --当fre_cnt_buf>9999时
Gear<='1';--档位,为高电平时切换为KHz单位,低电平时单位Hz
LED_1<='1';
LED_2<='1';
 else
Gear<='0';
LED_1<='1';
LED_2<='0';
 end if;
 END IF;
 END PROCESS;
--****以下为频率测量结果的显示控制**** 
 PROCESS (clk)
 begin
 IF (clk'EVENT AND clk = '1') THEN
 if(bit8>="0001") then--溢出,显示E.
data_1<="1011";--不显示
data_2<="1011";--不显示
data_3<="1011";--不显示
data_4<="1010";--显示E.
 elsif(Gear='1') then --档位,为高电平时切换为KHz单位,低电平时单位Hz
data_1<=bit4;
data_2<=bit5;
data_3<=bit6;
data_4<=bit7;
 else
data_1<=bit1;
data_2<=bit2;
data_3<=bit3;
data_4<=bit4;
 end if;
 end if;
 END PROCESS;
 --第1个数码管译码
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         CASE data_1 IS--数码管显示
            WHEN "0000" =>
               HEX1 <= "11000000";--显示0
            WHEN "0001" =>
               HEX1 <= "11111001";--显示1
            WHEN "0010" =>
               HEX1 <= "10100100";--显示2
            WHEN "0011" =>
               HEX1 <= "10110000";--显示3
            WHEN "0100" =>
               HEX1 <= "10011001";--显示4
            WHEN "0101" =>
               HEX1 <= "10010010";--显示5
            WHEN "0110" =>
               HEX1 <= "10000010";--显示6
            WHEN "0111" =>
               HEX1 <= "11111000";--显示7
            WHEN "1000" =>
               HEX1 <= "10000000";--显示8
            WHEN "1001" =>
               HEX1 <= "10010000";--显示9
            WHEN "1010" =>
               HEX1 <= "00001001";--显示E.
            WHEN "1011" =>
               HEX1 <= "11111111";--不显示
            WHEN OTHERS =>
         END CASE;
      END IF;
   END PROCESS; 
    --第2个数码管译码
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         CASE data_2 IS--数码管显示
            WHEN "0000" =>
               HEX2 <= "11000000";--显示0
            WHEN "0001" =>
               HEX2 <= "11111001";--显示1
            WHEN "0010" =>
               HEX2 <= "10100100";--显示2
            WHEN "0011" =>
               HEX2 <= "10110000";--显示3
            WHEN "0100" =>
               HEX2 <= "10011001";--显示4
            WHEN "0101" =>
               HEX2 <= "10010010";--显示5
            WHEN "0110" =>
               HEX2 <= "10000010";--显示6
            WHEN "0111" =>
               HEX2 <= "11111000";--显示7
            WHEN "1000" =>
               HEX2 <= "10000000";--显示8
            WHEN "1001" =>
               HEX2 <= "10010000";--显示9
            WHEN "1010" =>
               HEX2 <= "00001001";--显示E.
            WHEN "1011" =>
               HEX2 <= "11111111";--不显示
            WHEN OTHERS =>
         END CASE;
      END IF;
   END PROCESS;
    --第3个数码管译码
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         CASE data_3 IS--数码管显示
            WHEN "0000" =>
               HEX3 <= "11000000";--显示0
            WHEN "0001" =>
               HEX3 <= "11111001";--显示1
            WHEN "0010" =>
               HEX3 <= "10100100";--显示2
            WHEN "0011" =>
               HEX3 <= "10110000";--显示3
            WHEN "0100" =>
               HEX3 <= "10011001";--显示4
            WHEN "0101" =>
               HEX3 <= "10010010";--显示5
            WHEN "0110" =>
               HEX3 <= "10000010";--显示6
            WHEN "0111" =>
               HEX3 <= "11111000";--显示7
            WHEN "1000" =>
               HEX3 <= "10000000";--显示8
            WHEN "1001" =>
               HEX3 <= "10010000";--显示9
            WHEN "1010" =>
               HEX3 <= "00001001";--显示E.
            WHEN "1011" =>
               HEX3 <= "11111111";--不显示
            WHEN OTHERS =>
         END CASE;
      END IF;
   END PROCESS;


 

    





代码文件(付费下载):



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » Quartus数字频率计VHDL代码仿真

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员