找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 164|回复: 5
打印 上一主题 下一主题

明德扬最新分享---FPGA设计新技巧:四段式状态机

[复制链接]

7

主题

15

帖子

95

积分

二级会员(20)

Rank: 2Rank: 2

积分
95
跳转到指定楼层
1#
发表于 2017-2-14 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

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

x
四段式状态机

# D; A3 k& ^$ b
在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 k3 G1 W" h7 b2 ], y" g8 k& _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

5

主题

330

帖子

899

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
899
2#
发表于 2017-2-15 08:21 | 只看该作者
谢谢分享,学习了

点评

本次分享的主题是《如何阅读他人代码》。无论是学习,还是工作,阅读他人代码都是必不可少的。如果有注释还好,没有注释或者不规范的代码,绝对会让人头疼。本次公开课,将现场如何阅读他人代码,学好几招,必定终身  详情 回复 发表于 2017-11-29 16:03

3

主题

135

帖子

2203

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2203
3#
发表于 2017-11-25 20:50 | 只看该作者
支持你一下下。。

点评

本次分享的主题是《如何阅读他人代码》。无论是学习,还是工作,阅读他人代码都是必不可少的。如果有注释还好,没有注释或者不规范的代码,绝对会让人头疼。本次公开课,将现场如何阅读他人代码,学好几招,必定终身  详情 回复 发表于 2017-11-29 16:03

7

主题

15

帖子

95

积分

二级会员(20)

Rank: 2Rank: 2

积分
95
4#
 楼主| 发表于 2017-11-29 16:03 | 只看该作者
gn165625076 发表于 2017-2-15 08:21
7 l& p% h" s! Z: Q- m, K谢谢分享,学习了
: B6 ]2 U# {3 E4 ~3 l5 x/ s3 e
本次分享的主题是《如何阅读他人代码》。无论是学习,还是工作,阅读他人代码都是必不可少的。如果有注释还好,没有注释或者不规范的代码,绝对会让人头疼。本次公开课,将现场如何阅读他人代码,学好几招,必定终身受用。 如果想参加,请加公开课群:29,14,47,47,0! s8 R2 _. Z8 u1 H* ~

7

主题

15

帖子

95

积分

二级会员(20)

Rank: 2Rank: 2

积分
95
5#
 楼主| 发表于 2017-11-29 16:03 | 只看该作者
f__liu 发表于 2017-11-25 20:50
' |! W/ @" x9 `支持你一下下。。
# u5 |  b! [7 f. i+ {8 T3 M2 F
本次分享的主题是《如何阅读他人代码》。无论是学习,还是工作,阅读他人代码都是必不可少的。如果有注释还好,没有注释或者不规范的代码,绝对会让人头疼。本次公开课,将现场如何阅读他人代码,学好几招,必定终身受用。 如果想参加,请加公开课群:29,14,47,47,0  z% r# R' w5 A/ h0 u7 W

0

主题

15

帖子

6

积分

初级新手(9)

Rank: 1

积分
6
6#
发表于 2018-4-12 23:14 | 只看该作者
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-1-31 07:14 , Processed in 0.065210 second(s), 37 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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