![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| FPGA设计要点之二:FSM | |||||
作者:Free 文章来源:Free 点击数: 更新时间:2008-1-3 ![]() |
|||||
|
关于上期的时钟树,可能说的不是很确切。这里的时钟树实际上泛指时钟方案,主要是时钟域和PLL等的规划,一般情况下不牵扯到走线时延的详细计算(一般都走全局时钟网络和局部时钟网络,时延固定),和ASIC中的时钟树不一样。对于ASIC,就必须对时钟网络的设计、布线、时延计算进行仔细的分析计算才行。 FSM:有限状态机。这个可以说时逻辑设计的基础。几乎稍微大一点的逻辑设计,几乎都能看得到FSM。 FSM分为moore型和merly型,moore型的状态迁移和变量无关,merly型则有关。实际使用中大部分都采用merly型。 FSM通常有2种写法:单进程、双进程。 初学者往往喜欢单进程写法,格式如下: always @( posedge clk or posedge rst ) begin if ( rst == 1'b1 ) FSM_status <= ......; else case ( FSM_status ) ......; endcase end 简单的说,单进程FSM就是把所有的同步、异步处理都放入一个always中。 优点: 1)看起来比较简单明了,写起来也不用在每个case分支或者if分支中写全对各个信号和状态信号的处理。也可以简单在其中加入一些计数器进行计数处理。 2)所有的输出信号都已经是经过D触发器锁存了。 缺点: 1)优化效果不佳。由于同步、异步放在一起,编译器一般对异步逻辑的优化效果最好。单进程FSM把同步、异步混杂在一起的结果就是导致编译器优化效果差,往往导致逻辑速度慢、资源消耗多。 2)某些时候需要更快的信号输出,不必经过D触发器锁存,这时单进程FSM的处理就比较麻烦了。 双进程FSM,格式如下: always @( posedge clk or posedge rst ) begin if ( rst == 1'b1 ) FSM_status_current <= ...; else FSM_status_current <= FSM_status_next; always @(*) begin case ( FSM_status_current ) FSM_status_next = ......; endcase end 从上面可以看到,同步处理和异步处理分别放到2个always中。其中FSM状态变量也采用2个来进行控制。双进程FSM的原理我这里就不多说了,在很多逻辑设计书中都有介绍。这里描述起来太费劲。 优点: 1)编译器优化效果明显,可以得到很理想的速度和资源占用率。 2)所有的输出信号(除了FSM_status_current)都是组合输出的,比单进程FSM快。 缺点: 1)所有的输出信号(除了FSM_status_current)都是组合输出的,在某些场合需要额外写代码来进行锁存。 2)在异步处理的always中,所有的if、case分支必须把所有的输出信号都赋值,而且不能出现在FSM中的输出信号回送赋值给本FSM中的其他信号的情况,否则会出现 latch。 latch会导致如下问题: 1)功能仿真结果和后仿不符; 2)出现无法测试的逻辑; 3)逻辑工作不稳定,特别是latch部分对毛刺异常敏感; 4)某些及其特殊的情况下,如果出现正反馈,可能会导致灾难性的后果。 这不是恐吓也不是开玩笑,我就亲眼见过一个小伙把他做的逻辑加载上去后,整个FPGA给炸飞了。后来怀疑可能是出现正反馈导致高频振荡,最后导致芯片过热炸掉(这个FPGA芯片没有安装散热片)。 |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|