📄 gwdvpb.vhd
字号:
LIBRARY IEEE; --等精度频率计
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY GWDVPB IS
PORT (BCLK : IN STD_LOGIC; --CLOCK1 标准频率时钟信号
TCLK : IN STD_LOGIC; -- 待测频率时钟信号
CLR : IN STD_LOGIC; -- 清零和初始化信号
CL : IN STD_LOGIC; --预置门控制
SPUL : IN STD_LOGIC; --测频或测脉宽控制
START : OUT STD_LOGIC;
EEND : OUT STD_LOGIC; --由低电平变到高电平时指示脉宽计数结束
SEL : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --多路选择控制
DATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --位数据读出
END GWDVPB;
ARCHITECTURE behav OF GWDVPB IS
SIGNAL BZQ,TSQ : STD_LOGIC_VECTOR(31 DOWNTO 0);--标准计数器/测频计数器
SIGNAL ENA,PUL : STD_LOGIC; -- 计数使能/脉宽计数使能
SIGNAL MA,CLK1,CLK2,CLK3 : STD_LOGIC ;
SIGNAL Q1,Q2,Q3,BENA : STD_LOGIC;
SIGNAL SS : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
START <= ENA ;
DATA <= BZQ(7 DOWNTO 0) WHEN SEL="000" ELSE--标准频率计数低8位输出
BZQ(15 DOWNTO 8) WHEN SEL = "001" ELSE
BZQ(23 DOWNTO 16) WHEN SEL = "010" ELSE
BZQ(31 DOWNTO 24) WHEN SEL = "011" ELSE--标准频率计数最高8位输出
TSQ( 7 DOWNTO 0) WHEN SEL = "100" ELSE--待测频率计数值最低8位输出
TSQ(15 DOWNTO 8) WHEN SEL = "101" ELSE
TSQ(23 DOWNTO 16) WHEN SEL = "110" ELSE
TSQ(31 DOWNTO 24) WHEN SEL = "111" ELSE--待测频率计数值最高8位输出
TSQ(31 DOWNTO 24) ;
BZH : PROCESS(BCLK, CLR) --标准频率测试计数器,标准计数器
BEGIN
IF CLR = '1' THEN BZQ <= ( OTHERS=>'0' ) ;
ELSIF BCLK'EVENT AND BCLK = '1' THEN
IF BENA = '1' THEN BZQ <= BZQ + 1;
END IF;
END IF;
END PROCESS;
TF : PROCESS(TCLK, CLR, ENA) --待测频率计数器,测频计数器
BEGIN
IF CLR = '1' THEN TSQ <= ( OTHERS=>'0' );
ELSIF TCLK'EVENT AND TCLK = '1' THEN
IF ENA = '1' THEN TSQ <= TSQ + 1;
END IF;
END IF;
END PROCESS;
PROCESS(TCLK,CLR)--计数控制使能,CL为预置门控信号,同时兼作正负脉宽测试控制信号
BEGIN
IF CLR = '1' THEN ENA <= '0' ;
ELSIF TCLK'EVENT AND TCLK = '1' THEN ENA <= CL ;
END IF;
END PROCESS;
MA <= (TCLK AND CL) OR NOT(TCLK OR CL) ; --测脉宽逻辑
CLK1 <= NOT MA; CLK2 <= MA AND Q1; CLK3 <= NOT CLK2; SS <= Q2 & Q3 ;
DD1: PROCESS(CLK1,CLR)
BEGIN
IF CLR = '1' THEN Q1 <= '0' ;
ELSIF CLK1'EVENT AND CLK1 = '1' THEN Q1 <= '1' ;
END IF;
END PROCESS;
DD2: PROCESS(CLK2,CLR)
BEGIN
IF CLR = '1' THEN Q2 <= '0' ;
ELSIF CLK2'EVENT AND CLK2 = '1' THEN Q2 <= '1' ;
END IF;
END PROCESS;
DD3: PROCESS(CLK3,CLR)
BEGIN
IF CLR = '1' THEN Q3 <= '0' ;
ELSIF CLK3'EVENT AND CLK3 = '1' THEN Q3 <= '1' ;
END IF;
END PROCESS;
PUL <='1' WHEN SS="10" ELSE --当SS="10"时,PUL高电平,允许标准计数器计数,
'0' ; --禁止计数
EEND <='1' WHEN SS="11" ELSE--EEND为低电平时,表示正在计数,由低电平变到高电平
'0' ; --时,表示计数结束,可以从标准计数器中读数据了
BENA <=ENA WHEN SPUL='1' ELSE--标准计数器时钟使能控制信号,当SPUL为1时,测频率
PUL WHEN SPUL = '0' ELSE --当SPUL为0时,测脉宽和占空比
PUL ;
END behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -