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

📄 step_motor_degree_forward_reverse_lcd.vhd

📁 將正在順時針或逆時針旋轉的步進馬達目前角度顯示在LCM上。
💻 VHD
字号:
--**********************************************************
--* Stepping Motor Degree Display In LCD (FORWARD,REVERSE) *
--*  Filename : STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD.VHD  *
--**********************************************************

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD_PACK.all;

entity STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD is
    Port ( CLK       : in std_logic;
           RESET     : in std_logic;
		 DIRECTION : in std_logic;
		 LCM_RW    : out std_logic;
		 LCM_EN    : out std_logic;
           LCM_RS    : out std_logic;
		 TRIGGER   : out std_logic_vector(3 downto 0);
		 LCM_DATA  : out std_logic_vector(7 downto 0));
end STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD;

architecture Behavioral of STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD is
  signal INIT_CLK  : std_logic;
  signal SHIFT_CLK : std_logic;
  signal LCM_COUNT : std_logic_vector(5 downto 0);
  signal PATTERN   : std_logic_vector(3 downto 0);
  signal DEGREE    : std_logic_vector(15 downto 0); 
  signal SUM_BCD   : std_logic_vector(15 downto 0);
  signal DIVIDER   : std_logic_vector(25 downto 1); 

--*************************
--*  Time Base Generator  *
--*************************

begin

  process (CLK,RESET)
    begin
	 if RESET    = '0' then
	    DIVIDER <= "0000000000000000000000000";
	 elsif CLK'event and CLK = '1' then 
	    DIVIDER <= DIVIDER + 1;
	 end if;
  end process;

  INIT_CLK  <= DIVIDER(15);
  SHIFT_CLK <= DIVIDER(25);
  LCM_EN    <= INIT_CLK ;
 
  
--***************************************
--*  LCD Display And Direction Control	*
--***************************************

 process (RESET,INIT_CLK)

     begin
       if RESET        = '0' then
	     LCM_COUNT   <=  "000000";
	     LCM_RS      <= '0';
          LCM_RW      <= '0';
	     LCM_DATA    <= "00000001";
	  elsif INIT_CLK'event and INIT_CLK = '1' then
	    if LCM_COUNT < "100110" then
	       LCM_COUNT <= LCM_COUNT + 1;
         else
            LCM_COUNT <= "010110";       
         end if;
	    case LCM_COUNT is
	      when "000000"  =>
	    	      LCM_RS   <= '0';
		      LCM_RW   <= '0';
		      LCM_DATA <= "00111100";  -- 8 BIT, 2 Lines, 5 * 7 Dot
	      when "000001"  =>
	    	      LCM_DATA <= "00111100";  -- 8 BIT, 2 Lines, 5 * 7 Dot
           when "000010"  => 
                LCM_DATA <= "00000001";  -- Clear LCD Display
	      when "000011"  => 
                LCM_DATA <= "00000110";  -- Cursor Shift Right, AC + 1
	      when "000100"  => 
                LCM_DATA <= "00001100";  -- Display on, Cursor off
           when "000101"  =>
                LCM_RS   <= '0';		 -- Set Cursor
                LCM_DATA <= "10000000";
           when "000110"  =>
			 LCM_RS   <= '1';
		      LCM_DATA <= "01010011";  -- S
	      when "000111"  => 
	           LCM_DATA <= "01110100";  -- t
	      when "001000"  => 
	           LCM_DATA <= "01100101";  -- e
	      when "001001"  => 
	           LCM_DATA <= "01110000";  -- p
	      when "001010"  =>
	           LCM_DATA <= "01110000";  -- p
		 when "001011"  =>
     	      LCM_DATA <= "01101001";  -- i
	      when "001100"  => 
	           LCM_DATA <= "01101110";  -- n
	      when "001101"  => 			
                LCM_DATA <= "01100111";  -- g
	      when "001110"  => 			 
                LCM_DATA <= "00100000";  --  
           when "001111"  =>
                LCM_DATA <= "01001101";  -- M
		 when "010000"  => 
	           LCM_DATA <= "01101111";  -- o
           when "010001"  => 				
                LCM_DATA <= "01110100";  -- t
	      when "010010"  => 				
                LCM_DATA <= "01101111";  -- o
	      when "010011"  => 
                LCM_DATA <= "01110010";  -- r
           when "010100"  =>
                LCM_DATA <= "00100000";  --  
           when "010101"  =>
                LCM_DATA <= "00111010";  -- :
           when "010110"  =>
			 LCM_RS   <= '0';
		      LCM_DATA <= "11000000";  -- Set Cursor
           when "010111"  =>
			 LCM_RS   <= '1';
		      LCM_DATA <= "00100000";  --  
	      when "011000"  => 
	           LCM_DATA <= "01000100";  -- D
	      when "011001"  => 
	           LCM_DATA <= "01100101";  -- e
	      when "011010"  => 
	           LCM_DATA <= "01100111";  -- g
	      when "011011"  =>
	           LCM_DATA <= "01110010";  -- r
		 when "011100"  =>
     	      LCM_DATA <= "01100101";  -- e
	      when "011101"  => 
	           LCM_DATA <= "01100101";  -- e
	      when "011110"  => 			
                LCM_DATA <= "00100000";  --  
	      when "011111"  => 			 
                LCM_DATA <= "00111010";  -- :
           when "100000"  =>
                LCM_DATA <= "00100000";  --  
		 when "100001"  =>
		      LCM_DATA <= "00100000";  -- 
		 when "100010"  => 
	           LCM_DATA <= "0011" & DEGREE(15 downto 12);
	      when "100011"  => 				
                LCM_DATA <= "0011" & DEGREE(11 downto 8);  
	      when "100100"  => 
                LCM_DATA <= "0011" & DEGREE(7 downto 4);  
           when "100101"  =>
                LCM_DATA <= "00101110";  -- .
		 when others    => 
                LCM_DATA <= "0011" & DEGREE(3 downto 0);
         end case;
       end if;	      	     
   end process;


--***********************************
--*     Stepping Mortor Control 	 *
--***********************************

  process (SHIFT_CLK,RESET)
    begin
	 if RESET       = '0' then
	    PATTERN    <= "1000";
	    DEGREE     <= "0000000000000000";
 	elsif SHIFT_CLK'event and SHIFT_CLK = '1' then
       if DIRECTION  = '0' then
		PATTERN   <= PATTERN(0) & PATTERN(3 downto 1);
		if DEGREE  = "0011010110000010" then 
	        DEGREE <= "0000000000000000";
		else
		   DEGREE <=  SUM_BCD;
	     end if;
	  else
		PATTERN   <= PATTERN(2 downto 0) & PATTERN(3);
		if DEGREE  = "0000000000000000" then
		   DEGREE <= "0011010110000010";
		else
		   DEGREE <= SUM_BCD;
		end if;
	  end if;
     end if;
  end process;
  TRIGGER <= PATTERN; 

--*****************************
--*    Calculation Degree 	*
--*****************************

ADD_SUB : BCD_ADD_SUB_4DIG port map (DIRECTION,DEGREE,"0000000000011000",SUM_BCD);
end Behavioral;

⌨️ 快捷键说明

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