前言
FSM是电路设计中非常常见的结构,对于这样常见的结构的正确输写非常重要, 良好的代码风格对于阅读理解以及后期维护也非常重要。本文总结了目前常见的两种输写FSM的方法
介绍
FSM目前主要有两种架构
- Moore FSM
- Mealy FSM
要让电路顺序地执行计算,最简单的方法就是生成一个counter, 然后根据counter值去执行相应的操作或计算。但这种方法只能用于非常简单的控制,且非常不容易维护以及后期功能修改。所以实际上大家都会用标准的FSM来实现复杂控制。
Moore FSM架构
Moore FSM是目前的主流写法, 它由三块组成:
- state register : 由DFF构成,将Next state Logic产生的state存入current register
- next state logic : 由组合逻辑组成,根据输入及目前state,产生next state
- output logic : 组合逻辑, 根据目前state产生输出
假设输入为w_i, 输出为z_o, 当输入连续2个cycle为高时,则输出为1个cycle高
下面是state diagram
三段式编码
/**********************************************
Description : 3 always block for moore fsm (BEST)
**********************************************/
module simple_fsm (
clk,
rst_n,
w_i,
z_o
);
input clk;
input rst_n;
input w_i;
output z_o;
parameter IDLE = 2'b00;
parameter S0 = 2'b01;
parameter S1 = 2'b10;
reg [1:0] curr_state;
reg [1:0] next_state;
reg z_o;
// state reg
always@(posedge clk or negedge rst_n)
begin
if (~rst_n) curr_state <= IDLE;
else curr_state <= next_state;
end
// next state logic
always@(*)
begin
case (curr_state)
IDLE : if (w_i) next_state = S0;
else next_state = IDLE;
S0 : if (w_i) next_state = S1;
else next_state = IDLE;
S1 : if