3032|2

113

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

有限状态机编写 [复制链接]

转自:ricky
网上看到一篇关于Finite State Machine (FSM) - 有限状态机的文章《有限状态机的VHDL优化设计》,写得挺详细,有些感想和经验记录于此:

1. 关于使用的语言 - VHDL和Verilog大同小异,想法是一样的,万变不离其宗。

2. 模板 - 大家都会讨论是一段两端还是三段。争执在两端和三段的情况时有发生。其实只要综合器能综合出设计者期望的电路,怎么写都无所谓。代码是给人看的,如果能让别人更容易读懂,就是好代码。我偏好两段,因为这样在察看代码时能一眼看出某一个state的跳出条件和输出信号。如果状态机的状态数很多,需要上下翻阅才能分别得知跳出条件和输出信号,真是太麻烦了。

3. 结构 - 当前状态用时钟驱动,next_state由组合逻辑生成,这些都是固定的。唯一可能有争议的是输出信号需不需要加寄存器打一拍?

不加寄存器的输出

输出由寄存器驱动
一般来说,如果是模块的输出,我会用寄存器打一拍,保证模块所有输出都由寄存器驱动(因为无法预测负载要经过多少级LUT才能到达下一级寄存器)。这样一来有个坏处:某个状态的输出信号要到下一个时钟才有效,而不是和state一起变化。在某些设计中这个限制会导致一些问题。因此如果是本模块自己使用的信号,我就不用寄存器打一拍了,只要布局布线后能满足Period约束就可以。

4. 状态转换输出 - 对于输出信号的赋值,通常会有两种状况:某个state时需要保持的输出;状态跳转的时候需要一个脉冲的输出。对于第二种输出要求,可以把输出信号写在状态跳转条件的if语句中。

[ 本帖最后由 FPGA小牛 于 2010-2-23 10:34 编辑 ]
此帖出自FPGA/CPLD论坛

最新回复

再顶你一下  详情 回复 发表于 2010-3-16 02:28
点赞 关注
个人签名FPGA技术交流
 

回复
举报

113

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

5. 我的模板

_SYNC_PROC: process ()
   begin
      if ('event and = '1') then
         if ( = '1') then
            _state <= st1_;
            -- Output signals here will have one clock delay of the
             <= '0';
             <= '0';

         else
            _state <= _next_state;
             <= _c;
             <= _c;

         -- assign other outputs to internal signals

         end if;        
      end if;
   end process;


   _NEXT_STATE_DECODE: process (_state, , , ...)
   begin
      --declare default state for next_state to avoid latches
      _next_state <= _state;  
      -- default is to stay in current state
      -- so there are no else branch in the if statement
      case (_state) is
         when _st1_ =>
            -- State Change Condition
            if = '1' then
               _next_state <= _st2_;
               -- Internal Output can put here
               -- Only occur on state transaction (next_state changed but state not changed)
               -- If output need to assert at first cycle of one state,
               -- we can delay this output one clock in _SYNC_PROC process
            end if;
            -- Internal Output can put here
            -- This output will be asserted till state change

         when _st2_ =>
            if = '1' then
               _next_state <= _st3_;
            end if;
         when _st3_ =>
            _next_state <= _st1_;
         when others =>
            _next_state <= _st1_;
      end case;      
   end process;
此帖出自FPGA/CPLD论坛
个人签名FPGA技术交流
 
 

回复

82

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

顶你一下

再顶你一下
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表