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

📄 motorctrl.vhd

📁 VHDL源代码下载
💻 VHD
字号:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

library SYNOPSYS;
use SYNOPSYS.attributes.all;

entity motorctrl is 
  port (clk: in STD_LOGIC;
        reset: in STD_LOGIC;
        speed_now: in STD_LOGIC_VECTOR (7 downto 0);
        target_speed: in STD_LOGIC_VECTOR (7 downto 0);
        th_speed: in STD_LOGIC_VECTOR (7 downto 0);
        pwme: out STD_LOGIC);
end;

architecture motorctrl_arch of motorctrl is
--define the signal_structure and flow of the device
signal cnt125: INTEGER range 0 to 124;
signal cnt375: INTEGER range 0 to 374;
signal cnt500: INTEGER range 0 to 499;
signal dth: STD_LOGIC_VECTOR (7 downto 0);
signal pwm: STD_LOGIC;

-- USER DEFINED ENCODED state machine: phase
type phase_type is (phB1, phB2);
attribute enum_encoding of phase_type: type is
	"0 " &		-- phB1
	"1 ";		-- phB2
signal phase: phase_type;
--------------------------------------------

-- USER DEFINED ENCODED state machine: speeding
type speeding_type is (UPA, UPB ,Dn ,final);
attribute enum_encoding of speeding_type: type is
        "00 " &          --UPA
        "01 " &          --UPB
        "10 " &          --Dn
        "11 ";           --final
signal speeding: speeding_type;
-----------------------------------------------

begin
-- concurrent signals assignments
--MotorControl
peeding_machine: process (reset,clk)
begin
   if reset='1' then
      speeding <= UPA;
      dth<="00000000";
   elsif (clk'event and clk='1') then
         dth<=target_speed -  th_speed;
      case speeding is
           when UPA =>
	              if (speed_now = target_speed) then
			  speeding <= final;
		      elsif (speed_now > target_speed) then
			     speeding <= Dn;
		      elsif (speed_now < dth) then
			     speeding <= UPA;
		      elsif (speed_now >=dth) and (speed_now < target_speed) then
			     speeding <= UPB;
		      end if;
		      
  	   when UPB =>
	  	      if (speed_now = target_speed) then
			  speeding <= final;
		      elsif (speed_now < dth) then
			     speeding <= UPA;
		      elsif (speed_now >=dth) and (speed_now < target_speed) then
			     speeding <= UPB;
		      elsif (speed_now > target_speed) then
			     speeding <= Dn;
		      end if;
		      
	   when Dn =>
	             if (speed_now = target_speed) then
			 speeding <= final;
		     elsif (speed_now < dth) then
			    speeding <= UPA;
	             elsif (speed_now > target_speed) then
		            speeding <= Dn;
		     elsif (speed_now >=dth) and (speed_now < target_speed) then
			    speeding <= UPB;
		     end if;
		     
	   when final =>
	        	if (speed_now > target_speed) then
			    speeding <= Dn;
			elsif (speed_now >=dth) and (speed_now < target_speed) then
			       speeding <= UPB;
			elsif (speed_now = target_speed) then
			       speeding <= final;
			elsif (speed_now < dth) then
			       speeding <= UPA;
			end if;
			
	   when others =>
	   	         null;
      end case;
   end if;
end process;

phase_machine: process (reset,clk)
begin
   if reset='1' then
      cnt500 <= 0;
      cnt375 <= 0;
      cnt125 <= 0;
      pwm<='0';
      pwme<='0';
      phase<=phB1;
   elsif (clk'event and clk='1') then
         pwme<=pwm;
      case phase is
	   when phB1 =>
		case speeding is
	             when UPA =>
			        cnt375<=374;
				cnt125<=124;
				cnt500<=499;
				pwm<='1';
				
		     when UPB =>
				cnt500<=499;
				cnt375<=cnt375-1;
				cnt125<=124;
				pwm<='1';
				
		     when Dn =>
			       cnt500<=499;
			       cnt375<=cnt375-1;
			       cnt125<=124;
			       pwm<='0';
			       
		     when final =>
			          cnt500<=cnt500-1;
				  cnt375<=374;
				  cnt125<=124;
				  pwm<='1';
				  
		    when others =>
		                  null;
                end case;
                
                if (cnt375=0 or cnt500=0) then
                    cnt500<=499;
                    cnt375<=374;  
		    phase <= phB2;
		end if;
		
	   when phB2 =>
		case speeding is
		     when UPA =>
				cnt375<=374;
				cnt125<=124;
				cnt500<=499;
				pwm<='1';
				
		     when UPB =>
				cnt500<=499;
				cnt375<=374;
				cnt125<=cnt125-1;
				pwm<='0';
				
		     when Dn =>
			       cnt500<=499;
			       cnt375<=374;
			       cnt125<=cnt125-1;
			       pwm<='1';
			       
		     when final =>
			          cnt500<=cnt500-1;
				  cnt375<=374;
				  cnt125<=124;
				  pwm<='0';
				  
		     when others =>
			           null;			           
		end case;
		
		if (cnt125=0 or	cnt500=0) then
                    cnt500<=499;
                    cnt125<=124;  
		    phase <= phB1;
		end if;
		
	   when others =>
	 		 null;
      end case;
   end if;
end process;

end motorctrl_arch;

⌨️ 快捷键说明

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