博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有限状态机FSM的写法
阅读量:5174 次
发布时间:2019-06-13

本文共 1935 字,大约阅读时间需要 6 分钟。

  描述状态机推荐采用三段式FSM描述方法。这种写法使用3个always模块,一个always模块采用同步时序的方式描述状态转移,一个always采用组合逻辑的方式判断状态转移条件,描述状态转移规律,第三个always模块使用同步时序电路描述每个状态的输出。

  这种做法好处在于便于阅读、理解、维护,更重要的是利于综合器优化代码。利于用户添加合适的时序约束条件,利于布局布线器实现设计。

  三段式FSM写法参考如下程序:

module fsm(in1, in2, clk, rst_n, out1, out2, err);input        in1, in2;input        clk, rst_n;output        out1, out2;output        err;reg            out1, out2;reg            err;reg[2:0]    CS, NS;parameter[2:0]    IDLE    = 3'b000,                S1      = 3'b001,                S2       = 3'b010,                ERROR    = 3'B100;                //时序逻辑,状态转移always @(posedge clk or negedge rst_n)begin    if (!rst_n)        CS <= IDLE;    else        CS <= NS;end//组合逻辑,状态转移条件判断always @(rst_n, CS, in1, in2)begin    NS = 3'bX;        case (CS)        IDLE:        begin            if (!in1)          NS = IDLE;            if (in1 && in2)     NS = S1;            if (in1 && !in2)    NS = ERROR;        end        S1:        begin            if (!in2)           NS = S1;            if (in1 && in2)     NS = S2;            if (!in1 && in2)    NS = ERROR;        end        S2:        begin            if (in2)            NS = S2;            if (in1 && !in2)    NS = IDLE;            if (!in1 && !in2)   NS = ERROR;        end        ERROR:        begin            if (in1)            NS = ERROR;            if (!in1)           NS = IDLE;        end        default: NS = IDLE;    endcase;end//时序逻辑,状态机输出always @(posedge clk or negedge rst_n)begin    if (!rst_n)        {out1, out2, err} <= 3'b000;    else    begin        {out1, out2, err} <= 3'b000;        case (NS)            IDLE:     {out1, out2, err} <= 3'b000;            S1:       {out1, out2, err} <= 3'b100;            S2:       {out1, out2, err} <= 3'b010;            ERROR:    {out1, out2, err} <= 3'b111;            default: {out1, out2, err} <= 3'b000;        endcase    endendendmodule

 

转载于:https://www.cnblogs.com/chenman/archive/2013/05/03/3056016.html

你可能感兴趣的文章
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
有关快速幂取模
查看>>
NOI2018垫底记
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
(转)Tomcat 8 安装和配置、优化
查看>>
(转)Linxu磁盘体系知识介绍及磁盘介绍
查看>>
跨域问题整理
查看>>