📄 pulse_drive.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 + -