原创 【转】VHDL设计举例:步进电机控制器

2010-11-5 01:07 885 3 3 分类: FPGA/CPLD

LIBRARY IEEE;


USE IEEE.std_logic_1164.ALL;


USE IEEE.std_logic_unsigned.ALL;


USE IEEE.std_logic_arith.ALL;


ENTITY step_motor IS


     PORT(


         f, p, d: IN   STD_LOGIC:='0';


         speed : in  STD_LOGIC_VECTOR(1 downto 0);


         coil : OUT    STD_LOGIC_VECTOR(3 downto 0)


         );


       


END step_motor;


ARCHITECTURE behavior OF step_motor IS


     SIGNAL ind_coil: STD_LOGIC_VECTOR(3 downto 0) := "0001";


     SIGNAL clk_scan: STD_LOGIC;


    SIGNAL PHASE,DIRECTION:STD_LOGIC;


    signal t:std_logic_vector(3 downto 0);


     signal comp:integer range 0 to 2500 ;


    SIGNAL osc:STD_LOGIC;


     BEGIN


coil <= t;


 


process(f,osc)


variable delay:integer range 0 to 50;


begin


if (f'event and f='1') then


 if delay>=50 then delay:=0;osc<=not osc;


 else delay:=delay+1;


end if;


end if;


 


if (osc'event and osc='1') then


case speed is


 


   when "10" => if comp<2500 then comp<=comp+1;


                else comp<=comp;


                end if;


   when "01" => if comp>2 then comp<=comp-1;


                else comp<=comp;


                end if;


   when others => if comp<2 then comp<=2;


                else comp<=comp;


                end if;


end case;


end if;


end process;



 


PROCESS


     VARIABLE d_ff: integer range 0 to 2500;



BEGIN


 


     WAIT UNTIL f = '1';


     if d_ff >= comp then


         d_ff :=0; clk_scan <= not CLK_SCAN;


     else


         d_ff := d_ff + 1;


     end if;


          END PROCESS ;



 PROCESS(F)


 VARIABLE B:STD_LOGIC;


 BEGIN


 IF (F'EVENT AND F='1') THEN B:=(P and (b and P) );


 IF B='1' THEN PHASE<=NOT PHASE ;B:='0';


 ELSIF P='0' THEN PHASE<=PHASE;B:='1';


 END IF;


 END IF;


 END PROCESS;



 PROCESS(F)


 VARIABLE B:STD_LOGIC;


 BEGIN


 IF (F'EVENT AND F='1') THEN B:=(D and (b and D) );


 IF B='1' THEN DIRECTION<=NOT DIRECTION ;B:='0';


 ELSIF D='0' THEN DIRECTION<=DIRECTION;B:='1';


 END IF;


 END IF;


 END PROCESS;


motor:


process


begin


--if (clk_scan'event and clk_scan='1') then


WAIT UNTIL clk_scan= '0';


     CASE phase IS


         WHEN '1' =>


             IF direction = '0' THEN


                 IF ((ind_coil = "1001") or (ind_coil = "0000")) THEN


                  ind_coil <= "0001";


                 ELSE


                  ind_coil <= (ind_coil(2 downto 0) & ind_coil(3));


             END IF;


             ELSE


                 IF ((ind_coil = "1001") or (ind_coil = "0000")) THEN


                 ind_coil <= "1000";


                 ELSE


                  ind_coil <= (ind_coil(0) & ind_coil(3 downto 1));


             END IF;


             END IF;



           WHEN OTHERS =>


                         ind_coil<=IND_COIL;


           END CASE;


t<=not ind_coil;


END PROCESS motor;



END behavior;


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条