直流电机控制器.vhd
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:10k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- Download from: www.pld.com.cn & www.fpga.com.cn
  2. LIBRARY IEEE;
  3. USE IEEE.std_logic_1164.ALL;
  4. USE IEEE.std_logic_unsigned.all;
  5. USE IEEE.std_logic_arith.all;
  6. ENTITY dccount IS
  7. port ( 
  8.              clk : IN STD_LOGIC;
  9.               AI : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  10.               CO : out STD_LOGIC_VECTOR(3 DOWNTO 0);
  11.           pulse: IN STD_LOGIC;
  12.               driverA,driverB: OUT STD_LOGIC;
  13.               S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
  14.               P : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
  15.  sp : out STD_LOGIC);
  16. END dccount;
  17. ARCHITECTURE a OF dccount IS 
  18. SIGNAL f:  STD_LOGIC_VECTOR(5 downto 0);
  19. SIGNAL f_hz: STD_LOGIC;
  20. SIGNAL OSC: STD_LOGIC;
  21. SIGNAL OSC1: STD_LOGIC;
  22. SIGNAL C: STD_LOGIC_VECTOR(3 DOWNTO 0);
  23. SIGNAL A: STD_LOGIC_VECTOR(3 DOWNTO 0);
  24. SIGNAL CODE: STD_LOGIC_VECTOR(2 DOWNTO 0);
  25. SIGNAL bcd:STD_LOGIC_VECTOR(23 downto 0);
  26. SIGNAL COUNT:STD_LOGIC_VECTOR(23 downto 0);
  27. SIGNAL SUM: STD_LOGIC_VECTOR(4 DOWNTO 0);
  28. SIGNAL D: STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
  29. SIGNAL ind_coil: STD_LOGIC_VECTOR(3 downto 0) := "0001";
  30. SIGNAL Hz:STD_LOGIC;
  31. SIGNAL spo: STD_LOGIC;
  32. SIGNAL SW:STD_LOGIC;
  33. SIGNAL KEY:STD_LOGIC;
  34. SIGNAL DRA,DRB:STD_LOGIC;
  35. BEGIN
  36. DRIVERA<=DRA;
  37. DRIVERB<=DRB;
  38. p(5 downto 0) <= f(5 downto 0);
  39. CO(3 DOWNTO 0) <=C(3 DOWNTO 0);
  40. A (3 DOWNTO 0)<=AI(3 DOWNTO 0);
  41. SP<=SPO;
  42. -----------------div------------------------
  43. PROCESS(OSC)
  44. VARIABLE d_ff: STD_LOGIC_VECTOR(20 downto 0);
  45.     VARIABLE DELAY: STD_LOGIC_VECTOR(23 DOWNTO 0);
  46.   BEGIN
  47.  WAIT UNTIL clk = '1';
  48. IF d_ff(20 downto 0) >= 2E6 THEN
  49.     d_ff(20 downto 0) := "000000000000000000000";
  50. ELSE
  51.     d_ff(20 downto 0) := d_ff + 1;
  52. END IF;
  53. f_hz <= not d_ff(6);
  54.         OSC <= not d_ff(10);
  55.     OSC1 <= not d_ff(17);
  56.         IF DELAY>=500000 THEN
  57.            DELAY:="000000000000000000000000";HZ<=NOT Hz;
  58.         ELSE DELAY:=DELAY+1; 
  59.         END IF;
  60. END PROCESS ;
  61. ----------------------------------------------
  62. PROCESS (F_HZ,OSC,OSC1,HZ,PULSE)
  63.     VARIABLE B: STD_LOGIC;
  64.     VARIABLE INT: STD_LOGIC;
  65. VARIABLE Data: STD_LOGIC_VECTOR(3 DOWNTO 0);
  66.     VARIABLE UP: STD_LOGIC_VECTOR(2 DOWNTO 0);
  67. VARIABLE  ST:STD_LOGIC_VECTOR(2 DOWNTO 0);
  68.     VARIABLE seq: STD_LOGIC_VECTOR(1 DOWNTO 0);
  69.     VARIABLE sound: STD_LOGIC_VECTOR(1 DOWNTO 0);
  70.     VARIABLE STOP: STD_LOGIC; 
  71.     VARIABLE direction: STD_LOGIC;
  72.     BEGIN
  73. ---------------7seg scan-------------------------------
  74. IF (f_HZ='1' AND F_HZ'EVENT) THEN
  75.  IF ST(2 DOWNTO 0)= "101" THEN
  76.    ST(2 DOWNTO 0):="000" ;
  77.  ELSE ST(2 DOWNTO 0):=ST(2 DOWNTO 0)+1;
  78.  END IF;
  79.  END IF;
  80. -----------------------------------------------
  81. IF (OSC = '1' and OSC'EVENT) THEN
  82.     if a="1111" then 
  83. IF seq="11" then seq:="00" ;
  84.     else seq:=seq+1;
  85. end if;
  86.     else seq:=seq;
  87.     end if;
  88. IF seq="00" then C(3 DOWNTO 0)<="1110" ;
  89. elsif seq="01" then C(3 DOWNTO 0)<="1101" ;
  90. elsif seq="10" then C(3 DOWNTO 0)<="1011" ;
  91. elsif seq="11" then C(3 DOWNTO 0)<="0111" ;
  92. end if;
  93. end if;
  94. IF A="1111" THEN INT:='0';
  95. ELSE INT:='1'; 
  96. END IF;
  97. IF (HZ'EVENT AND HZ='1') THEN 
  98. IF STOP='1' THEN UP:=UP+1;
  99. ELSE UP:="000";
  100. END IF;
  101. END IF;
  102. IF KEY='1' AND COUNT/=0 THEN 
  103.   IF DIRECTION='0' THEN DRA<='1';DRB<='0';STOP:='0';
  104.    ELSE DRA<='0';DRB<='1';STOP:='0';
  105.   END IF;
  106.  ELSIF KEY='1' AND COUNT=0 THEN STOP:='1';
  107.  
  108.  ELSIF STOP='1' AND UP<"110"  THEN DRA<=NOT DRA ;DRB<=NOT DRB;
  109.  
  110. ELSE  DRA<='0';DRB<='0';STOP:='0';
  111. END IF;
  112. iF  (OSC1'EVENT AND OSC1='1') THEN B:=(INT and (b and INT) );
  113. ----------------direction choice-----------------------
  114. IF SW='0' AND B='1' AND Data(3 DOWNTO 0)="1010" THEN 
  115. BCD(23 DOWNTO 0)<=BCD(23 DOWNTO 0);B:='0';direction:='1';
  116. ELSIF SW='0' AND  B='1' AND Data(3 DOWNTO 0)="1011" THEN 
  117. BCD(23 DOWNTO 0)<=BCD(23 DOWNTO 0);B:='0';direction:='0';
  118. ------------------KEY LOCK ON/OFF------------------------------------
  119. ELSIF B='1' AND Data(3 DOWNTO 0)="1100" THEN 
  120. BCD<=BCD;B:='0';SW<=NOT SW;
  121. -------------------BACK-------------------------------
  122. ELSIF SW='0' AND B='1' AND Data(3 DOWNTO 0)="1101" THEN 
  123. BCD(23 DOWNTO 0)<=("0000" & bcd(23 downto 4) );B:='0';
  124. -------------------CLEAR---------------------------------
  125. ELSIF B='1' AND Data(3 DOWNTO 0)="1110" THEN 
  126. BCD<="000000000000000000000000" ;B:='0';SW<='0';
  127. ------------------DOWNCOUNT  0 ------------------------------------
  128. ELSIF BCD=0  AND  KEY='1' THEN SW<='0';KEY<='0';BCD<=BCD;
  129. ------------------------------------------------------------------
  130. ELSIF SW='1' AND KEY='1' AND DATA(3 DOWNTO 0)/="1110" THEN BCD<=COUNT;
  131. ELSIF SW='1' AND DATA(3 DOWNTO 0)="1110" THEN SW<='0';
  132. BCD<="000000000000000000000000";KEY<='0';
  133. -------------------ENTER------------------------------
  134. ELSIF SW='0' AND B='1' AND Data(3 DOWNTO 0)="1111" AND BCD/=0 THEN 
  135. B:='0';SW<='1';KEY<='1';
  136. ELSIF SW='0' AND B='1' AND Data(3 DOWNTO 0)="1111" AND BCD=0 THEN 
  137. BCD<=BCD;B:='0';SW<='0';KEY<='0';
  138. ----------------------NUMBER SHIFT---------------------------
  139. ELSIF SW='0' AND B='1' THEN bcd(23 downto 0)<= bcd(19 downto 0) & DATA(3 DOWNTO 0);B:='0';
  140. elsif INT='0' then bcd<=bcd;
  141. b:='1';
  142. END IF;
  143. END IF;
  144. ------------------------------------------------------
  145. SUM(1 DOWNTO 0)<= seq;
  146. sum(4 downto 2)<=code;
  147. ---------------------SOUND-----------------------------
  148. if (osc'event and osc='1') then 
  149. if INT='1' AND SW='0' then sound:=sound+1;spo<=sound(1) ;
  150. else spo<='0';
  151. end if;
  152. end if;
  153. -------------------------------------------------------
  154. ---------------------------DOWNCOUNT--------------------
  155. IF SW='0' THEN COUNT<=BCD;
  156. ELSE
  157. If (PULSE = '1' and PULSE'EVENT) THEN
  158.  
  159. IF KEY='1' AND COUNT/=0 THEN  
  160. ----------------------------1---------------------------------------------------
  161.   IF COUNT(3 DOWNTO 0)= 0 AND COUNT(23 DOWNTO 4)>=1 THEN
  162.       COUNT(3 DOWNTO 0) <="1001" ;
  163.   ELSE COUNT(3 DOWNTO 0) <= COUNT(3 DOWNTO 0)-1;
  164.    
  165.   END IF;
  166. ----------------------------2---------------------------------------------------------    
  167.     IF  COUNT(7 DOWNTO 4)= 0 AND COUNT(23 DOWNTO 8)>=1  AND COUNT(3 DOWNTO 0)=0 THEN
  168. COUNT(7 DOWNTO 4) <= "1001" ;
  169. ELSIF COUNT(3 DOWNTO 0)=0 AND COUNT(23 DOWNTO 4)>=1  THEN
  170.     COUNT(7 DOWNTO 4) <=COUNT(7 DOWNTO 4 )-1;
  171.  END IF;
  172. ----------------------------3-------------------------------------------------------
  173. IF  COUNT(11 DOWNTO 8)= 0 AND COUNT(23 DOWNTO 12)>=1 AND COUNT(7 DOWNTO 0)=0 THEN
  174. COUNT(11 DOWNTO 8) <="1001";
  175. ELSIF COUNT(7 DOWNTO 0)=0 AND COUNT(23 DOWNTO 8)>=1 THEN 
  176.     COUNT(11 DOWNTO 8) <=COUNT(11 DOWNTO 8 )-1;
  177. END IF;
  178. ---------------------------4--------------------------------------------------------------
  179. IF  COUNT(15 DOWNTO 12)= 0 AND COUNT(23 DOWNTO 16)>=1 AND COUNT(11 DOWNTO 0)=0 THEN
  180. COUNT(15 DOWNTO 12) <="1001";
  181. ELSIF COUNT(11 DOWNTO 8)=0 AND COUNT(23 DOWNTO 12)>=1 AND COUNT(7 DOWNTO 0)=0 THEN
  182.     COUNT(15 DOWNTO 12) <=COUNT(15 DOWNTO 12 )-1;
  183. END IF;
  184. -------------------------5------------------------------------------------------------
  185. IF  COUNT(19 DOWNTO 16)= 0 AND COUNT(23 DOWNTO 20)>=1 AND COUNT(15 DOWNTO 0)=0 THEN
  186. COUNT(19 DOWNTO 16) <="1001";
  187. ELSIF COUNT(15 DOWNTO 12)=0 AND COUNT(23 DOWNTO 16)>=1 AND COUNT(11 DOWNTO 0)=0 THEN
  188.     COUNT(19 DOWNTO 16) <=COUNT(19 DOWNTO 16 )-1;
  189.     
  190. END IF;
  191. -------------------------6-------------------------------------------------
  192. IF  COUNT(23 DOWNTO 20)= 0  THEN
  193. COUNT(23 DOWNTO 20) <="0000";
  194. ELSIF COUNT(19 DOWNTO 16)=0 AND COUNT(23 DOWNTO 20 )>=1 AND COUNT(15 DOWNTO 0)=0 THEN
  195.     COUNT(23 DOWNTO 20) <=COUNT(23 DOWNTO 20 )-1;
  196.     END IF;
  197. END IF;
  198. END IF;
  199. END IF;
  200. ------------------7seg scan---------------------------
  201. CASE ST IS  --