?? control.vhd
字號:
Library IEEE ;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
ENTITY control IS
PORT(clk : IN STD_LOGIC;
sign : IN STD_LOGIC;
class : IN INTEGER RANGE 0 TO 7; --量程編號
clk_out : OUT STD_LOGIC; --周期測量計數(shù)器時鐘
gate : OUT STD_LOGIC;
mode : IN STD_LOGIC_VECTOR(1 DOWNTO 0)); --周期測量計數(shù)器閘門
END control;
ARCHITECTURE rtl OF control IS
SIGNAL sign_1 :STD_LOGIC; --待測信號10分頻
SIGNAL sign_2 :STD_LOGIC; --待測信號100分頻
SIGNAL sign_3 :STD_LOGIC; --待測信號1000分頻
SIGNAL sign_4 :STD_LOGIC; --待測信號10000分頻
SIGNAL sign_5 :STD_LOGIC; --待測信號100000分頻
SIGNAL sign_6 :STD_LOGIC; --待測信號1000000分頻
SIGNAL clk_1 :STD_LOGIC; --時鐘的10分頻
SIGNAL cnt2 :INTEGER RANGE 0 TO 9;
COMPONENT counter_bcd7
PORT(clr,ena,clk : IN STD_LOGIC; --clr計數(shù)器清零,en計數(shù)使能,clk時鐘
q : OUT STD_LOGIC_VECTOR(27 DOWNTO 0);--計數(shù)器輸出,該語句用于實際應(yīng)用
--q : OUT STD_LOGIC_VECTOR(11 DOWNTO 0);--計數(shù)器輸出,該語句用于仿真
zeros : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
cout : OUT STD_LOGIC); --計數(shù)器進位
END COMPONENT;
SIGNAL low : STD_LOGIC; --常低電平
SIGNAL high : STD_LOGIC; --常高電平
SIGNAL q_sig : STD_LOGIC_VECTOR(27 DOWNTO 0); --7位BCD計數(shù)器輸出
SIGNAL zeros_sig : STD_LOGIC_VECTOR(6 DOWNTO 0); --7位BCD計數(shù)器輸出ZEROS
SIGNAL cout_sig : STD_LOGIC; --7位BCD計數(shù)器輸出COUT
SIGNAL gate_mul2 : STD_LOGIC; --閘門信號的2倍頻
SIGNAL gate_sig : STD_LOGIC; --閘門信號
SIGNAL clk_mode01 : STD_LOGIC; --周期和頻率測量模式下的計數(shù)器時鐘
SIGNAL gate_mode01 : STD_LOGIC; --周期和頻率測量模式下的計數(shù)器閘門
BEGIN
low <= '0';
high <= '1';
--時鐘的10分頻
PROCESS(clk)
BEGIN
IF(clk'event AND clk='1')THEN
IF(cnt2 = cnt2'high)THEN
cnt2 <= 0;
clk_1 <= '1';
ELSE
cnt2 <= cnt2 +1;
clk_1 <= '0';
END IF;
END IF;
END PROCESS;
--7位BCD計數(shù)器
counter_control: counter_bcd7
PORT MAP (clr => low,
ena => high,
clk => sign,
q => q_sig,
zeros => zeros_sig,
cout => cout_sig);
sign_1 <= zeros_sig(0);
sign_2 <= zeros_sig(1);
sign_3 <= zeros_sig(2);
sign_4 <= zeros_sig(3);
sign_5 <= zeros_sig(4);
sign_6 <= zeros_sig(5);
--多路選通器
PROCESS(class,clk,clk_1,sign,sign_1,sign_2,sign_3,sign_4,sign_5,sign_6,mode)
BEGIN
CASE class IS
WHEN 0 =>
clk_mode01 <= clk_1;
gate_mul2 <= sign;
WHEN 1 =>
clk_mode01 <= clk;
gate_mul2 <= sign;
WHEN 2 =>
clk_mode01 <= clk;
gate_mul2 <= sign_1;
WHEN 3 =>
clk_mode01 <= clk;
gate_mul2 <= sign_2;
WHEN 4 =>
clk_mode01 <= clk;
gate_mul2 <= sign_3;
WHEN 5 =>
clk_mode01 <= clk;
gate_mul2 <= sign_4;
WHEN 6 =>
clk_mode01 <= clk;
gate_mul2 <= sign_5;
WHEN 7 =>
clk_mode01 <= clk;
gate_mul2 <= sign_6;
WHEN OTHERS =>
clk_mode01 <= clk;
gate_mul2 <= sign;
END CASE;
END PROCESS;
--二分頻
PROCESS(gate_mul2)
BEGIN
IF(gate_mul2'event AND gate_mul2='1')THEN
gate_sig <= not gate_sig;
END IF;
END PROCESS;
--選擇器
PROCESS(gate_sig,mode)
BEGIN
IF mode/="10" THEN
--周期和頻率測量工作方式
clk_out <= clk_mode01;
gate <= gate_sig;
ELSE
--脈沖寬度測量方式
clk_out <= clk;
gate <= sign;
END IF;
END PROCESS;
END rtl;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -