⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freq_change_chk.vhd

📁 频率变化操作IP,希望有人喜欢!自己写的,需要的下把!
💻 VHD
📖 第 1 页 / 共 5 页
字号:
--函数功能:测量频率变化率,k=2(N1-N2)/(T*T),N1为频率未变时计数的值,N2为频率变化时计数的值
--          设置T为2秒,上式转化为K=(N1-N2)/2
--输入输出:需要采样的频率输入,时钟输入,5个状态输入,3个控制输入,9个输出数码管显示
--          ЛЧМ输出
--修改记录:2008年2月22日由徐志兵编写

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity freq_change_chk is

port(
		freqin    : in std_logic;--需要检测的频率输入
		clk20m    : in std_logic;--定时时钟
		reset     : in std_logic;--复位信号
		calculate : in std_logic;--计算控制信号
		ptym      : in std_logic;--控制产生tym信号
		s1        : in std_logic;--S1状态
		s2        : in std_logic;--S2状态
		fd0       : in std_logic;--fd0状态
		fd1       : in std_logic;--fd1状态
		fd2       : in std_logic;--fd2状态
		tym       : out std_logic;--输出A3,A5工作的信号
		seg1      : out std_logic_vector(7 downto 0);--数码管1显示
		seg2      : out std_logic_vector(7 downto 0);--数码管2显示
		seg3      : out std_logic_vector(7 downto 0);--数码管3显示
		seg4      : out std_logic_vector(7 downto 0);--数码管4显示
		seg5      : out std_logic_vector(7 downto 0);--数码管5显示
		seg6      : out std_logic_vector(7 downto 0);--数码管6显示
		seg7      : out std_logic_vector(7 downto 0);--数码管7显示
		seg8      : out std_logic_vector(7 downto 0);--数码管8显示
		seg9      : out std_logic_vector(7 downto 0)--数码管9显示

);
end freq_change_chk;

architecture a of freq_change_chk is

signal reg_count1 : std_logic_vector(35 downto 0);--36位计数寄存器存计2秒未变化频率数
signal reg_count2 : std_logic_vector(35 downto 0);--36位计数寄存器存计2秒变化频率数
signal reg_dec    : std_logic_vector(35 downto 0);--36位计数寄存器存差值
signal reg_result : std_logic_vector(35 downto 0);--36位计数寄存器存计算结果
signal regs1      : std_logic_vector(35 downto 0);--36位计数寄存器存S1状态计2秒变化频率数
signal regs2      : std_logic_vector(35 downto 0);--36位计数寄存器存S2状态计2秒变化频率数
signal regfd0     : std_logic_vector(35 downto 0);--36位计数寄存器存fd0状态计2秒变化频率数
signal regfd1     : std_logic_vector(35 downto 0);--36位计数寄存器存fd1状态计2秒变化频率数
signal regfd3     : std_logic_vector(35 downto 0);--36位计数寄存器存fd2状态计2秒变化频率数
signal regtym     : std_logic_vector(35 downto 0);--36位计数寄存器存tym状态计2秒变化频率数
signal TN1        : std_logic;--同步时钟信号10.24ms,低脉冲宽度为2us的信号
signal temp1      : std_logic_vector(12 downto 0);--产生同步时钟TN1的计数器
signal temp2      : std_logic_vector(9 downto 0);--控制产生tym的信号
signal cdelay     : std_logic;--控制延时2秒钟
signal delay      : std_logic;--脉冲2秒钟信号
signal delaycount : std_logic_vector(19 downto 0);--控制延时2秒钟计数器
signal rs1        : std_logic;--S1按钮寄存器
signal rs2        : std_logic;--S2按钮寄存器
signal rfd0       : std_logic;--fd0按钮寄存器
signal rfd1       : std_logic;--fd1按钮寄存器
signal rfd2       : std_logic;--fd2按钮寄存器
signal rptym      : std_logic;--tym按钮寄存器
signal counts1    : std_logic_vector(11 downto 0);--s1按键处理计数器
signal counts2    : std_logic_vector(11 downto 0);--s2按键处理计数器
signal countfd0   : std_logic_vector(11 downto 0);--fd0按键处理计数器
signal countfd1   : std_logic_vector(11 downto 0);--fd1按键处理计数器
signal countfd2   : std_logic_vector(11 downto 0);--fd2按键处理计数器
signal countptym  : std_logic_vector(11 downto 0);--ptym按键处理计数器
signal notfreqin  : std_logic;

---------------------------------------------------------
--             以下程序段为数码管显示函数              --
---------------------------------------------------------
function seg(datadisp : std_logic_vector(3 downto 0)) return std_logic_vector(7 downto 0) is
signal datadisp : std_logic_vector(3 downto 0);
signal segout   : std_logic_vector(7 downto 0);
begin
case datadisp is
--共阴	
--                          --abcdefgh
		when "0000"=>segout<="11111100";--0
		when "0001"=>segout<="01100000";--1            a
		when "0010"=>segout<="11011010";--2          ------
		when "0011"=>segout<="11110010";--3        f - g  - b
		when "0100"=>segout<="01100110";--4          ------
		when "0101"=>segout<="10110110";--5        e -    - c
		when "0110"=>segout<="10111110";--6          ------
		when "0111"=>segout<="11100000";--7            d
		when "1000"=>segout<="11111110";--8
		when "1001"=>segout<="11110110";--9
		when "1010"=>segout<="11101110";--A
		when "1011"=>segout<="00111110";--B
		when "1100"=>segout<="10011100";--C
		when "1101"=>segout<="01111010";--J   代表结果
		when "1110"=>segout<="10000010";--“=” 代表等于
		when "1111"=>segout<="10001110";--F
		when others=>segout<="11111110";
