加载中…
正文 字体大小:

至简设计法中的四段式状态机

(2017-02-16 11:26:11)
标签:

明德扬

至简设计法

状态机

分类: 明德扬---至简设计法

四段式状态机

明德扬科技教育有限公司


  网:www.mdy-edu.com

  宝:mdy-edu.taobao.com

QQ  群:97925396


至简设计法中的四段式状态机视频:http://www.mdy-edu.com/article_cat/video?id=24

FPGA中,相信有FPGA学习经验的都能了解,现在流行的状态机设计,一般可分为一段式、两段式和三段式,如果不了解的,可以自行百度。

上面的三种设计法虽然很流行,但设计时仍然要考虑很多因素,导致总是要反反复复调试才能设计成功。这不符合明德扬一次考虑一个因素、一次性设计正确的设计理念。为此,明德扬特推出四段式状态机的写法。


四段式不是指三个always代码,而是四段程序。使用四段式的写法,可参照明德扬GVIM特色指令Ztj产生的状态机模板。

第一段,同步时序的always模块,格式化描述次态迁移到现态寄存器。

1

2

3

4

5

6

7

8

always@(posedge clk or negedge rst_n)begin

    if(!rst_n)begin

        state_c <= IDLE;

    end

    else begin

        state_c <= state_n;

    end

end

 

第二段,组合逻辑的always模块,描述状态转移条件判断。注意转移条件用信号来表示,信号名要按明德扬规则来命名。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

always@(*)begin

    case(state_c)

        IDLE:begin

            if(idle2s1_start)begin

                state_n = S1;

            end

            else begin

                state_n = state_c;

            end

        end

        S1:begin

            if(s12s2_start)begin

                state_n = S2;

            end

            else begin

                state_n = state_c;

            end

        end

        S2:begin

            if(s22idl)begin

                state_n = IDLE;

            end

            else begin

                state_n = state_c;

            end

        end

        default:begin

            state_n = IDLE;

        end

    endcase

end

 

assign idle2s1_start = state_c==IDLE && ;

assign s12s2_start  = state_c==S1   && ;

assign s22idl_start  = state_c==S2   && ;

 

第三段,用assign定义转移条件。注意条件一定要加上现态。

1

2

3

assign idle2s1_start = state_c==IDLE && ;

assign s12s2_start  = state_c==S1   && ;

assign s22idl_start  = state_c==S2   && ;

 

第四段,设计输出信号。明德扬规范要求一个always设计一个信号,因此有多少个输出信号,就有多少个always

1

2

3

4

5

6

7

8

9

10

11

always  @(posedge clk or negedge rst_n)begin

    if(!rst_n)begin

        out1 <=1'b0  

    end

    else if(state_c==S1)begin

        out1 <= 1'b1;

    end

    else begin

        out1 <= 1'b0;

    end

end

 

 

明德扬四段式状态机符合一次只考虑一个因素的设计理念。第一段代码,照抄格式,完全不用想其他的。第二段代码,只考虑状态之间的跳转,也就是说各个状态机之间跳转关系。第三段代码,只考虑跳转条件。第三段,每个信号逐个设计。

明德扬为了保证一次设计正确,还制定了一些规范。例如第二段的跳转条件,只准用信号名代替,并且制定了跳转条件的命名规范,1是解决了命名困难的问题,2是对转移条件一目了然,如idl2s1_start,就可以看出是IDLE跳到S1状态的条件。 还有,明德扬规定转移条件的格式,一定是“ 当前状态&&具体条件”,以防想不到的情况出现。有了这些规范的保证,无论多复杂的场合,任何设计都能有条理、有步骤地一次性设计正确。

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

       

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有