乡下乖乖女 发表于 2010-6-26 01:09:56

这种情况能不能使用状态机?

本帖最后由 fpgaw 于 2010-11-19 09:41 编辑

假设这么一种情形:一次完整的操作需要分为1,2,3,4四步完成,每个步骤都需要若干个时钟完成,而且只有当1完成后才能进行2操作,2完成后才能进行3操作,3完成才能进行4操作,4完成后才能返回1操作。也就是这四个步骤必须严格的顺序执行。 下面是我的思路,不知道可行否,或者有什么问题,希望大家指点一下。
四个状态分别使用onehot, S1 = 0001, S2 = 0010, S3 = 0100, S4 = 1000;1步骤开始信号S1_EN, 完成的标志信号S1_OK;2步骤开始信号S2_EN, 完成的标志S2_OK; 3步骤开始信号S1_EN, 完成的标志S3_OK;4步骤开始信号S4_EN, 完成的标志信号S4_OK。状态机的输入信号:S1_OK, S2_OK, S3_OK, S4_OK。输出信号:S1_EN ,S2_EN S3_EN ,S4_EN。代码如下:

always@(current_state or S1_OK or S2_OK or S3_OK or S4_OK)
begin
    S1_EN = 0;
    S2_EN = 0;
    S3_EN = 0;
    S4_EN = 0;
    case(current_state)
      S1:begin
         S1_EN = 1;
         if (S1_OK == 1)
         next_state = S2;
         else
         next_state = S1;
       end
      S2: begin
         S2_EN = 1;
         if (S2_OK == 1)
         next_state = S3;
         else
         next_state = S2;
      end
      S3: begin
         S3_EN = 1;
         if (S3_OK == 1)
         next_state = S4;
         else
         next_state = S3;
      end
      S4: begin
         S4_EN = 1;
         if (S4_OK == 1)
         next_state = S1;
         else
         next_state = S4;
      end
   default: next_sate = S1;
    endcase
end

always @(posedge clkornegedge rst)
if (!rst)
current_state <= S1;
else
current_state <= next_state;

绿豆宝贝 发表于 2010-6-26 03:08:35

你要实现的是比较常见的状态转移。典型的状态机。不过在你的程序体中最好加入一个初始状态,这样比较好。<br>
<br>
[ 本帖最后由 waiwai788 于 2009-5-23 08:55 编辑 ]

蓝雪 发表于 2010-6-26 03:33:46

理论上数字系统都可以用状态机来实现

蓦然囙首 发表于 2010-6-26 04:29:46

好东西按时大法师东方时代

Sunlife 发表于 2015-6-28 10:21:21

你要实现的是比较常见的状态转移。典型的状态机。不过在你的程序体中最好加入一个初始状态,这样比较好
页: [1]
查看完整版本: 这种情况能不能使用状态机?