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
演示视频:
设计文档:

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代码仿真
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » Quartus数字频率计VHDL代码仿真