0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog设计过程中状态机的设计方法

FPGA之家 来源:时沿科技 作者:NemoYxc 2021-06-25 11:04 次阅读

“本文主要分享了在Verilog设计过程中状态机的一些设计方法。

关于状态机

状态机本质是对具有逻辑顺序或时序顺序事件的一种描述方法,也就是说具有逻辑顺序和时序规律的事情都适用状态机描述。状态机的基本要素有三个:状态、输出和输入。

根据状态机的输出是否与输入条件有关,可将状态机分为:

摩尔(Moore)型和米里(Mealy)型。

摩尔型状态机:输出仅与当前状态有关,而与输入条件无关。

米里型状态机:输出不仅依赖于当前状态,还取决于输入条件。

状态机的逻辑通常用“case”语句或者“if-else”语句来描述,枚举当前状态和输入的所有可能组合,并为下一个状态和输出制定适当的值。

RTL级状态机描述常用语法:

wire、reg;

parameter,用于描述状态名称,增强代码可读性;

always,根据主时钟沿,完成同步时序的状态迁移;根据信号敏感表,完成组合逻辑输出。

case/endcase:其中default是可选的关键字,用于指明当所列的所有条件都不匹配时的操作;一般的FSM设计都会加上default关键字描述FSM所需的补集状态。

task/endtask。

几种状态机的描述方法

一段式FSM描述方法:一个always块里面,即描述状态转移,又描述状态的输入和输出。

两段式FSM描述方法:两个always块,一个采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律。

三段式FSM描述方法:第一个always模块采用同步时序描述状态转移;第二个采用组合逻辑判断状态转移条件,描述状态转移规律;第三个always模块使用同步时序电路,描述每个状态的输出。

一段式:

reg [2:0] Next_State;//下一个状态 parameter IDLE = 3‘b000; parameter S1 = 3’b001; parameter S2 = 3‘b010; parameter CLEAR = 3’b100;

//--------------------------------------------------------------------------------//------ 在一个always中包含状态、输入和输出。 always@(posedge clk or posedge rst) begin if(rst) begin Next_State 《= IDLE; out 《= 2‘b00; end else begin case(Next_State) IDLE : begin if(key_in == 1’b1) begin Next_State 《= S1; out 《= 2‘b01;

end else begin Next_State 《= IDLE; out 《= 2’b00; end end S1 : begin if(key_in == 1‘b1) begin Next_State 《= S2; out 《= 2’b10; end else begin Next_State 《= S1; out 《= 2‘b01;

end end S2 : begin if(key_in == 1’b1) begin Next_State 《= CLEAR; out 《= 2‘b11; end else begin Next_State 《= S2; out 《= 2’b10; end end CLEAR : begin if(key_in == 1‘b1) begin Next_State 《= IDLE; out 《= 2’b00;

end else begin Next_State 《= CLEAR; out 《= 2‘b11; end end endcase end end

两段式:

reg [2:0] Next_State;//下一个状态 reg [2:0] Current_State;//当前状态

parameter IDLE = 3’b000; parameter S1 = 3‘b001; parameter S2 = 3’b010; parameter CLEAR = 3‘b100;

//-------------------------------------------------------------------------------- always@(posedge clk or posedge rst) begin if(rst) Current_State 《= IDLE; else Current_State 《= Next_State; end always@(*)

// always@(rst or Current_State or key_in) begin case(Current_State) IDLE : begin idle_out;// out = 2’b00; if(key_in == 1‘b1) Next_State = S1; else Next_State = IDLE; end S1 : begin s1_out;// out = 2’b01; if(key_in == 1‘b1) Next_State = S2; else Next_State = S1; end S2 : begin s2_out;// out = 2’b10; if(key_in == 1‘b1) Next_State = CLEAR; else Next_State = S2; end CLEAR : begin clear_out;

// out = 2’b11; if(key_in == 1‘b1) Next_State = IDLE; else Next_State = CLEAR; end endcase end

//-------------------------------------------------------------------------------- task idle_out; out = 2’b00; endtask task s1_out; out = 2‘b01; endtask

task s2_out; out = 2’b10; endtask

task clear_out; out = 2‘b11; endtask

三段式:

//-------------------------------------------------------------------------------- reg [2:0] Next_State;//下一个状态 reg [2:0] Current_State;//当前状态 parameter IDLE = 3’b000; parameter S1 = 3‘b001; parameter S2 = 3’b010; parameter CLEAR = 3‘b100;

//-------------------------------------------------------------------------------- always@(posedge clk or posedge rst) begin if(rst) Current_State 《= IDLE; else Current_State 《= Next_State; end

//--------------------------------------------------------------------------------// always@(rst or Current_State or key_in) always@(*) begin case(Current_State) IDLE : begin if(key_in == 1’b1) Next_State = S1; else Next_State = IDLE; end S1 : begin if(key_in == 1‘b1) Next_State = S2; else Next_State = S1; end S2 : begin if(key_in == 1’b1) Next_State = CLEAR; else Next_State = S2; end CLEAR : begin if(key_in == 1‘b1) Next_State = IDLE; else Next_State = CLEAR; end endcase end

//-------------------------------------------------------------------------------- always@(posedge clk or posedge rst) begin if(rst) begin out 《= 2’b00; end else begin case(Next_State) IDLE : begin out 《= 2‘b00; end S1 : begin out 《= 2’b01; end S2 : begin out 《= 2‘b10; end CLEAR : begin out 《= 2’b11; end endcase end end

//--------------------------------------------------------------------------------

结论:

一段式状态机比较适合在状态较少的情况下使用,因为所有的状态、输入和输出都在一起,可能不是很适合阅读、理解、维护;

二段式状态机比一段式要容易理解,但是由于输出是组合逻辑,容易存在不稳定与毛刺隐患;

三段式状态机比一段式更容易理解,用时序逻辑代替组合逻辑消除了不稳定与毛刺的隐患,但是代码量会稍微多一点;

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1325

    浏览量

    109293
  • 状态机
    +关注

    关注

    2

    文章

    485

    浏览量

    27158

原文标题:Verilog基础知识学习笔记(四)

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Verilog状态机+设计实例

    verilog状态机的一种很常用的逻辑结构,学习和理解状态机的运行规律能够帮助我们更好地书写代码,同时作为一种思想方法,在别的代码设计中也会有所帮助。 一、简介 在使用
    的头像 发表于 02-12 19:07 1969次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>状态机</b>+设计实例

    Spring状态机的实现原理和使用方法

    说起 Spring 状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring 状态机就是状态模式的一种实现,在
    的头像 发表于 12-26 09:39 938次阅读
    Spring<b class='flag-5'>状态机</b>的实现原理和使用<b class='flag-5'>方法</b>

    SaberRD状态机建模工具介绍(一)什么是状态机建模

    状态机建模是使用状态图和方程式的手段,创建基于混合信号的有限状态机模型的一种建模工具。
    的头像 发表于 12-05 09:51 513次阅读
    SaberRD<b class='flag-5'>状态机</b>建模工具介绍(一)什么是<b class='flag-5'>状态机</b>建模

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 4822次阅读

    有限状态机分割设计

    有限状态机分割设计,其实质就是一个状态机分割成多个状态机
    的头像 发表于 10-09 10:47 346次阅读

    如何使用FSME来定制状态机

    定制状态机 目前得到的状态机已经能够响应来自外部的各种事件,并适当地调整自己当前所处的状态,也就是说已经实现了状态机引擎的功能,接下来要做的就是根据应用的具体需求来进行定制,为
    的头像 发表于 09-13 16:57 874次阅读
    如何使用FSME来定制<b class='flag-5'>状态机</b>

    如何生成状态机框架

    生成状态机框架 使用FSME不仅能够进行可视化的状态机建模,更重要的是它还可以根据得到的模型自动生成用C++或者Python实现的状态机框架。首先在FSME界面左边的树形列表中选择"Root
    的头像 发表于 09-13 16:54 649次阅读
    如何生成<b class='flag-5'>状态机</b>框架

    自动生成程序状态机代码状态机建模方法

    首先运行fsme命令来启动状态机编辑器,然后单击工具栏上的“New”按钮来创建一个新的状态机。FSME中用于构建状态机的基本元素一共有五种:事件(Event)、输入(Input)、输出(Output
    的头像 发表于 09-13 16:50 719次阅读
    自动生成程序<b class='flag-5'>状态机</b>代码<b class='flag-5'>状态机</b>建模<b class='flag-5'>方法</b>

    三段式,四段式状态机设计方法是什么(状态机设计注意事项)

    有限状态机,简称状态机,通俗的说,就是把全部的情况分成几个场景,这些场景的工作方式明显不同。简单来说就是如下所示的状态转移图
    发表于 08-31 15:30 672次阅读
    三段式,四段式<b class='flag-5'>状态机</b>设计<b class='flag-5'>方法</b>是什么(<b class='flag-5'>状态机</b>设计注意事项)

    如何在FPGA中实现状态机

    状态机往往是FPGA 开发的主力。选择合适的架构和实现方法将确保您获得一款最佳解决方案。 FPGA 常常用于执行基于序列和控制的行动, 比如实现一个简单的通信协议。对于设计人员来说,满足这些行动
    的头像 发表于 07-18 16:05 562次阅读
    如何在FPGA中实现<b class='flag-5'>状态机</b>

    状态机编程实例-面向对象的状态设计模式

    本编介绍了状态机编程的第3种方法——面向对象的状态设计模式,通过C++的继承特性,以及类指针,实现炸弹拆除小游戏中的状态机功能。
    的头像 发表于 06-28 09:04 900次阅读
    <b class='flag-5'>状态机</b>编程实例-面向对象的<b class='flag-5'>状态</b>设计模式

    状态机要实现哪些内容

    状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑
    的头像 发表于 06-22 14:26 445次阅读
    <b class='flag-5'>状态机</b>要实现哪些内容

    三段式状态机编写问题及三段式状态机各部分功能分析

    Verilog的江湖里,流传着一段,两段,三段式状态机的传说。它们各有优劣,本文就书写三段式状态机的错误原因进行探寻。
    的头像 发表于 06-20 10:35 2187次阅读
    三段式<b class='flag-5'>状态机</b>编写问题及三段式<b class='flag-5'>状态机</b>各部分功能分析

    状态机编程实例-状态表法

    上篇文章,使用嵌套switch-case法的状态机编程,实现了一个炸弹拆除小游戏。本篇,继续介绍状态机编程的第二种方法状态表法,来实现炸弹拆除小游戏的
    的头像 发表于 06-20 09:05 1249次阅读
    <b class='flag-5'>状态机</b>编程实例-<b class='flag-5'>状态</b>表法

    Verilog状态机的类型

    有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
    的头像 发表于 06-01 15:23 1307次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>状态机</b>的类型