📄 4.txt
字号:
控制模块是频率计的核心所在,具有如下所述功能:
对输入数据判断并输出档位信号;
——10KHZ最高位为1010,换高档,最低位为0000,小数点不亮,表无信号;
——100KHZ最高位为1010,换高档,最高位为0000,换低档测试;
——1MHZ、10MHZ同100KHZ测试档。
针对不同的档位输出不同的时基信号;
——100ms时基信号,用于10KHZ档位测量
——10ms时基信号,用于100KHZ档位测量
——1ms时基信号,用于1MHZ档位测量
——0.1ms时基信号,用于10MHZ档位测量
为动态扫描显示模块提供10KHZ脉冲;
——内部状态机与扫描信号同需要10KHZ脉冲信号,故将控制中的信号引出即可。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cotrol IS
PORT(RESET:IN STD_LOGIC; ----复位信号
ACLK:IN STD_LOGIC; ----时钟信号
TIMER:out std_logic; ----时基信号输出
KEEPCOU4:in STD_LOGIC_VECTOR(3 DOWNTO 0); ----千位数据输入
KEEPCOU3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ----百位数据输入
KEEPCOU2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ----十位数据输入
KEEPCOU1:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ----个位数据输入
CLK10K_OUT: out std_logic; ----10KHZ脉冲输出
DOT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ----档信号输出
);
END cotrol;
ARCHITECTURE ct OF cotrol IS
TYPE STATE IS
(START,JUDGE,COUNT1,COUNT2TO989,COUNT990,COUNT991TO998,COUNT999,COUNT1000);
SIGNAL MYCRM:STATE;
SIGNAL CRMCOU:INTEGER RANGE 0 TO 999;
SIGNAL FLAG:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL COU10K: INTEGER RANGE 0 TO 9999;
SIGNAL ENCRM: STD_LOGIC;
signal clk10k:std_logic;
BEGIN
------40MHZ TO 10KHZ
CRCLK10K:PROCESS(RESET,ACLK)
BEGIN
IF RESET='1'THEN
COU10K<=0;
CLK10K<='0';
clk10k_out<=clk10k;
ELSE
IF ACLK'EVENT AND ACLK='1'THEN
IF COU10K=19 THEN -------should be 1999
clk10k<=not clk10k;
clk10k_out<=clk10k;
COU10K<=0;
ELSE
COU10K<=COU10K+1;
END IF ;
END IF;
END IF;
END PROCESS CRCLK10K;
--------DOT CONTROL
CRDOT:PROCESS(FLAG)
BEGIN
CASE FLAG IS
WHEN "000"=>DOT<="0000";
WHEN "001"=>DOT<="1000";
WHEN "010"=>DOT<="0100";
WHEN "011"=>DOT<="0010";
when "100"=>DOT<="0001";
WHEN OTHERS=>DOT<="1111";
END CASE;
END PROCESS CRDOT;
-----CREAT TIME STATE
CRFRE: PROCESS(RESET,CLK10K)
BEGIN
IF RESET='1'THEN
CRMCOU<=0;
ENCRM<='0';
TIMER<=ENCRM;
FLAG<="001";
MYCRM<=START;
ELSE
IF CLK10K'EVENT AND CLK10K='1'THEN
CASE MYCRM IS
WHEN START=>
CRMCOU<=0;
ENCRM<='0';
TIMER<=ENCRM;
FLAG<="010";
MYCRM<=JUDGE; -----ENTER JUDGE STATE
WHEN JUDGE=>
IF FLAG="000" THEN
IF KEEPCOU1="0000"AND KEEPCOU2="0000" AND KEEPCOU3="0000" AND KEEPCOU4="0000"THEN
FLAG<="001"; ----BEGIN
ENCRM<='1';
TIMER<=ENCRM;
ELSE
FLAG<="000";
END IF;
ELSIF FLAG="101"THEN
IF KEEPCOU4="1010"THEN ---POUR OUT
FLAG<="101";
ELSE
FLAG<="100";
END IF;
ELSIF FLAG="001"THEN ----10KHZ TEST
IF KEEPCOU4="1010"THEN
FLAG<=FLAG+1;
ELSE
FLAG<=FLAG ;
ENCRM<='1';
TIMER<=ENCRM;
END IF;
ELSIF FLAG="010"THEN ----100KHZ TEST
IF KEEPCOU4="0000"THEN-----EMPTY FILL
FLAG<=FLAG-1;
ENCRM<='1';
TIMER<=ENCRM;
ELSE IF KEEPCOU4="1010"THEN ----FULL FILL
FLAG<=FLAG+1;
ELSE
FLAG<=FLAG;------GOOD SPITCH
END IF;
END IF;
ELSIF FLAG="011"THEN ------1MHZ TEST
IF KEEPCOU4="0000"THEN
FLAG<=FLAG-1;
ELSE IF KEEPCOU4="1010"THEN
FLAG<=FLAG+1;
ELSE
FLAG<=FLAG;
ENCRM<='1';
TIMER<=ENCRM;
END IF;
END IF;
ELSIF FLAG="100"THEN
IF KEEPCOU4="0000"THEN -------10MHZ TEST
FLAG<=FLAG-1;
ELSIF KEEPCOU4="1010"THEN
FLAG<=FLAG+1;
ELSE
FLAG<=FLAG;
ENCRM<='1';
TIMER<=ENCRM;
END IF;
END IF;
MYCRM<=COUNT1 ; -------------ENTER COUNT1 STATE
WHEN COUNT1=>
IF FLAG="001"OR FLAG="000"THEN
ENCRM<='1';
TIMER<=ENCRM;
ELSE
ENCRM<=ENCRM;
TIMER<=ENCRM;
END IF;
CRMCOU<=1; ----- 状态机中计数器
MYCRM<=COUNT2TO989;---------------ENTER COUNT2TO989 STATE
WHEN COUNT2TO989=>
IF CRMCOU=988 THEN
CRMCOU<=989;
MYCRM<=COUNT990;
ELSE
CRMCOU<=CRMCOU+1;
MYCRM<=COUNT2TO989;
END IF;
WHEN COUNT990=>
IF FLAG="011"THEN
ENCRM<='1';
TIMER<=ENCRM;
ELSE
ENCRM<=ENCRM;
TIMER<=ENCRM;
END IF;
CRMCOU<=990;
MYCRM<=COUNT991TO998;
WHEN COUNT991TO998=>
IF CRMCOU=997 THEN
CRMCOU<=998;
MYCRM<=COUNT999;
ELSE
CRMCOU<=CRMCOU+1;
MYCRM<=COUNT991TO998;
END IF ;
WHEN COUNT999=>
IF FLAG="100"OR FLAG="101"THEN
ENCRM<='1';
ELSE
ENCRM<=ENCRM;
END IF;
TIMER<=ENCRM;
CRMCOU<=999;
MYCRM<=COUNT1000;
WHEN COUNT1000=>
CRMCOU<=1000;
ENCRM<='0';
TIMER<=ENCRM;
MYCRM<=JUDGE;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END IF;
END PROCESS CRFRE;
END CT;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -