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
    +关注

    关注

    29

    文章

    1367

    浏览量

    112433
  • 状态机
    +关注

    关注

    2

    文章

    493

    浏览量

    28327

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问如何在FX10上使用GPIF III状态机 *.h 文件?

    LVCMOS 2 位 SlaveFIFO GPIF III 状态机的演示中有一个 cy_gpif_header_lvcmos.h 文件。 我想知道如何使用.h文件,只需放入.h文件放入 FX10 项目? 您有它的用户指南文档吗?
    发表于 07-16 08:17

    NVMe高速传输之摆脱XDMA设计之八:PCIe初始化状态机设计

    PCIe配置初始化状态机实现PCIe设备枚举和配置空间初始化过程,在完成链路训练后,使用DFS(深度优先搜索)算法枚举PCIe总线上的设备,完成PCIe总线域的地址分配和设备的初始化。PCIe配置
    发表于 07-05 22:00

    超声波清洗如何在清洗过程中减少废液和对环境的影响?

    超声波清洗如何在清洗过程中减少废液和对环境的影响随着环保意识的增强,清洗过程中的废液处理和环境保护变得越来越重要。超声波清洗作为一种高效的清洗技术,也在不断发展以减少废液生成和对环
    的头像 发表于 06-16 17:01 ?253次阅读
    超声波清洗<b class='flag-5'>机</b>如何在清洗<b class='flag-5'>过程中</b>减少废液和对环境的影响?

    有可能在 FX3 GPIF2 创建两个独立的状态机吗?

    我想,如果我想通过 FX3 GPIF2 创建两个独立的传输流接口,我需要在 GPIF2 设计器创建两个独立的状态机,我是否有可能在 GPIF2 设计器创建两个独立的状态机
    发表于 05-20 06:14

    求助,关于srammaster.cydsn状态机的问题求解

    晚上好。 我目前正在学习 GPIF II。 查看..EZ-USB FX3 SDK1.3firmwaregpif_examplescyfxsrammastersrammaster.cydsn状态机,有状态START和START
    发表于 05-12 06:20

    在linux下开发过程中, DLP4500 GUI无法连接光怎么解决?

    在linux下开发过程中, DLP4500 GUI 无法连接光,出现错误提示如下: open device_handle error: Is a directory opening path
    发表于 02-20 08:41

    在测试过程中,如何防止电池挤压试验的故障率?

    在测试过程中,防止电池挤压试验故障率的关键在于设备的使用、维护和保养。以下是一些具体的方法和建议: 一、正确使用设备 熟悉操作规程 · 操作人员必须熟读并理解电池挤压试验的操作规程
    的头像 发表于 01-10 08:55 ?396次阅读
    在测试<b class='flag-5'>过程中</b>,如何防止电池挤压试验<b class='flag-5'>机</b>的故障率?

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

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

    Verilog 与 ASIC 设计的关系 Verilog 代码优化技巧

    Circuit,专用集成电路)设计是一个复杂的过程,涉及到逻辑设计、综合、布局布线、物理验证等多个环节。在这个过程中Verilog被用来描述数字电路的行为和结构,进而实现ASIC的设计。 具体来说
    的头像 发表于 12-17 09:52 ?1105次阅读

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

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

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

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

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

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

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

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

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

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

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

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