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

📄 pulse_drive.vhd

📁 变频器移相控制
💻 VHD
字号:
---title:改进型方波控制电路,采用CAN总线
---time :2007-03-27
---version:V1.0.0
---作者:张建国
---complier:max_plus II
---改进原因:前一版本调节频率时电压会波动,特别是扫频时电压可能降到零.

library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE	IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY pulse_drive IS
	GENERIC(DT_TIMER:INTEGER:=12;
			LED_DIV:INTEGER	:=16;
			PT_DIV :INTEGER	:=40);
	PORT
		(
			CLK:IN 	STD_LOGIC;
			VOL_LATCH  :IN STD_LOGIC :='1';
			PULSE_SHIFT:IN STD_LOGIC_VECTOR(0 TO 13);
			RESET: IN STD_LOGIC;
			HALF_US :IN STD_LOGIC;
						
			T1 :BUFFER	STD_LOGIC:='1';
			T2 :BUFFER	STD_LOGIC:='1';
			T3 :BUFFER	STD_LOGIC:='1';
			T4 :BUFFER	STD_LOGIC:='1';
			T1_LED: BUFFER  STD_LOGIC:='1';
			T2_LED: BUFFER  STD_LOGIC:='1';
			T3_LED: BUFFER  STD_LOGIC:='1';
			T4_LED: BUFFER  STD_LOGIC:='1'
		);
END pulse_drive;

ARCHITECTURE pulse OF pulse_drive IS	
	SIGNAL QA:STD_LOGIC_VECTOR(14 DOWNTO 0);	
	SIGNAL QB:STD_LOGIC_VECTOR(14 DOWNTO 0);	
	SIGNAL VOL_SHIFT:STD_LOGIC_VECTOR(13 DOWNTO 0);---调压缓存
	SIGNAL CAY:STD_LOGIC:='1';
	SIGNAL CBY:STD_LOGIC:='1';
	SIGNAL VOL_READY:STD_LOGIC:='0'; --调压控制准备。
	SIGNAL PLUS_DTCAY:STD_LOGIC:='1';
	SIGNAL PLUS_DTCBY:STD_LOGIC:='1';	
	SIGNAL PLUS_DT_NOTCAY:STD_LOGIC:='1';
	SIGNAL PLUS_DT_NOTCBY:STD_LOGIC:='1';
	SIGNAL US_CLK:STD_LOGIC:='1';
	SIGNAL TWO_US:STD_LOGIC:='1';
BEGIN
	T1       <=PLUS_DTCBY ;	
        T2       <=PLUS_DT_NOTCBY ;	
	T3	 <=PLUS_DTCAY;
	T4       <=PLUS_DT_NOTCAY ;
	--NOT_CAY  <= NOT CAY;
	--NOT_CBY  <= NOT CBY;

	P1:PROCESS(CLK)
	BEGIN
		IF RESET ='1' THEN
			QA	<=(OTHERS =>'0');			
			QB  <="11111111111111"+"1";
		ELSIF CLK'EVENT AND CLK='1'THEN				
			IF	QA = "11111111111111" THEN
				CAY <='1';
			ELSE
				CAY <='0';	
			END IF; 
			IF	QB <= "11111111111111" THEN
				CBY <='1';
			ELSE
				CBY <='0';	
			END IF;
			QA 	<= QA+"1";		
			IF QA ="11111111111111" AND VOL_READY ='0' THEN
				QB (0 TO 13)<= VOL_SHIFT(0 TO 13) ; 
				QB(14 )		<='0';		
			ELSE 
				QB 	<= QB+"1";
			END IF;																									
		END IF;		
	END PROCESS;
	PROCESS(VOL_LATCH)
	BEGIN
		IF VOL_LATCH'EVENT AND VOL_LATCH ='0' THEN				 
				VOL_SHIFT <= PULSE_SHIFT;							
		END IF;
		VOL_READY <=NOT VOL_LATCH ;
	END PROCESS;

	P2:PROCESS(CAY ,TWO_US)
	VARIABLE DT_COUNTER	:INTEGER RANGE 0 TO DT_TIMER:=0;
	BEGIN
		IF(TWO_US'EVENT)AND (TWO_US='0')THEN
		IF(CAY='1')THEN
			DT_COUNTER :=DT_COUNTER+1;
			IF(DT_COUNTER=DT_TIMER)THEN
				PLUS_DTCAY<='1';
			END IF;
		ELSE
			PLUS_DTCAY <='0';
			DT_COUNTER     :=0;
		END IF;
	END IF;
	END PROCESS;
	P3:PROCESS(CBY ,TWO_US)
	VARIABLE DT_COUNTER	:INTEGER RANGE 0 TO DT_TIMER:=0;
	BEGIN
		IF(TWO_US'EVENT)AND (TWO_US='0')THEN
		IF(CBY='1')THEN
			DT_COUNTER :=DT_COUNTER+1;
			IF(DT_COUNTER=DT_TIMER)THEN
				PLUS_DTCBY <='1';
			END IF;
		ELSE
			PLUS_DTCBY    <='0';
			DT_COUNTER     :=0;
		END IF;
	END IF;		
	END PROCESS;

	P4:PROCESS(CAY ,TWO_US)
	VARIABLE DT_COUNTER	:INTEGER RANGE 0 TO DT_TIMER:=0;
	BEGIN
		IF(TWO_US'EVENT)AND (TWO_US='0')THEN
		IF(CAY='0')THEN
			DT_COUNTER :=DT_COUNTER+1;
			IF(DT_COUNTER=DT_TIMER)THEN
				PLUS_DT_NOTCAY<='1';
			END IF;
		ELSE
			PLUS_DT_NOTCAY <='0';
			DT_COUNTER     :=0;
		END IF;
	END IF;
	END PROCESS;
	P5:PROCESS(CBY ,TWO_US)
	VARIABLE DT_COUNTER	:INTEGER RANGE 0 TO DT_TIMER:=0;
	BEGIN
		IF(TWO_US'EVENT)AND (TWO_US='0')THEN
		IF(CBY='0')THEN
			DT_COUNTER :=DT_COUNTER+1;
			IF(DT_COUNTER=DT_TIMER)THEN
				PLUS_DT_NOTCBY <='1';
			END IF;
		ELSE
			PLUS_DT_NOTCBY    <='0';
			DT_COUNTER        :=0;
		END IF;
	END IF;		
	END PROCESS;	
	P6:PROCESS(HALF_US)
	BEGIN
		--IF(TWO_US'EVENT)AND (TWO_US='0')
		IF (HALF_US'EVENT) AND (HALF_US ='1') THEN
			US_CLK <=NOT US_CLK;
		END IF;
	END PROCESS;
	P7:PROCESS(US_CLK)
	BEGIN 
		IF(US_CLK'EVENT)AND (US_CLK='1')THEN
			TWO_US <=NOT TWO_US;
		END IF;
	END PROCESS;

	P8:PROCESS(T1)
	VARIABLE LED_COUNTER :INTEGER RANGE 0 TO LED_DIV:=0;	
	BEGIN
		IF(T1'EVENT)AND (T1='1')THEN
			LED_COUNTER :=LED_COUNTER +1;
			IF LED_COUNTER =LED_DIV THEN 
				LED_COUNTER	:=0;
				T1_LED <= NOT T1_LED;
			END IF;
		END IF;
	END PROCESS;
	P9:PROCESS(T2)
	VARIABLE LED_COUNTER :INTEGER RANGE 0 TO LED_DIV:=0;	
	BEGIN
		IF(T2'EVENT)AND (T2='1')THEN
			LED_COUNTER :=LED_COUNTER +1;
			IF LED_COUNTER =LED_DIV THEN 
				LED_COUNTER	:=0;
				T2_LED <= NOT T2_LED;
			END IF;
		END IF;


	END PROCESS;
	P10:PROCESS(T3)
	VARIABLE LED_COUNTER :INTEGER RANGE 0 TO LED_DIV:=0;	
	BEGIN
		IF(T3'EVENT)AND (T3='1')THEN
			LED_COUNTER :=LED_COUNTER +1;
			IF LED_COUNTER =LED_DIV THEN 
				LED_COUNTER	:=0;
				T3_LED <= NOT T3_LED;
			END IF;
		END IF;
	END PROCESS;

	P11:PROCESS(T4)
	VARIABLE LED_COUNTER :INTEGER RANGE 0 TO LED_DIV:=0;	
	BEGIN
		IF(T4'EVENT)AND (T4='1')THEN
			LED_COUNTER :=LED_COUNTER +1;
			IF LED_COUNTER =LED_DIV THEN 
				LED_COUNTER	:=0;
				T4_LED <= NOT T4_LED;
			END IF;
		END IF;
	END PROCESS;
	
END  pulse ;

⌨️ 快捷键说明

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