verilog状态机的三种写法

1,单always块结构(一段式):
always @(posedge clk ) begin
case(FSM)
st0;begin
out0;//输出
if(case0) FSM<=st1;//状态转移
end
st1;begin
out1;//输出
if(case0) FSM<=st2;//状态转移
end
……
default:
endcase
end
单always块把组合逻辑和时序逻辑放在一个时序always块描述。输出时为寄存器输出,所以无毛刺。但是这种方式会产生多余的触发器(因为把组合逻辑也放在时序逻辑中实现),而且代码难以修改调试。但对于那些简单的状态机,一段式还是不错的,因为它把输入,转移,输出一起体现,更方便理解。但是对于复杂状态机就是灾难了,所以最好还是养成不使用该结构的习惯。
 
双always块结构(两段式):
//时序逻辑,这段一般是不变的,描述从现态转移到次态
always @ (posedge clk) begin
current_state<=next_state;
end
 
//组合逻辑,包括转移条件以及状态内容(即输出)
always @ (*) begin
case(current_state)
st0:begin
out0;
if(case0) FSM=st1; //组合逻辑使用阻塞语句
end
st1:begin
out1;
if(case1) FSM=st2;
end
……
endcase
end
二段式中,一个always块采用同步时序描述状态转移;另一个采用组合逻辑判断转移条件,以及描述输出。二段式便于阅读,理解和维护,有利于综合器优化代码。但是由于采用的是组合逻辑输出,容易产生毛刺,且不利于约束,也不利于综合器和布局布线器实现高性能设计。
 
三always块结构(三段式):
 
//第一个always块,时序逻辑,描述现态转移到次态
always @ (posedge clk negedge rst_n) begin
if(!rst_n)  current_state<=IDLE;
else      current_state<=next_state;
end
 
//第二个always块,组合逻辑,描述状态转移的条件
always @ (current_state) begin
case(current_state)
s1:if(……) next_state=s2;//组合逻辑,采用阻塞赋值
……
endcase
end
 
//第三个always块,时序逻辑,描述输出
always @ (posedge clk negedge rst_n) begin
case(next_state) //这里有的是next_state,有的是current_state,需根据电路要求
s1: out1<=……;
s2: out2<=……;
default:……
endcase
end
三段式结构中,2个时序always块分别用来描述现态逻辑转移,及输出赋值。组合always块用于描述状态转移的条件。这种结构是寄存器输出,输出无毛刺,而且代码更清晰易读,特别是对于复杂的状态机来说,但是消耗的面积也更多点。这是一种比较流行的状态机结构。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值