ICE 发表于 2010-6-26 01:59:38

[求助]状态机嵌套如何实现?

本帖最后由 fpgaw 于 2010-11-18 16:16 编辑

才学会标准状态机的3个process格式书写规范:
module fsm_cc8_3r
(output reg y1, y2, y3,
input jmp, go, sk0, sk1, clk, rst_n);

parameter S0 = 4'b0000,
      S1 = 4'b0001,
      S2 = 4'b0010,
      S3 = 4'b0011,
      S4 = 4'b0100,
      S5 = 4'b0101,
      S6 = 4'b0110,
      S7 = 4'b0111,
      S8 = 4'b1000,
      S9 = 4'b1001;
reg state, next;

always @(posedge clk or negedge rst_n)
    if (!rst_n) state <= S0;
    else state <= next;

always @(state or jmp or go or sk0 or sk1)
begin
    next = 4'bx;
    case (state)
    S0 : if (!go) next = S0;
      else if (jmp) next = S3;
      else next = S1;
    S1 : if (jmp) next = S3;
      else next = S2;
    S2 : if (jmp) next = S3;
      else next = S9;
    S3 : if (jmp) next = S3;
      else next = S4;
    S4 : if (jmp) next = S3;
      else if (sk0 && !jmp) next = S6;
      else next = S5;
    S5 : if (jmp) next = S3;
      else if (!sk1 && !sk0 && !jmp) next = S6;
      else if (!sk1 && sk0 && !jmp) next = S7;
      else if ( sk1 && !sk0 && !jmp) next = S8;
      else next = S9;
    S6 : if (jmp) next = S3;
      else if (go && !jmp) next = S7;
      else next = S6;
    S7 : if (jmp) next = S3;
      else next = S8;
    S8 : if (jmp) next = S3;
      else next = S9;
    S9 : if (jmp) next = S3;
      else next = S0;
    endcase
end

always @(posedge clk or negedge rst_n)
    if (!rst_n) begin
      y1 <= 1'b0;
      y2 <= 1'b0;
      y3 <= 1'b0;
    end
    else begin
      y1 <= 1'b0;
      y2 <= 1'b0;
      y3 <= 1'b0;
      case (next)
            S0, S2, S4, S5 : ; // default outputs
            S7 : y3 <= 1'b1;
            S1 : y2 <= 1'b1;
            S3 : begin
                y1 <= 1'b1;
                y2 <= 1'b1;
            end
            S8 : begin
                y2 <= 1'b1;
                y3 <= 1'b1;
            end
            S6, S9 : begin
                y1 <= 1'b1;
                y2 <= 1'b1;
                y3 <= 1'b1;
            end
      endcase
    end

endmodule
这是从一篇讲状态机编写规范的pdf里面找到的。但是没有提及如何做多状态机的嵌套(比如说母状态机与子状态机的分割设计)。想问一下如果按照3个process书写规范来做的话,应该如何做一个多状态机的嵌套?

interi 发表于 2010-6-26 03:15:10

uppppppppppp<br>
就是如何将一个大的状态机拆分为一个母状态机和几个小的子状态机的推荐或者常见的写法的问题。

ups 发表于 2010-6-26 05:14:16

听说可以实现状态机的嵌套,不过没有看到过,也很想知道这方面实现需要注意的问题。顶!!!

longtime 发表于 2010-6-26 06:25:34

顶!!! <br>
顶!!!

ups 发表于 2010-6-26 07:13:29

不知道,帮你顶。期盼大牛..........

longt 发表于 2010-6-26 08:37:25

搬个凳子,期待大侠!

interig 发表于 2010-6-26 09:22:51

设标志位和握手信号

CHAN 发表于 2010-6-26 09:55:43

To wanghai:<br>
如何设定呢?有没有比较好的参考设计可以看看啊?

longtime 发表于 2010-6-26 10:31:23

期盼高人。。。

ATA 发表于 2010-6-26 12:21:41

我这几天就在做类似的问题,前几天我也在论坛上面发帖子问主从状态机的问题,后来我问到别人,又试了一下,简要写下主从状态机的实现方法:<br>
假如主状态机如下(A,B,C,D代表不同的状态):<br>
A----&gt;B-----&gt;C------&gt;D------&gt;A<br>
主状态机实现了状态的循环移动,现在我们假设C这个状态下面需要嵌套一个从状态机,假设从状态机如下:<br>
SA-----&gt;SB------&gt;SC-----&gt;SD--------&gt;SA<br>
在这里面,主状态进入C之后,立即给一个enable信号,启动从状态机,这个时候设置一个从状态机的完成信号finish(高电平有效),在主状态机里面,最开始初始化的时候设置finish为低,然后主状态机里面一直不停的检测这个finish信号,当finish信号为高的时侯,就进入下一个主状态。<br>
再来说从状态机,SA里面首先也作一个不停的检测,即检测enable信号,当检测到enable信号到来的时候,从状态机启动,进入SB,于是从状态机开始工作,等到从状态机运行结束之后,finish信号置高,从状态机完成,从状态机回到SA状态,重新检测下一个enable信号的到来。<br>
这样做的话,就要求enable信号是一个脉冲信号(至于如何实现脉冲信号,我就不多说了)。enable和finish信号仅仅用于连接两个状态机。<br>
最后,我还想说,其实enable和finish似乎可以不用脉冲信号,用电平信号也应该可以,原理大体相同,就开如何置位了。<br>
不知道我说清楚没有
页: [1] 2
查看完整版本: [求助]状态机嵌套如何实现?