|
vhdl步进电机控制器
以一个具体的双向步进电机控制的例子来讲述Moore型状态机的设计过程。该控制电路的输入信号有3个:时钟信号clk,复位信号reset和方向控制信号dir。输出信号为phase[3..0],用来控制步进电机的动作。当方向控制信号dir为1时,要求输出信号phase[3..0] 按照“0001”、“0010”、“0100”、“1000”、“0001”的顺序循环变化。当方向控制信号dir为0时,要求输出信号phase[3..0]按照“1000”、“0100”、“0010”、“0001”、“1000”的顺序循环变化。
根据控制器的功能要求,画出状态转换图和状态与输出信号的关系,分别如下图和表。

步进电机控制器的状态转换图
步进电机状态与输出信号的对应关系
状态 |
输出信号phase[3..0] |
S0 |
0001 |
S1 |
0010 |
S2 |
0100 |
S3 |
1000 |
步进电机控制器VHDL程序。
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY stepmotor IS
PORT(
clk,reset:IN STD_LOGIC;
dir:IN STD_LOGIC;
phase :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ENTITY stepmotor ;
ARCHITECTURE arc1 OF stepmotor IS
TYPE states IS (s0,s1,s2,s3);
SIGNAL current_state: states;
BEGIN
PROCESS(clk)
BEGIN
IF clk'EVENT AND clk='1' THEN
IF reset='1'THEN
current_state<=s0;
ELSE
CASE current_state IS
WHEN s0 =>
IF dir='1' THEN
current_state<=s1;
ELSE
current_state<=s3;
END IF;
WHEN s1 =>
IF dir='1' THEN
current_state<=s2;
ELSE
current_state<=s0;
END IF;
WHEN s2 =>
IF dir='1' THEN
current_state<=s3;
ELSE
current_state<=s1;
END IF;
WHEN s3 =>
IF dir='1' THEN
current_state<=s0;
ELSE
current_state<=s2;
END IF;
WHEN OTHERS =>
current_state<=s0;
END CASE;
END IF;
END IF;
END PROCESS;
PROCESS (current_state)
BEGIN
CASE current_state IS
WHEN s0 =>
phase<="0001";
WHEN s1 =>
phase<="0010";
WHEN s2 =>
phase<="0100";
WHEN s3 =>
phase<="1000";
END CASE;
END PROCESS;
END ARCHITECTURE arc1;
|