risc-v中文社区

 找回密码
 立即注册
查看: 1058|回复: 2

[原创] chisel实现Mealy状态机

  [复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-31 08:30:47 | 显示全部楼层 |阅读模式
对于次态来说,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
  }
}

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-8-31 08:31:41 | 显示全部楼层
生成的verilog代码如下:
module MealyFSM(
  input   clock,
  input   reset,
  input   io_din,
  output  io_risingEdge
);
  reg  stateReg; // @[MealyFSM.scala 14:25]
  reg [31:0] _RAND_0;
  wire  _T = ~stateReg; // @[Conditional.scala 37:30]
  wire  _GEN_0 = io_din | stateReg; // @[MealyFSM.scala 20:20]
  wire  _T_2 = ~io_din; // @[MealyFSM.scala 29:12]
  assign io_risingEdge = _T & io_din; // @[MealyFSM.scala 16:17 MealyFSM.scala 24:23 MealyFSM.scala 38:23]

  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
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-8-31 15:46:55 | 显示全部楼层
Moore和Mealy状态机的最大不同就是:Moore的输出只与当前状态有关,而Mealy的输出不仅与当前状态有关,还与输入有关,所以,Mealy在代码中输出信号的改变要在当前状态和输入信号的某种逻辑处理中才能被赋值。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-29 10:05 , Processed in 0.015456 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表