📄 freq_change_chk.vhd
字号:
--函数功能:测量频率变化率,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 + -