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

📄 statuscontrol.vhd

📁 FPGA设计频率计全套资料
💻 VHD
字号:
--版本号 20070726
--状态机控制程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY STATUSCONTROL IS
PORT(  
       RESET:IN STD_LOGIC;
       CLK:IN STD_LOGIC;
       CLKTESTED,CLKTESTED10:IN STD_LOGIC;
       CLK1HZ,CLK10HZ,CLK100HZ,CLK1KHZ,CLK10KHZ,CLK100KHZ,CLK1MHZ,CLK10MHZ:IN STD_LOGIC;
       LOW,OVER:IN STD_LOGIC;

       OVERH,OVERL:OUT STD_LOGIC;
       DUTYOVER:OUT STD_LOGIC;
       FRECODE:BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);
       DEVIDEFRE10:BUFFER STD_LOGIC;
      -- DEVIDEFRE100:BUFFER STD_LOGIC;
       TIMEBASE:OUT STD_LOGIC;
       TIMECOUNTER:OUT STD_LOGIC
     );
END ENTITY;

ARCHITECTURE MEALYMACHINE OF STATUSCONTROL IS

TYPE STATUS IS(F10M,F1M,F100K,P1MS,P10MS,P100MS,P1S,P10S,OVERFLOWH,OVERFLOWL);
SIGNAL STATE:STATUS;

BEGIN

PROCESS(CLK,RESET)
BEGIN
IF(RESET='1') THEN
   STATE<=F10M;
ELSIF CLK'EVENT AND CLK='1' THEN
   CASE STATE IS
 WHEN F10M=>
     	IF(OVER='1') THEN
       	 	STATE<=OVERFLOWH;
   		ELSIF (LOW='1') THEN
     		STATE<=F1M;
   		ELSE 
     		STATE<=F10M;
        END IF;
WHEN F1M=>
     	IF(OVER='1') THEN
       	 	STATE<=F10M;
   		ELSIF (LOW='1') THEN
     		STATE<=F100K;
   		ELSE 
     		STATE<=F1M;
        END IF;
WHEN F100K=>
     	IF(OVER='1') THEN
       	 	STATE<=F1M;
   		ELSIF (LOW='1') THEN
     		STATE<=P1MS;
   		ELSE 
     		STATE<=F100K;
        END IF;
WHEN P1MS=>
     	IF(OVER='1') THEN
       	 	STATE<=P10MS;
   		ELSIF (LOW='1') THEN
     		STATE<=F100K;
   		ELSE 
     		STATE<=P10MS;
        END IF;
WHEN P10MS=>
     	IF(OVER='1') THEN
       	 	STATE<=P100MS;
   		ELSIF (LOW='1') THEN
     		STATE<=P1MS;
   		ELSE 
     		STATE<=P10MS;
        END IF;
WHEN P100MS=>
     	IF(OVER='1') THEN
       	 	STATE<=P1S;
   		ELSIF (LOW='1') THEN
     		STATE<=P10MS;
   		ELSE 
     		STATE<=P100MS;
        END IF;
WHEN P1S=>
     	IF(OVER='1') THEN
       	 	STATE<=P10S;
   		ELSIF (LOW='1') THEN
     		STATE<=P100MS;
   		ELSE 
     		STATE<=P1S;
        END IF;
WHEN P10S=>
     	IF(OVER='1') THEN
       	 	STATE<=OVERFLOWL;
   		ELSIF (LOW='1') THEN
     		STATE<=P1S;
   		ELSE 
     		STATE<=P10S;
        END IF;
WHEN OVERFLOWH=>
   		IF LOW='1' THEN
			STATE<=F1M;
		ELSE
			STATE<=OVERFLOWH;
		END IF;
WHEN OVERFLOWL=>
   		IF LOW='1' THEN
			STATE<=P1S;
		ELSE
			STATE<=OVERFLOWL;
		END IF;
WHEN OTHERS=>
            STATE<=F10M;
END CASE;
END IF;
END PROCESS;

PROCESS(STATE)
BEGIN
   CASE STATE IS
     	WHEN F10M=>                       --量程为1M~10M
 			TIMEBASE<=CLK100HZ;
			TIMECOUNTER<=CLKTESTED;
			FRECODE<="000";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='1';
 	   	WHEN F1M=>							--量程为100K~1M
 			TIMEBASE<=CLK10HZ;
			TIMECOUNTER<=CLKTESTED;
			FRECODE<="001";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';
		   -- DEVIDEFRE100<='0';
			DUTYOVER<='1';
     	WHEN F100K=>                       --量程为10K~100K
 			TIMEBASE<=CLK1HZ;
			TIMECOUNTER<=CLKTESTED;
			FRECODE<="010";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='1';
     	WHEN P1MS=>                       --量程为1K~10K
 			TIMEBASE<=CLKTESTED10;
			TIMECOUNTER<=CLK10MHZ;
			FRECODE<="011";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='1';--- 10FENPIN
			--DEVIDEFRE100<='1';
			DUTYOVER<='1';
     	WHEN P10MS=>                     --量程为100~1K
 			TIMEBASE<=CLKTESTED;
			TIMECOUNTER<=CLK10MHZ;
			FRECODE<="100";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';---  10FENPIN
			--DEVIDEFRE100<='0';
			DUTYOVER<='1';
     	WHEN P100MS=>                 --量程为10~100HZ
 			TIMEBASE<=CLKTESTED;
			TIMECOUNTER<=CLK1MHZ;
			FRECODE<="101";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='1';
     	WHEN P1S=>                    --量程为1HZ~10HZ
 			TIMEBASE<=CLKTESTED;
			TIMECOUNTER<=CLK100KHZ;
			FRECODE<="110";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='0';
     	WHEN P10S=>                   --量程为0.1HZ~1HZ
 			TIMEBASE<=CLKTESTED;
			TIMECOUNTER<=CLK10KHZ;
			FRECODE<="111";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='0';
     	WHEN OVERFLOWH=>             
 			TIMEBASE<=CLK1KHZ;
			TIMECOUNTER<=CLKTESTED;
			FRECODE<="000";
			OVERH<='1';
			OVERL<='0';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='1';
     	WHEN OVERFLOWL=>
 			TIMEBASE<=CLKTESTED;
			TIMECOUNTER<=CLK10KHZ;
			FRECODE<="111";
			OVERH<='0';
			OVERL<='1';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='1';
     	WHEN OTHERS=>
 			--TIMEBASE<=CLK1KHZ;
			--TIMECOUNTER<=CLKTESTED;
			FRECODE<="000";
			OVERH<='0';
			OVERL<='0';
			DEVIDEFRE10<='0';
			--DEVIDEFRE100<='0';
			DUTYOVER<='0';
	    END CASE;
	END PROCESS;

END MEALYMACHINE;
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -