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

📄 ccd.vhd

📁 VHDL写的TC241 CCD控制器程序
💻 VHD
字号:
--------------------------------------------------------------------
--------------------------------------------------------------------
--------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
--------------------------------------------------------------------
ENTITY CCD IS
	PORT
	(	
	    CLK     	        	: IN	STD_LOGIC;--GLOBE CLOCK
	    RESET,RUN,PIXEL,ADS     : IN	STD_LOGIC;--CONTROL SIGNAL/AD STATE
		SRG3,SRG2,SRG1    		: OUT	STD_LOGIC;--CCD DRIVER CLOCK
		IAG,SAG,TRG         	: OUT	STD_LOGIC;--CCD DRIVER CLOCK
		STATE_OUT           	: OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);--WORK STATE
		SHP,SHD,AD     	    	: OUT	STD_LOGIC--CDS/AD CLOCK
	);
	SIGNAL  P_CNT,L_CNT,FLAG       	: STD_LOGIC;--PIXEL FLAG/LINE FLAG
	SIGNAL  CNT_1US		       	    : STD_LOGIC_VECTOR(1 DOWNTO 0);
	SIGNAL  CNT_2US		       	    : STD_LOGIC_VECTOR(2 DOWNTO 0);
	SIGNAL  CNT_8US					: STD_LOGIC_VECTOR(4 DOWNTO 0);
	SIGNAL  STATE				    : INTEGER RANGE 0 TO 7;--STATE
	SIGNAL  H_COUNTER_CLR			: INTEGER RANGE 0 TO 10;--H_COUNTER FOR CLEAR
	SIGNAL  V_COUNTER_CLR			: INTEGER RANGE 0 TO 990;--V_COUNTER FOR CLEAR
	SIGNAL  H_COUNTER			    : INTEGER RANGE 0 TO 266;--H_COUNTER FOR READ
	SIGNAL  V_COUNTER			    : INTEGER RANGE 0 TO 488;--H_COUNTER FOR READ
END CCD;
------------------------------------------------------------------
ARCHITECTURE LJCCD OF CCD IS
BEGIN
------------------------------------------------------------------
STATE_SWITCH:PROCESS(CLK,RUN,L_CNT,V_COUNTER,H_COUNTER,STATE)
BEGIN
IF CLK'LAST_VALUE='0' AND CLK'EVENT AND CLK='1' THEN
	IF RESET='1' THEN--RESET
		STATE<=0;--INITIALISITION
	ELSE
		IF RUN='1' AND STATE=0 THEN
			STATE<=1;--CLR/IAG,SAG
		ELSIF RUN='0' AND STATE=2 AND L_CNT='1' THEN
			STATE<=3;--CLR/SRG(INT)
		END IF;
		
		IF STATE=1 AND V_COUNTER_CLR=990 THEN--990
			STATE<=2;--CLR/SAG(INT)
		ELSIF STATE=3 AND H_COUNTER_CLR=10 THEN--10
			STATE<=4;--FT(FRAME TRANFER)	
		ELSIF STATE=4 AND V_COUNTER=244 THEN--244
			STATE<=5;--LS(LINE SHIFT WITH INTERNAL BINNING) 
		ELSIF STATE=5 AND L_CNT='1' THEN        
			STATE<=6;--SRR(SERIAL REGISTER READOUT)
		ELSIF STATE=6 AND P_CNT='1' THEN
			STATE<=7;--DELAY(FOR READ)
		ELSIF STATE=7 AND PIXEL=FLAG THEN 
			IF H_COUNTER<266 THEN--266
				STATE<=6;
			ELSIF H_COUNTER=266 AND V_COUNTER<488 THEN--266--488
				STATE<=5;
			ELSIF H_COUNTER=266 AND V_COUNTER=488 THEN--266--488
				STATE<=0;
			END IF;
		END IF;
	END IF;
END IF;
END PROCESS STATE_SWITCH;
---------------------------------------------------------
COUNTERS:PROCESS(CLK,STATE,ADS,L_CNT,P_CNT,PIXEL)--
BEGIN
--STATE_OUT
	IF STATE=0 THEN
		STATE_OUT<="00";
	ELSIF STATE=5 OR STATE=6 OR STATE=7 THEN
		IF ADS'LAST_VALUE='1' AND ADS'EVENT AND ADS='0' THEN
			STATE_OUT(0)<=NOT PIXEL;
			STATE_OUT(1)<=PIXEL;
		END IF;
	END IF;
--V_COUNTER_CLR
	IF STATE=1 THEN
		IF L_CNT'LAST_VALUE='0' AND L_CNT'EVENT AND L_CNT='1' THEN
			V_COUNTER_CLR<=V_COUNTER_CLR+1;
		END IF;
	ELSE
		V_COUNTER_CLR<=0;
	END IF;
--H_COUNTER_CLR
	IF STATE=3 THEN
		IF P_CNT'LAST_VALUE='0' AND P_CNT'EVENT AND P_CNT='1' THEN
			H_COUNTER_CLR<=H_COUNTER_CLR+1;
		END IF;
	ELSE
		H_COUNTER_CLR<=0;
	END IF;
--V_COUNTER
	IF STATE=4 OR STATE=5 OR STATE=6 OR STATE=7 THEN
		IF L_CNT'LAST_VALUE='0' AND L_CNT'EVENT AND L_CNT='1' THEN
			V_COUNTER<=V_COUNTER+1;
		END IF;
	ELSE
		V_COUNTER<=0;
	END IF;
--H_COUNTER
	IF STATE=6 OR STATE=7 THEN
		IF P_CNT'LAST_VALUE='0' AND P_CNT'EVENT AND P_CNT='1' THEN
			H_COUNTER<=H_COUNTER+1;
		END IF;
	ELSE
		H_COUNTER<=0;
	END IF;
END PROCESS COUNTERS;
--------------------------------------------------------------------------
DRIVER:PROCESS(STATE,CLK)
BEGIN
IF CLK'LAST_VALUE='0' AND CLK'EVENT AND CLK='1' THEN
	CASE STATE IS
		WHEN 0=>--INITIALISITION
			FLAG<='0';
--			CNT_1US<="00";CNT_2US<="000";CNT_8US<="00000";
			CNT_2US<="000";CNT_8US<="00000";
			L_CNT<='0';P_CNT<='0';
--			IAG<='0';SAG<='0';TRG<='0';
--			SRG3<='0';SRG2<='0';SRG1<='0';
			SHP<='0';SHD<='0';AD<='1';	
			CASE CNT_1US IS
				WHEN "00"=>CNT_1US<="01";
					L_CNT<='0';
				    IAG<='1';SAG<='1';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "01"=>CNT_1US<="10";
					L_CNT<='0';
		            IAG<='1';SAG<='1';TRG<='1';
		            SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "10"=>CNT_1US<="11";
					L_CNT<='1';
				    IAG<='0';SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';
				WHEN "11"=>CNT_1US<="00";
					L_CNT<='0';
				    IAG<='0';SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';	  		
			END CASE;
		WHEN 1=>--CLR/IAG,SAG
			FLAG<='0';
			CNT_2US<="000";CNT_8US<="00000";
			P_CNT<='0';
			SHP<='0';SHD<='0';AD<='1';
			CASE CNT_1US IS
				WHEN "00"=>CNT_1US<="01";
					L_CNT<='0';
				    IAG<='1';SAG<='1';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "01"=>CNT_1US<="10";
					L_CNT<='0';
		            IAG<='1';SAG<='1';TRG<='1';
		            SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "10"=>CNT_1US<="11";
					L_CNT<='1';
				    IAG<='0';SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';
				WHEN "11"=>CNT_1US<="00";
					L_CNT<='0';
				    IAG<='0';SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';	  		
			END CASE;
			
		WHEN 2=>--CLR/SAG(INT)
			FLAG<='0';
			CNT_2US<="000";CNT_8US<="00000";
			P_CNT<='0';
			SHP<='0';SHD<='0';AD<='1';
			CASE CNT_1US IS
				WHEN "00"=>CNT_1US<="01";
					L_CNT<='0';
				    SAG<='1';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "01"=>CNT_1US<="10";
					L_CNT<='0';
		            SAG<='1';TRG<='1';
		            SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "10"=>CNT_1US<="11";
					L_CNT<='1';
				    SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';
				WHEN "11"=>CNT_1US<="00";
					L_CNT<='0';
				    SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';	  		
			END CASE;
		WHEN 3=>--CLR/SRG(INT)
			FLAG<='0';
			CNT_2US<="000";CNT_8US<="00000";
			L_CNT<='0';			
			IAG<='0';SAG<='0';
			SHP<='0';SHD<='0';AD<='1';
			CASE CNT_1US IS
				WHEN "00"=>CNT_1US<="01";
					P_CNT<='0';	TRG<='1';			          
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "01"=>CNT_1US<="10";
					P_CNT<='0';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "10"=>CNT_1US<="11";
					P_CNT<='1';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';
				WHEN "11"=>CNT_1US<="00";
					P_CNT<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';	  		
			END CASE;
			
		WHEN 4=>--FT(FRAME TRANFER)
			FLAG<='0';
			CNT_2US<="000";CNT_8US<="00000";
			P_CNT<='0';
			SHD<='0';AD<='1';
			CASE CNT_1US IS
				WHEN "00"=>CNT_1US<="01";
					L_CNT<='0';
				    IAG<='1';SAG<='1';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "01"=>CNT_1US<="10";
					L_CNT<='0';
		            IAG<='1';SAG<='1';TRG<='1';
		            SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "10"=>CNT_1US<="11";
					L_CNT<='1';
				    IAG<='0';SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';
				WHEN "11"=>CNT_1US<="00";
					L_CNT<='0';
				    IAG<='0';SAG<='0';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';	  		
			END CASE;
			
		WHEN 5=>--LS(LINE SHIFT WITH INTERNAL BINNING)
			CNT_1US<="00";CNT_8US<="00000";
			P_CNT<='0';
			IAG<='0';SHD<='0';AD<='1';
			CASE CNT_2US IS
				WHEN "000"=>CNT_2US<="001";
					L_CNT<='0';
				    SAG<='0';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "001"=>CNT_2US<="010";
					L_CNT<='0';
		            SAG<='0';TRG<='0';
		            SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "010"=>CNT_2US<="011";
					L_CNT<='0';
				    SAG<='0';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "011"=>CNT_2US<="100";
					L_CNT<='0';
				    SAG<='0';TRG<='0';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "100"=>CNT_2US<="101";
					L_CNT<='0';
				    SAG<='0';TRG<='1';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "101"=>CNT_2US<="110";
					L_CNT<='0';
				    SAG<='1';TRG<='0';
				    SRG3<='1';SRG2<='1';SRG1<='1';
				WHEN "110"=>CNT_2US<="111";
					L_CNT<='1';
				    SAG<='0';TRG<='0';
				    SRG3<='0';SRG2<='0';SRG1<='0';
				WHEN "111"=>CNT_2US<="000";
					L_CNT<='0';
				    SAG<='0';TRG<='0';
				    SRG3<='0';SRG2<='0';SRG1<='0';	  		
			END CASE;
			
		WHEN 6=>--SRR(SERIAL REGISTER READOUT)
			CNT_1US<="00";CNT_2US<="000";
			L_CNT<='0';		
			IAG<='0';SAG<='0';TRG<='0';	
			CASE CNT_8US IS
				WHEN "00000"=>CNT_8US<="00001";--1
					P_CNT<='0';
					SRG3<='0';SRG2<='0';SRG1<='0';
					SHP<='0';SHD<='0';AD<='1';
				WHEN "00001"=>CNT_8US<="00010";
					P_CNT<='0';
					SRG3<='0';SRG2<='0';SRG1<='0';
					SHP<='0';SHD<='0';AD<='0';
				WHEN "00010"=>CNT_8US<="00011";
					P_CNT<='0';
					SRG3<='0';SRG2<='0';SRG1<='0';
					SHP<='0';SHD<='0';AD<='0';
				WHEN "00011"=>CNT_8US<="00100";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "00100"=>CNT_8US<="00101";--2
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "00101"=>CNT_8US<="00110";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "00110"=>CNT_8US<="00111";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "00111"=>CNT_8US<="01000";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01000"=>CNT_8US<="01001";--3
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01001"=>CNT_8US<="01010";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01010"=>CNT_8US<="01011";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01011"=>CNT_8US<="01100";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01100"=>CNT_8US<="01101";--4
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01101"=>CNT_8US<="01110";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01110"=>CNT_8US<="01111";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "01111"=>CNT_8US<="10000";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10000"=>CNT_8US<="10001";--5
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10001"=>CNT_8US<="10010";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10010"=>CNT_8US<="10011";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10011"=>CNT_8US<="10100";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10100"=>CNT_8US<="10101";--6
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10101"=>CNT_8US<="10110";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10110"=>CNT_8US<="10111";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "10111"=>CNT_8US<="11000";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "11000"=>CNT_8US<="11001";--7
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "11001"=>CNT_8US<="11010";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "11010"=>CNT_8US<="11011";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "11011"=>CNT_8US<="11100";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "11100"=>CNT_8US<="11101";--8
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "11101"=>CNT_8US<="11110";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
				WHEN "11110"=>CNT_8US<="11111";
					P_CNT<='1';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';
					FLAG<=NOT FLAG;
				WHEN "11111"=>CNT_8US<="00000";
					P_CNT<='0';
					SRG3<='1';SRG2<='0';SRG1<='0';
					SHP<='1';SHD<='0';AD<='1';			
			END CASE;
		WHEN 7=>--DELAY(FOR READ)
			CNT_1US<="00";CNT_2US<="000";CNT_8US<="00000";
			L_CNT<='0';P_CNT<='0';
			IAG<='0';SAG<='0';TRG<='0';
			SRG3<='0';SRG2<='0';SRG1<='0';
			SHP<='0';SHD<='1';AD<='1';
	END CASE;
END IF;
END PROCESS DRIVER;
-------------------------------------------------------------------
END LJCCD;--END		
-------------------------------------------------------------------
-------------------------------------------------------------------
-------------------------------------------------------------------

⌨️ 快捷键说明

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