广告

两段式状态机不可能完成的任务

2011-4-11 14:33 4279 0 21 分类: FPGA/CPLD

两段式状态机不可能完成的任务


         最近折腾状态机,发现一个小任务对于两段式状态机写法是不可能完成的。这个小任务很简单,先看用一段式状态机实现的代码:


module test(


            clk,rst_n,


            din,dout


        );


 


input clk;


input rst_n;   


input din;


output[3:0] dout;  


 


parameter IDLE  = 3'd0;


parameter STA1  = 3'd1;


 


//一段式写法


reg[2:0] cstate;


reg[3:0] cnt;


 


always @(posedge clk or negedge rst_n)


    if(!rst_n) cstate <= IDLE;


    else begin


        case(cstate)


            IDLE: begin


                    cnt <= 4'd0;


                    if(din) cstate <= STA1;


                    else cstate <= IDLE;       


                end


            STA1: begin


                    cnt <= cnt+1'b1;


                    if(cnt == 4'd10) cstate <= IDLE;


                    else cstate <= STA1;


                end


            default: cstate <= IDLE;


        endcase


    end


 


assign dout = cnt;


 


endmodule


         同样的,用三段式状态机也能够实现这个功能:


//三段式写法


reg[2:0] cstate,nstate;


reg[3:0] cnt;


 


always @(posedge clk or negedge rst_n)


    if(!rst_n) cstate <= IDLE;


    else cstate <= nstate;


 


always @(cstate or din or cnt) begin


    case(cstate)


        IDLE:   if(din) nstate = STA1;


                else nstate = IDLE;    


        STA1:   if(cnt == 4'd10) nstate = IDLE;


                else nstate = STA1;


        default: nstate = IDLE;


    endcase


end


 


always @(posedge clk or negedge rst_n)


    if(!rst_n) cnt <= 4'd0;


    else begin


        case(nstate)


            IDLE:   cnt <= 4'd0;


            STA1:   cnt <= cnt+1'b1;


            default: ;


        endcase


    end


         严格来看,上面的三段式状态机相比于一段式会滞后一个时钟周期。但是我们的重点不在这里,大家大可以不必钻这个牛角尖。另外,这个实例实现的功能本身也没有什么意义,当然也是可以用别的更简单(不需要状态机)的方式实现,但是你可以想象成这是实际应用中状态机各种复杂输出的一部分。


         而如果大家希望用两段式状态机实现这个功能,或许会这么写:


//两段式写法


reg[2:0] cstate,nstate;


reg[3:0] cnt;


 


always @(posedge clk or negedge rst_n)


    if(!rst_n) cstate <= IDLE;


    else cstate <= nstate;


 


always @(cstate or din or cnt) begin


    case(cstate)


        IDLE: begin


                cnt = 4'd0;


                if(din) nstate = STA1;


                else nstate = IDLE;    


            end


        STA1: begin


                cnt = cnt+1'b1;


                if(cnt == 4'd10) nstate = IDLE;


                else nstate = STA1;


            end


        default: nstate = IDLE;


    endcase


end


         如果大家有兴趣对三中代码方式都做一下仿真,会发现一些有意思的问题,尤其两段式状态机最终根本无法退出STA1,计数器cnt也会死在那里。究其根本原因,可大有学问。在编译工程后,出现了数条类似下面的warning:


Warning: Found combinational loop of 2 nodes


    Warning: Node "Add0~2"


    Warning: Node "cnt~9"


        何为combinational loop?让handbook来解释吧,看不懂英文的可别怪我~_~


Combinational loops are among the most common causes of instability and unreliability in digital designs. They should be avoided whenever possible. In a synchronous design, feedback loops should include registers. Combinational loops generally violate synchronous design principles by establishing a direct feedback loop that contains no registers. For example, a combinational loop occurs when the left-hand side of an arithmetic expression also appears on the right-hand side in HDL code. A combinational loop also occurs when you feed back the output of a register to an asynchronous pin of the same register through combinational logic, as shown in Figure 5–1.


e2cd8970-6b96-4162-b9be-7665e29bcb9e.JPG



         没有寄存器打一拍的这种combinational loop(组合环)是一种不推荐的设计方式,就如两段式状态机所实现的效果,甚至最终无法实现功能要求。同样的功能,一段式和三段式状态机之所以能够解决这个问题,就是避免了在纯组合逻辑中涉及这个反馈逻辑。在初学verilog时,我们常提的latch(锁存器),其实也是combinational loop的一个特例。


 


 

广告

文章评论 21条评论)

登录后参与讨论

jakzon_245_129863113 2012-11-5 23:21

各位。。。我只是看懂了组合循环的成因,但下面这个循环还是没能破,求看,谢了! module SimHex(Hhigh,Hlow,buffer,bufH,bufL); input Hhigh,Hlow; output reg[3:0] bufH,bufL; output reg[7:0] buffer; parameter f=4'b0000; parameter t=4'b0001; parameter HF=4'b1111; always @(Hhigh) bufH<=bufH+t; always @(Hlow) bufL<=bufL+t; always @(bufH or bufL) buffer<={bufH,bufL}; endmodule

xd_jiangning_772604554 2012-9-9 11:39

是,我也遇到过,组合逻辑出现cnt=cnt+1,功能仿真可以,时序仿真就不可以。 还发现一个情况是,在一个状态中 令a=1;到下一个状态时再令b=a; 这种情况貌似也不行

454936939_576309000 2012-3-30 17:02

哎~~~~ 要是早看到这个 就不至于花那么多的时间了,,我也遇到过这种退补出那个状态的情况,要是不要else nstate = STA1;就能行了

ba14735dc_668184569 2011-10-23 00:20

但是确实改成case(cstate)后,rtl视图和一段式一样。纠结。。

ba14735dc_668184569 2011-10-19 21:05

楼上的,特权同学所说的延迟一个时钟指的是,检测到输入改变以后到cnt更新之间。 你既然说“而使用case(cstate)会在state改变之后的一个时钟周期更新cnt值”又说“另外如果将三段式中case(nstate)改成case(cstate)不仅不会出现您说所的相差一个周期的问题”这不是前后矛盾么?难道state先改变,然后state和cnt值再同时更新?恕我愚笨,看了1个小时也没看懂你的想法。求解释。。。难道是三个结构块之间阻塞非阻塞运行时序,的理解不同么?

xiaocanmeng_921213060 2011-7-21 16:14

我觉得你的例子觉得也不恰当。如果你只想举例状态机的不同风格,就不应该将计数器糅合进来。因为计数器完全可以再用一个always描述。而状态机只生成它所需的cnt_en信号。当然我这可能会和你所理解的“几段式”状态机有所不同。虽然我也认为一个module中不是有三个always,就是三段式的状态机。

xiaocanmeng_921213060 2011-7-21 16:06

不明白你的意思。你所说的造成一个时钟周期相差是由于你在三段式中用了case(nstate)而不是case(cstate)。使用case(nstate),会使得在采样到din为高同时改变state和cnt值,而使用case(cstate)会在state改变之后的一个时钟周期更新cnt值。请你参看Clifford E. Cummings的《Synthesizable Finite State Machine Design Techniques Using the New SystemVerilog 3.0 Enhancements》

ilove314_323192455 2011-7-21 15:45

哥,那就不是三段式了,综合工具已经告诉你那是一段式了。你需要弄明白三段式不是简单的分开的三段代码而已

xiaocanmeng_921213060 2011-7-21 15:39

改成case(cstate),一段式和三段式的时序就一样了啊。我刚刚特别仿真了一下。

ilove314_323192455 2011-7-21 15:11

case(nstate)改成case(cstate)好像已经相差2个周期了
相关推荐阅读
ilove314_323192455 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
ilove314_323192455 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
ilove314_323192455 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
ilove314_323192455 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
ilove314_323192455 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
ilove314_323192455 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
21
0
广告