3、设计代码
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY fre IS ---------实体名为fre
PORT(
F0: IN STD_LOGIC; -----高频信号输入端
FX:IN STD_LOGIC; -----低频信号输入端
RESET:IN BIT; -----复位端口
O_FRE:OUT STD_LOGIC_VECTOR(23 DOWNTO 0));-----测频结果输出端
END ENTITY fre;
ARCHITECTURE ART OF fre IS
SIGNAL EN : BIT; ------高频计数使能信号
SIGNAL N0 :INTEGER RANGE 0 TO 64000000:=0;-----高频计数结果传递信号
SHARED VARIABLE N00:INTEGER RANGE 0 TO 64000000; ---高频计数信号
SHARED VARIABLE NXX:INTEGER RANGE 0 TO 20; ---低频计数信号
BEGIN
FXX:PROCESS(FX,RESET)IS --------低频计数进程
BEGIN
IF(RESET='1')THEN ---------复位信号,高电平使能
NXX:=0;
ELSIF(FX'EVENT AND FX='1')THEN -------上升沿触发
IF(NXX=20)THEN -------低频计到20个脉冲周期
NXX:=0;
ELSE
NXX:=NXX+1;
END IF;
END IF;
END PROCESS FXX;
F00:PROCESS(F0,RESET)IS ------------高频计数进程
BEGIN
IF(RESET='1')THEN
N00:=0;
EN<='0';
ELSIF(NXX=20)THEN -------当低频率计到20个脉冲时,高频率计数清零
N00:=0;
EN<='0';
ELSIF(F0'EVENT AND F0='1')THEN
IF(NXX=11)THEN ----当低频率计数十个脉冲时间到时将高 - ------频率计数结果送出,并使计数停止。
N0<=N00;
EN<='1';
ELSIF(EN='0')THEN -------当EN为0时高频计数
IF(NXX=0)THEN ------两者同时计数,减少计数不同步产生的误差
N00:=0;
ELSE
N00:=N00+1;
END IF;
END IF;
END IF;
END PROCESS F00;
SHOW:PROCESS(F0,EN)IS --------计算频率进程
VARIABLE N:INTEGER RANGE 0 TO 64000000:=0;
BEGIN
IF(RESET='1')THEN
N:=0;
ELSIF(EN='1')THEN
N:=640000000/N0;
END IF;
O_FRE<=CONV_STD_LOGIC_VECTOR(N,24);-----将INTEGER转换为 -----STD_LOGIC_VECTOR类型,并且与O_FRE长度相同
END PROCESS SHOW;
END ARCHITECTURE ART;
文章评论(0条评论)
登录后参与讨论