一周掌握 FPGA VHDL Day 4

2020-12-30 14:53:22 浏览数 (1)

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来的是一周掌握 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等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

0 人点赞