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

📄 4.txt

📁 控制模块是频率计的核心所在,具有如下所述功能: 对输入数据判断并输出档位信号; ——10KHZ最高位为1010
💻 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 + -