集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2083|回复: 4

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

[复制链接]
乡下乖乖女 发表于 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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 16:57 , Processed in 0.068312 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表