--共阳	
                            --abcdefgh
--		when "0000"=>segout<="00000011";--0
--		when "0001"=>segout<="10011111";--1            a
--		when "0010"=>segout<="00100101";--2          ------
--		when "0011"=>segout<="00001101";--3        f - g  - b
--		when "0100"=>segout<="10011001";--4          ------
--		when "0101"=>segout<="01001001";--5        e -    - c
--		when "0110"=>segout<="01000001";--6          ------
--		when "0111"=>segout<="00011111";--7            d
--		when "1000"=>segout<="00000001";--8
--		when "1001"=>segout<="00001001";--9
--		when "1010"=>segout<="00010001";--A
--		when "1011"=>segout<="11000001";--B
--		when "1100"=>segout<="01100011";--C
--		when "1101"=>segout<="10000101";--J   代表结果
--		when "1110"=>segout<="01111101";--“=” 代表等于
--		when "1111"=>segout<="01110001";--F
--		when others=>segout<="11111111";
end case;
return segout;
end seg;
---------------------------------------------------------
--             以上程序段为数码管显示函数              --
---------------------------------------------------------

---------------------------------------------------------
--         以下程序段为36位十进制减法器函数            --
---------------------------------------------------------
function bcd36dec(sourse1,sourse2 : std_logic_vector(35 downto 0)) return std_logic_vector(35 downto 0) is
signal sourse1,sourse2,reg_dec : std_logic_vector(35 downto 0);
begin
if sourse1(3 downto 0) >= sourse2(3 downto 0) then
	reg_dec(3 downto 0) <= sourse1(3 downto 0) - sourse2(3 downto 0); 
	if sourse1(7 downto 4) >= sourse2(7 downto 4) then
		reg_dec(7 downto 4) <= sourse1(7 downto 4) - sourse2(7 downto 4);
		if sourse1(11 downto 8) >= sourse2(11 downto 8) then
			reg_dec(11 downto 8) <= sourse1(11 downto 8) - sourse2(11 downto 8); 
			if sourse1(15 downto 12) >= sourse2(15 downto 12) then
				reg_dec(15 downto 12) <= sourse1(15 downto 12) - sourse2(15 downto 12); 
				if sourse1(19 downto 16) >= sourse2(19 downto 16) then
					reg_dec(19 downto 16) <= sourse1(19 downto 16) - sourse2(19 downto 16); 
					if sourse1(23 downto 20) >= sourse2(23 downto 20) then
						reg_dec(23 downto 20) <= sourse1(23 downto 20) - sourse2(23 downto 20); 
						if sourse1(27 downto 24) >= sourse2(27 downto 24) then
							reg_dec(27 downto 24) <= sourse1(27 downto 24) - sourse2(27 downto 24); 
							if sourse1(31 downto 28) >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28) + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;
						else
							reg_dec(27 downto 24) <= sourse1(27 downto 24) + "1010" - sourse2(27 downto 24); 
							if sourse1(31 downto 28) - '1' >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - '1' - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28)- '1' + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;
						end if;
					else
						reg_dec(23 downto 20) <= sourse1(23 downto 20) + "1010" - sourse2(23 downto 20); 
						if sourse1(27 downto 24) - '1' >= sourse2(27 downto 24) then
							reg_dec(27 downto 24) <= sourse1(27 downto 24) - '1' - sourse2(27 downto 24); 
							if sourse1(31 downto 28) >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28) + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;
						else
							reg_dec(27 downto 24) <= sourse1(27 downto 24) - '1' + "1010" - sourse2(27 downto 24); 
							if sourse1(31 downto 28) - '1' >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - '1' - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28)- '1' + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;
						end if;
					end if;
				else
					reg_dec(19 downto 16) <= sourse1(19 downto 16) + "1010" - sourse2(19 downto 16); 
					if sourse1(23 downto 20) - '1' >= sourse2(23 downto 20) then
						reg_dec(23 downto 20) <= sourse1(23 downto 20) - '1' - sourse2(23 downto 20); 
						if sourse1(27 downto 24) >= sourse2(27 downto 24) then
							reg_dec(27 downto 24) <= sourse1(27 downto 24) - sourse2(27 downto 24); 
							if sourse1(31 downto 28) >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28) + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;
						else
							reg_dec(27 downto 24) <= sourse1(27 downto 24) + "1010" - sourse2(27 downto 24); 
							if sourse1(31 downto 28) - '1' >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - '1' - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28)- '1' + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;
						end if;
					else
						reg_dec(23 downto 20) <= sourse1(23 downto 20) - '1' + "1010" - sourse2(23 downto 20); 
						if sourse1(27 downto 24) - '1' >= sourse2(27 downto 24) then
							reg_dec(27 downto 24) <= sourse1(27 downto 24) - '1' - sourse2(27 downto 24); 
							if sourse1(31 downto 28) >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28) + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;
						else
							reg_dec(27 downto 24) <= sourse1(27 downto 24) - '1' + "1010" - sourse2(27 downto 24); 
							if sourse1(31 downto 28) - '1' >= sourse2(31 downto 28) then
								reg_dec(31 downto 28) <= sourse1(31 downto 28) - '1' - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - sourse2(35 downto 32); 
							else
								reg_dec(31 downto 28) <= sourse1(31 downto 28)- '1' + "1010" - sourse2(31 downto 28); 
								reg_dec(35 downto 32) <= sourse1(35 downto 32) - '1' - sourse2(35 downto 32); 
							end if;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -