数电和Verilog-时序逻辑实例四:状态机(三段式描述)

A.20 时序逻辑实例四:状态机(三段式描述)

什么叫做三段式描述的状态机?

三段,可以理解为三个always程序块。

(1)第一个always程序块

采用同步时序逻辑电路描述状态转移。

(2)第二个always程序块

采用组合逻辑电路判断状态转移条件并描述状态转移规律。

(3)第三个always程序块

采用同步时序逻辑将结果寄存后输出。

两者的区别是将原先第二个always程序块中对y和z的组合逻辑输出改为了第三个always块的时序逻辑的寄存输出

其实就这么简单,不少网络以及相关书籍上把它讲复杂了,甚至还给讲错了。

网络上随便搜索“三段式状态机”,基本给出的第三段always块的例子基本都是基于next_state输出的,很少看到有基于current_state输出的,这就形成了一种思维定势,认为三段式的第三段只能基于next_state描述,其实这是不对的。

应该说不管基于current_state还是next_state,目的都是要将最后输出的结果进行时钟同步后寄存器输出,并不拘泥于实现的形式,比如本节给出的例子中的第三个always块就并不是像书上和网络上那样都基于next_state来描述实现的。

这种错误的地方,除了网上以外,书本上要么没讲,要么提到的地方存在问题,至少我看到的地方有出现这种类似的错误,比如:EDA先锋工作室的《设计与验证Verilog HDL》就出现了这种错误。

下面用二段式改三段式的过程来给大家说明这两种描述方式的区别。

两段式改三段式过程

这是原本的两段式实现的代码:

//文件路径:a.19/src/sell.v
module sell(clk,rst_n,a,b,y,z);
  parameter S0 = 1'b0;
  parameter S1 = 1'b1;
  input clk;
  input rst_n;
  input a,b;
  output reg y,z;

  reg current_state;
  reg next_state;

  always@(posedge clk or negedge rst_n)begin
    if(!rst_n)
      current_state <= S0;
    else
      current_state <= next_state;
  end

  always@(current_state or a or b)begin
    y = 0;
    z = 0;
    case(current_state)
      S0: begin
        if((a == 1'b0) && (b == 1'b1))begin
          y = 1;
          next_state = S0;
        end
        else if((a == 1'b1) && (b == 1'b0))
          next_state = S1;
        else
          next_state = S0;
      end
      S1: begin
        if((a 
  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Verilog状态机三段式是指状态机Verilog写法中,将状态机的功能分为三个部分:状态转换逻辑、状态更新逻辑和输出逻辑。这种写法通常用于描述有限状态机的行为。状态转换逻辑决定下一个状态是什么,状态更新逻辑更新当前状态,而输出逻辑决定在每个状态下的输出信号。 引用提到了一段式、两段式和三段式状态机写法。这三种写法在速度、面积和代码可维护性等方面各有优劣。其中,三段式状态机的特点是将状态转换、状态更新和输出逻辑分别独立实现,使得代码更加清晰和易于理解。 引用指出,在网络上搜索"三段式状态机"时,大多数给出的例子都是基于next_state输出的,很少看到基于current_state输出的。这导致了一种思维定势,即认为三段式状态机的第三段只能基于next_state描述,实际上这是不正确的。 根据引用中的描述,Mealy型状态机是一种常见的状态机类型,其状态变化不仅取决于当前状态,还取决于当前输入条件。输出信号不仅取决于状态,还取决于输入信号。因此,在实现Mealy型状态机时,三段式写法可以更好地描述状态转换、状态更新和输出逻辑。 总结起来,Verilog状态机三段式是一种常见的描述有限状态机行为的写法,其中包括状态转换逻辑、状态更新逻辑和输出逻辑。这种写法能够提高代码的可读性和可维护性,并且能够灵活地适应不同类型的状态机,如Mealy型状态机。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [verilog 有限状态机的基本概念和三种写法介绍](https://blog.csdn.net/qq_39507748/article/details/108763514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [数电Verilog-时序逻辑实例状态机三段式描述)](https://blog.csdn.net/weixin_44915807/article/details/125001040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值