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

📄 etester.vhd

📁 FPGA实现等精度的频率和脉宽测量
💻 VHD
字号:
LIBRARY IEEE;    
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;


ENTITY etester IS
PORT (
    BCLK : IN STD_LOGIC; --标准频率时钟信号clock2,50MHZ
    TCLK : IN STD_LOGIC; --待测频率时钟信号
     CLR : IN STD_LOGIC; --清零和初始化信号
      CL : IN STD_LOGIC; --当SPUL 为高电平时,CL 为预置门控信号,用于测频计数
                         --时间控制当SPUL 为低电平时,CL 为测脉宽控制信号,
                         --CL 高电平时测高电平脉宽而当CL 为低电平时,测低电平脉宽。
    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)   --8 位数据读出
      ); 
END etester;


ARCHITECTURE behav OF etester IS
SIGNAL BZQ : STD_LOGIC_VECTOR(31 DOWNTO 0); --标准计数器
SIGNAL TSQ : STD_LOGIC_VECTOR(31 DOWNTO 0); --测频计数器
SIGNAL ENA : STD_LOGIC;                     --计数使能
SIGNAL MA, CLK1, CLK2, CLK3 : STD_LOGIC;
SIGNAL Q1,Q2,Q3,BENA,PUL : 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)
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 + -