joe 发表于 2021-8-31 08:30:47

chisel实现Mealy状态机

对于次态来说,Mealy和Moore是一样的,都是由输入和现态决定了次态,但对于输出来说,
Mealy的输出由现态和输入决定,而Moore的输出仅由现态决定。所以,实现一样的功能,
Moore的状态会多一些,同时Moore实现了输入和输出的隔离。
import chisel3._
import chisel3.util._
class MealyFSM extends Module{
val io = IO(new Bundle {
    val din = Input(Bool())
    val risingEdge = Output(Bool())
})
//二个状态
val zero :: one :: Nil = Enum(2)

//状态寄存器
val stateReg = RegInit(zero)
//输出默认值
io.risingEdge := false.B
//下次状态和输出逻辑
switch(stateReg) {
    is(zero) { //当前状态是zero
      when(io.din) {//输入是1
      //状态转移
      stateReg := one
      //因为是Mealy FSM,输出不仅仅与输入有关,还与当前状态有关,所以还必须要指出在当前状态和输入条件下的输出值
      io.risingEdge := true.B
      }
    }
    is(one) {
      when(!io.din) {
      //状态转换
      stateReg := zero
      //Mealy FSM,输出与输入和当前状态都有关,所经也是必须要在当前din和当前stateReg条件下指定输出值
      io.risingEdge := false.B
      }
    } 0
}
}

joe 发表于 2021-8-31 08:31:41

生成的verilog代码如下:
module MealyFSM(
input   clock,
input   reset,
input   io_din,
outputio_risingEdge
);
regstateReg; // @
reg _RAND_0;
wire_T = ~stateReg; // @
wire_GEN_0 = io_din | stateReg; // @
wire_T_2 = ~io_din; // @
assign io_risingEdge = _T & io_din; // @

always @(posedge clock) begin
    if (reset) begin
      stateReg <= 1'h0;
    end else if (_T) begin
      stateReg <= _GEN_0;
    end else if (stateReg) begin
      if (_T_2) begin
      stateReg <= 1'h0;
      end
    end
end
endmodule

joe 发表于 2021-8-31 15:46:55

Moore和Mealy状态机的最大不同就是:Moore的输出只与当前状态有关,而Mealy的输出不仅与当前状态有关,还与输入有关,所以,Mealy在代码中输出信号的改变要在当前状态和输入信号的某种逻辑处理中才能被赋值。
页: [1]
查看完整版本: chisel实现Mealy状态机