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

📄 sh057.vhd

📁 步进驱动器CPLD内核程序的编写
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SH057 IS 
PORT(clk2,cp,dir,free: IN STD_LOGIC;
     clr:IN STD_LOGIC;
     clk3:IN STD_LOGIC;
     sw1,sw2,sw3:IN STD_LOGIC;
     comp_a,comp_b:IN STD_LOGIC;
     elc_half:OUT STD_LOGIC;     
     phase_a,phase_b: OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
     elc_a,elc_b:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END SH057; 

ARCHITECTURE microstep_2 OF SH057 IS 
 SIGNAL a_h,b_h:STD_LOGIC_VECTOR(1 DOWNTO 0); 
 SIGNAL buf_a_h,buf_b_h:STD_LOGIC_VECTOR(1 DOWNTO 0); 
 SIGNAL buf_elc_a,buf_elc_b:STD_LOGIC_VECTOR(5 DOWNTO 0); 
 BEGIN 
 elc_int:PROCESS(clr,buf_elc_a,buf_elc_b,buf_a_h,buf_b_h)
   BEGIN    
    if clr='1' then 
      elc_a<=buf_elc_a;
      elc_b<=buf_elc_b;
      a_h<=buf_a_h;
      b_h<=buf_b_h;
    else    
      elc_a<="000000";
      elc_b<="111111";
      a_h<="00";
      b_h<="00";
     end if;   
  END PROCESS;
 
elc_dis:PROCESS(cp,dir,free) 
   VARIABLE state_elc: INTEGER RANGE 0 TO 3:=0; 
   VARIABLE state_h:INTEGER RANGE 0 TO 7:=0;  
   BEGIN 
     IF clr='1' THEN
      IF free='1' THEN        
       IF cp'EVENT AND cp='0' THEN             
         IF dir='0' THEN 
            IF state_h=7 THEN state_h:=0; 
              ELSE state_h:=state_h+1;
            END IF;       
            IF state_elc=3 THEN state_elc:=0;                   
              ELSE state_elc:=state_elc+1;
            END IF;
         ELSE 
            IF state_h=0 THEN state_h:=7;
              ELSE state_h:=state_h-1;
            END IF;
            IF state_elc=0 THEN state_elc:=3;                   
              ELSE state_elc:=state_elc-1;
            END IF;                    
         END IF;               
        CASE state_elc IS
            WHEN 0 => buf_elc_a<="000000";buf_elc_b<="111111";
            WHEN 1 => buf_elc_a<="101101";buf_elc_b<="101101";
            WHEN 2 => buf_elc_a<="111111";buf_elc_b<="000000";
            WHEN 3 => buf_elc_a<="101101";buf_elc_b<="101101";
        END CASE;
      END IF;     
        CASE state_h IS
            WHEN 0 => buf_a_h<="00";buf_b_h<="10";
            WHEN 1 => buf_a_h<="01";buf_b_h<="10";
            WHEN 2 => buf_a_h<="01";buf_b_h<="00";
            WHEN 3 => buf_a_h<="01";buf_b_h<="01";
            WHEN 4 => buf_a_h<="00";buf_b_h<="01";
            WHEN 5 => buf_a_h<="10";buf_b_h<="01";
            WHEN 6 => buf_a_h<="10";buf_b_h<="00";
            WHEN 7 => buf_a_h<="10";buf_b_h<="10";
         END CASE;             
       ELSE buf_a_h<="00";buf_b_h<="00";             
      END IF;
    END IF;         
  END PROCESS;

switch_a:PROCESS(clk2,comp_a,a_h)
variable  bf_a:STD_LOGIC:='0';
variable  bf_a1:std_logic:='0';
BEGIN
 if clk2'event and clk2='1' then bf_a1:='1';end if ;
 IF comp_a='1' then    
   IF clk2='1' then 
     if bf_a1='1' then phase_a<=a_h; else phase_a<="00";end if;    
     else if clk2='0' then if bf_a='1' and bf_a1='1' then phase_a<=a_h; else phase_a<="00";end if;         
         end if;         
        bf_a:='1';                 
       end if ;
      else phase_a<="00";bf_a:='0'; bf_a1:='0'; 
    END IF;
  END PROCESS; 

switch_b:PROCESS(clk2,comp_b,b_h)
variable  bf_b:STD_LOGIC:='0';
variable  bf_b1:std_logic:='0';
  BEGIN
 if clk2'event and clk2='1' then bf_b1:='1';end if ;
 IF comp_b='1' then    
   IF clk2='1' then 
     if bf_b1='1' then phase_b<=b_h; else phase_b<="00";end if;    
     else if clk2='0' then if bf_b='1' and bf_b1='1' then phase_b<=b_h; else phase_b<="00";end if;         
         end if;         
        bf_b:='1';                 
       end if ;
      else phase_b<="00";bf_b:='0'; bf_b1:='0'; 
    END IF;
  END PROCESS; 


elc_de:PROCESS(clk3,cp)
variable cnt:integer range 0 to 2:=0;
variable bf_elc:std_logic:='0';
 BEGIN
   IF cp='1' THEN 
     if  clk3'event and clk3='0' then  cnt:=cnt+1;end if;
      case cnt is
        when 2=> bf_elc:='1';
        when others => null;
      end case;
     if bf_elc='1' then elc_half<='1';cnt:=0;else elc_half<='0';end if;
  else  bf_elc:='0';cnt:=0; elc_half<='0';        
  END IF;
 END PROCESS;
     
END microstep_2;

⌨️ 快捷键说明

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