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
}
}
生成的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
Moore和Mealy状态机的最大不同就是:Moore的输出只与当前状态有关,而Mealy的输出不仅与当前状态有关,还与输入有关,所以,Mealy在代码中输出信号的改变要在当前状态和输入信号的某种逻辑处理中才能被赋值。
页:
[1]