今天给大侠带来的是一周掌握 FPGA VHDL Day 4,今天开启第四天,带来状态机在VHDL中的实现。下面咱们废话就不多说了,一起来看看吧。每日十分钟,坚持下去,量变成质变。
VHDL语言
四、状态机在VHDL中的实现
4.1 Moore 状态机的VHDL描述
输出仅取决于其所处的状态。
代码语言:javascript复制LIBRARY IEEE;USE IEEE.Std_ Logic_1164.ALL;ENTITY Moore IS
PORT
( Reset, Clock, DIN :IN Std_Logic;
DOUT:OUT Std_Logic_Vetor(2 DOWNTO 0));
END;
ARCHITECTURE Mooremachine OF Moore IS
TYPE State_type IS (S0,S1,S2,S3);--定义State_type为枚举型数据类型 SIGNAL State:State_type;BEGIN
Change_State: PROCESS (Reset, Clock) --时序逻辑进程
BEGIN
IF Reset=‘1’ THEN
State<=S0;
代码语言:javascript复制ELSEIF rising_edge(Clock) THEN
CASE State IS
WHEN S0=〉IF DIN=‘1’ THEN State<=S1;END IF;
WHEN S1=〉IF DIN=‘1’ THEN State<=S2;END IF;
WHEN S2=〉IF DIN=‘1’ THEN State<=S3;END IF;
WHEN S3=〉IF DIN=‘1’ THEN State<=S0;
ELSE State<=S1;
END IF ;
END CASE;
END IF;
END PROCESS;
--定义输出进程,组合逻辑
Output_Process:
PROCESS(State) BEGIN
CASE State IS
WHEN S0=>DOUT <=“001”;
WHEN S1=>DOUT <=“011”;
WHEN S2=>DOUT <=“101”;
WHEN S3=>DOUT <=“111”;
END CASE;
END PROCESS;
END;
仿真波形图:
时钟同步Moore状态机结构图:
代码语言:javascript复制LIBRARY IEEE;USE IEEE.Std_ Logic_1164.ALL;ENTITY Moore IS
PORT
( Reset,Clock, DIN :in Std_Logic;
DOUT:out Std_Logic_Vetor(2 DOWNTO 0) );
END;
ARCHITECTURE Mooremachine OF Moore IS
TYPE State_type IS (S0,S1,S2,S3);
SIGNAL PresentState, NextState :State_type;--定义状态转换信号
BEGIN
State_Reg: PROCESS (Reset, Clock) --状态寄存器
BEGIN
IF Reset=‘1’ THEN --异步复位
PresentState<=S0;
ELSEIF rising_edge(Clock) THEN
PresentState<=NextState;--时钟上升沿,转换至下一状态
END IF;
END PROCESS;
代码语言:javascript复制Change_State:PROCESS (PresentState,DIN) --组合逻辑进程
BEGIN
CASE Present State IS
WHEN S0=〉if DIN=‘1’ then NextState<=S1;
else NextState<=S0;
end if;
DOUT <=“001”;
WHEN S1=〉if DIN=‘1’ then NextState<=S2;
else NextState<=S1;
end if ;
DOUT <=“011”;
WHEN S2=〉if DIN=‘1’ then NextState<=S3;else NextState<=S2;
end if ;DOUT <=“101”;
WHEN S3=〉if DIN=‘1’ then NextState<=S0;
else NextState<=S1;
end if ;DOUT <=“111”;
END CASE;
END PROCESS;
END;
仿真波形图:
4.2 Mealy 状态机的VHDL描述
输出由当前状态与输入共同决定。
代码语言:javascript复制LIBRARY IEEE;
USE IEEE.Std_ Logic_1164.ALL;
ENTITY MealyMachine IS
PORT
( Reset ,Clock,DIN:IN Std_Logic;
DOUT:OUT Std_Logic_Vetor(2 DOWNTO 0)
);
END;
ARCHITECTURE Statemachine OF MealyMachine IS
TYPE State_type IS (S0,S1,S2,S3);
SIGNAL State:State_type;
BEGIN
Change_State: PROCESS (Reset,Clock)
BEGIN
IF Reset=‘1’ THEN
State<=S0;
ELSIF rising_edge(Clock) THEN
CASE State IS
WHEN S0=〉IF DIN=‘1’ THEN State<=S1;END IF;
WHEN S1=〉IF DIN=‘1’ THEN State<=S2;END IF;
WHEN S2=〉IF DIN=‘1’ THEN State<=S3;END IF;
WHEN S3=〉IF DIN=‘1’ THEN State<=S0;
ELSE State<=S1; END IF ;
END CASE;
END IF;
END
PROCESS;Output_Process:PROCESS(State,DIN)
BEGIN
CASE State IS
WHEN S0=>IF DIN=‘0’ THEN DOUT <=“000”;
ELSE DOUT<=“001”;END IF;WHEN S1=>IF DIN=‘0’ THEN DOUT <=“010”;
ELSE DOUT<=“011”;END IF;WHEN S2=> IF DIN=‘0’ THEN DOUT <=“100”;
ELSE DOUT<=“101”;END IF;WHEN S3=> IF DIN=‘0’ THEN DOUT <=“110”;
ELSE DOUT<=“111”;END IF;
END CASE;
END PROCESS;
END;
仿真波形图:
4.3 状态机的容错设计
主要针对未定义状态(剩余状态)
- 单独设计一个状态(ERROR),用以处理状态机出错的情况, 用 WHEN OTHERS=>State<=Error; 使状态机从未定义的状态跳转到处理出错情况的状态;
- 直接回复到其他已设定的状态。
4.4 状态机设计与寄存器
- 对于所有可能的输入条件,当进程中的输出信号如果没有被完 全地与之对应指定,此信号将自动被指定,即在未列出的条件下 保持原值,这意味着引入了寄存器。
- 在状态机中,如果存在一个或更多的状态没有被明确指定转换方式,或者对于状态机中的状态值没有规定所有的输出值,就可能引入寄存器。
Day 4 就到这里,Day 5 继续开始常用电路的VHDL程序。
END
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!