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

    文章

    1351

    浏览量

    110091
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27538

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

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

收藏 人收藏

    评论

    相关推荐

    锡膏印刷印刷过程中有哪些不良及解决方法

    PCB制作工艺基本上都需要用到SMT工艺,因此在PCBA的加工工艺普遍用到锡膏印刷,在使用锡膏印刷过程中有时候会遇到各种问题,这些不良应该如何解决呢?下面深圳佳金源锡膏厂家给大
    的头像 发表于 12-19 16:40 207次阅读
    锡膏印刷<b class='flag-5'>机</b>印刷<b class='flag-5'>过程中</b>有哪些不良及解决<b class='flag-5'>方法</b>

    Verilog 测试平台设计方法 Verilog FPGA开发指南

    Verilog测试平台设计方法Verilog FPGA开发的重要环节,它用于验证Verilog设计的正确性和性能。以下是一个详细的
    的头像 发表于 12-17 09:50 195次阅读

    Simulink状态机建模方法 Simulink数据可视化与分析功能

    1. Simulink状态机建模方法 1.1 理解状态机的基本概念 在开始建模之前,了解状态机的基本概念是必要的。
    的头像 发表于 12-12 09:27 390次阅读

    Jtti:有哪些工具可以帮助我监控自动更新过程中的系统状态

    监控自动更新过程中的系统状态对于确保系统的稳定性和性能至关重要。以下是一些可以帮助你监控系统状态的工具: 1.系统日志工具 dmesg:显示内核环缓冲区消息,有助于识别硬件和驱动程序相关
    的头像 发表于 12-10 15:46 98次阅读

    芯片制造过程中的两种刻蚀方法

    本文简单介绍了芯片制造过程中的两种刻蚀方法   刻蚀(Etch)是芯片制造过程中相当重要的步骤。 刻蚀主要分为干刻蚀和湿法刻蚀。 ①干法刻蚀 利用等离子体将不要的材料去除。 ②湿法刻蚀 利用腐蚀性
    的头像 发表于 12-06 11:13 258次阅读
    芯片制造<b class='flag-5'>过程中</b>的两种刻蚀<b class='flag-5'>方法</b>

    LM5145在pre-bias启过程中的电压反灌问题

    电子发烧友网站提供《LM5145在pre-bias启过程中的电压反灌问题.pdf》资料免费下载
    发表于 09-27 10:19 0次下载
    LM5145在pre-bias启<b class='flag-5'>机</b><b class='flag-5'>过程中</b>的电压反灌问题

    触发器和状态机的关系是什么

    触发器和状态机在数字威廉希尔官方网站 设计中有着紧密的关系,它们共同构成了时序逻辑威廉希尔官方网站 的基础,用于实现数据的存储、处理和传输。
    的头像 发表于 08-12 11:24 456次阅读

    如何在FPGA实现状态机

    在FPGA(现场可编程门阵列)实现状态机是一种常见的做法,用于控制复杂的数字系统行为。状态机能够根据当前的输入和系统状态,决定下一步的动作和新的
    的头像 发表于 07-18 15:57 598次阅读

    玩转Spring状态机

    说起Spring状态机,大家很容易联想到这个状态机和设计模式状态模式的区别是啥呢?没错,Spring状态机就是
    的头像 发表于 06-25 14:21 950次阅读
    玩转Spring<b class='flag-5'>状态机</b>

    关于SMU状态机的问题求解

    我有一些关于 SMU 状态机的问题。 假设由于某种原因,SMU 已进入故障状态。 手册指出,要返回运行状态并将 FSP 恢复到无故障状态,应调用IfxSmu_releaseFSP()。
    发表于 05-29 08:18

    Verilog实现Moore型和Mealy型状态机方法简析

    编写能够被综合工具识别的状态机,首先需要理解状态机的基本概念和分类。状态机(FSM)是表示有限个状态以及在这些状态之间转换的逻辑结构。
    的头像 发表于 05-01 11:38 1604次阅读

    如何采用“状态机”解析UART数据帧

    如果一个系统接收上述“不定长度”的协议帧,将会有一个挑战--如何高效接收与解析。 为简化系统设计,我们强烈建议您采用“状态机”来解析UART数据帧。
    的头像 发表于 03-25 14:29 695次阅读
    如何采用“<b class='flag-5'>状态机</b>”解析UART数据帧

    什么是有限状态机?如何解决传统有限状态机状态爆炸」问题?

    有限状态机(Finite State Machine,简称FSM)是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列以及如何响应来自外界的各种事件。
    的头像 发表于 02-17 16:09 6244次阅读
    什么是有限<b class='flag-5'>状态机</b>?如何解决传统有限<b class='flag-5'>状态机</b>「<b class='flag-5'>状态</b>爆炸」问题?

    Verilog状态机+设计实例

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

    状态机该怎么监控

    状态机卡住的场景——通过状态跳转条件的DFX信号去判断卡住的原因
    的头像 发表于 01-15 10:03 419次阅读
    <b class='flag-5'>状态机</b>该怎么监控