• 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块用于描述状态转移的条件。这种结构是寄存器输出,输出无毛刺,而且代码更清晰易读,特别是对于复杂的状态机来说,但是消耗的面积也更多点。这是一种比较流行的状态机结构。

  • 相关阅读:
    斐波那契数列
    进制转换为伪代码
    python模拟进程
    第十一周学习总结
    第十周学习总结
    第九周学习总结
    俄罗斯方块
    熟悉编程语言
    小学四则运算
    第八周学习总结
  • 原文地址:https://www.cnblogs.com/flyuea/p/8421939.html
Copyright © 2020-2023  润新知