在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5142|回复: 3

嵌套状态机如何用三段式书写

[复制链接]
发表于 2009-10-12 15:19:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
RT,小弟最近在学习状态机的三段式书写,单个状态机还能写出来,但是碰到带嵌套的状态机就不晓得怎么写了,例如下面这个状态机(夏宇文书上的一个例子),如何改写成三段式状态机呢?

该例是一个简化的EPROM的串行写入器。事实上,它是一个EPROM读写器设计中实现写功能的部分经删节得到的,去除了EPROM的启动、结束和EPROM控制字的写入等功能,只具备这样一个雏形。工作的步骤是:1.地址的串行写入;2.数据的串行写入;3.给信号源应答,信号源给出下一个操作对象;4.结束写操作。通过移位令并行数据得以一位一位输出。
模块源代码:
module writing(reset,clk,address,data,sda,ack);
  input reset,clk;
  input[7:0] data,address;
  output sda,ack; //sda负责串行数据输出;
           //ack是一个对象操作完毕后,模块给出的应答信号。
  reg link_write; //link_write 决定何时输出。
  reg[3:0] state; //主状态机的状态字。
  reg[4:0] sh8out_state; //从状态机的状态字。
  reg[7:0] sh8out_buf;    //输入数据缓冲。
  reg finish_F;           //用以判断是否处理完一个操作对象。
  reg ack;
  parameter
    idle=0,addr_write=1,data_write=2,stop_ack=3;
  parameter
    bit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8;
  assign   sda = link_write? sh8out_buf[7] : 1'bz;
  always @(posedge clk)
    begin
        if(!reset)               //复位。
          begin
             link_write<= 0;
             state    <= idle;
             finish_F <= 0;
             sh8out_state<=idle;
                   ack<= 0;
             sh8out_buf<=0;
          end
        else
          case(state)
          idle:                     
            begin
                link_write  <= 0;
               state    <= idle;
               finish_F <= 0;
               sh8out_state<=idle;
                     ack<= 0;
               sh8out_buf<=address;
              state    <= addr_write;
            end
          addr_write:         //地址的输入。
            begin
                if(finish_F==0)
                  begin  shift8_out; end
                else
                  begin
                     sh8out_state <= idle;
                     sh8out_buf   <= data;
                            state <= data_write;
                         finish_F <= 0;
                  end
            end
          data_write:       //数据的写入。
            begin
                if(finish_F==0)
                  begin  shift8_out; end
                else
                  begin
                      link_write <= 0;
                           state <= stop_ack;
                        finish_F <= 0;
                             ack <= 1;
                  end
            end   
          stop_ack:             //完成应答。
            begin
                  ack <= 0;
              state <= idle;
            end

          endcase      
    end                          
task shift8_out;                //串行写入。
  begin
     case(sh8out_state)
     idle:
       begin
           link_write  <= 1;
          sh8out_state <= bit0;
        end
     bit0:
       begin
           link_write <= 1;
         sh8out_state <= bit1;                                
           sh8out_buf <= sh8out_buf<<1;
       end
     bit1:
       begin
         sh8out_state<=bit2;
         sh8out_buf<=sh8out_buf<<1;
       end
     bit2:
       begin
         sh8out_state<=bit3;
         sh8out_buf<=sh8out_buf<<1;
       end
     bit3:
       begin
         sh8out_state<=bit4;
         sh8out_buf<=sh8out_buf<<1;
       end
     bit4:
       begin
         sh8out_state<=bit5;
         sh8out_buf<=sh8out_buf<<1;
       end

     bit5:
       begin
         sh8out_state<=bit6;
         sh8out_buf<=sh8out_buf<<1;
       end
     bit6:
       begin
         sh8out_state<=bit7;
         sh8out_buf<=sh8out_buf<<1;
       end
     bit7:
       begin
         link_write<= 0;
         finish_F<=finish_F+1;                              
       end

     endcase
  end
endtask
endmodule         

跪请高手指教,小弟万分感激~
发表于 2010-12-5 10:51:00 | 显示全部楼层
发表于 2011-5-13 21:35:19 | 显示全部楼层
同想学习嵌套的状态机
发表于 2011-5-14 09:00:32 | 显示全部楼层
没仔细看你的程序 一般是这么写的
state a b c d
next state :state
sub_state:1,2,3
在a状态后进入sub_state,此时next state =b,执行完毕sub_state后state =next state,以此类推实现串行操作,没按照语法写,但你应该明白了吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-24 22:42 , Processed in 0.024077 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表