原创 FPGA设计要点之二:FSM

2006-11-24 22:44 5704 6 11 分类: FPGA/CPLD

很开心,终于有回复了!


工作一直很忙,只能时不时的抽空上来写点东西了。


关于上期的时钟树,可能说的不是很确切。这里的时钟树实际上泛指时钟方案,主要是时钟域和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芯片没有安装散热片)。


 

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户1416546 2007-4-13 09:51

ccd 怎么找不到

用户59939 2006-12-22 10:20

 现在正在进行一个接口的设计,就是FPGA和DSP的hpi接口的通信的设计,想请教了FSM的应用,自己真的还没有写过这么系统的程序,这是第一次,真是有点摸不着头脑呀!希望,大侠有空可以聊聊哈!
   qq
:30425632

用户827255 2006-11-28 10:56

应该是  组合逻辑和时序逻辑分开,

同步 异步 是什么意思?

 

ash_riple_768180695 2006-11-27 13:39

个人认为,双进程的还是好一些,可以把输出逻辑那个进程改为寄存器输出(输出锁存),这样还可以避免触发列表中漏写哪个信号,直接一个always  @( posedge clk or posedge rst )就行了。

不知道博主用没用过StateCAD,我在这里借宝地宣传一下。这个小工具把我们数电课上学到的状态跳转图直接转化为HDL,而且可以设置编码风格和输出方式,功能很强大,用法也很简单。我的几个项目都是用这个工具完成的。这个工具是一个真正的“可执行的文档”。

ash_riple_768180695 2006-11-27 13:31

太好了,博主一定是这方面的牛人。投你一票。

用户61970 2006-11-24 22:45

补充一点:单进程FSM是不会产生latch的。

相关推荐阅读
用户61970 2007-08-14 00:46
有问题大家发邮件给我吧!
现在预计到9月底也没有太多的时间写blog文章了。计划赶不上变化啊,由于需求变更,现在我是指导上板调试一个版本,编码调试一个临时版本,指导设计一个新版本。每个版本的代码行都有35K,彻底晕菜……。具体...
用户61970 2007-06-10 23:13
好久没有上来,给大家先道个谦
现在这个项目实在是累人,进度紧、难度大就不说了,还经常发生需求变动,幸好不是大的变动,不然真的要死人了……终于在本周完成了所有的代码和UT,统计结果吓了一跳,居然总代码行数到了6W多。由于时间太近,U...
用户61970 2007-02-04 22:36
静态时序分析:Tsu、Tco
首先需要注意的是,这里讨论的都是静态时序分析。所谓静态时序分析,就是只针对FPGA内部布线后生成的实际布线结果来计算理论时序,同时采用的模型为理论模型。静态时序分析并不能完全分析和解决实际运行中的所有...
用户61970 2007-01-10 22:47
问题答复
to yangss2006:我的邮箱:fy2kdonews@yahoo.com.cn,欢迎大家发邮件。init_flag信号是FPGA来产生的吗?如果是,可以用下面的方式来产生:always @( p...
用户61970 2007-01-01 23:32
大家提的一些问题的答复
最近刚忙完一个老逻辑项目的优化工作,把性能提升了一倍。节后马上又要开始一个新项目,难度很大,带宽有10G,6月份就要完工。估计元旦后的空闲时间又不多了,请大家谅解。to riple:时序分析和约束是一...
用户61970 2006-12-11 23:13
希望大家在回复中多提问题
最近2周一直在忙一个逻辑优化工作,总共写了5000多行,外加所有的单元仿真和系统仿真。好累!现在要做系统仿真和上板测试了,估计最近2周晚上也没有空来更新了。另外,请大家在回复中提出自己关心的问题,我可...
我要评论
5
6
关闭 站长推荐上一条 /3 下一条