您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 关于状态机时序与功能仿真中存在的问题
关于状态机时序与功能仿真中存在的问题下图是一个状态机的状态转移图(黄色圆圈中的数字为该状态下的输出,曲线上方的等式为状态转移条件)图1由s0、s1、s2、s3四种状态构成的状态机下面的代码实现了上图所示的状态机(出自《VHDL经典实例》——黄任),libraryieee;useieee.std_logic_1164.all;entitymooreisport(reset:instd_logic;clock:instd_logic;din:instd_logic;dout:outstd_logic_vector(2downto0));end;architecturemooremachineofmooreistypestate_typeis(s0,s1,s2,s3);signalpresentstate:state_type;signalnextstate:state_type;beginstate_reg:process(reset,clock)/*综合成时序逻辑,很可能是一个D触发器*/beginifreset='1'then/*这里的nextstate信号即是该D触发器的输入,presentstate=s0;presentstate信号即是D触发器的输出*/elsifrising_edge(clock)thenpresentstate=nextstate;endif;endprocess;change_state:process(presentstate,din)/*综合成组合逻辑,输出即是nextstate信号,故存在延时*/begincasepresentstateiswhens0=ifdin='1'thennextstate=s1;elsenextstate=s0;endif;dout=001;whens1=ifdin='1'thennextstate=s2;elsenextstate=s1;endif;dout=011;whens2=ifdin='1'thennextstate=s3;elsenextstate=s2;endif;dout=101;whens3=ifdin='1'thennextstate=s0;elsenextstate=s1;endif;dout=111;endcase;endprocess;end;将上面的代码在quartus6.0中编译后可以得到一些它的功能仿真图。(设定复位后presentstate的初始状态为:s0)首先看如下输入波形时的功能仿真图形,其结果很容易分析,与预期的一致。图2功能仿真图形再看一种特殊输入波形条件下的功能仿真图形,通过特殊情形来寻找问题图3功能仿真图形从图中可以清楚的看到,在时钟的上升沿时刻,因为功能仿真时不考虑由presentstate和din构成的组合逻辑的延迟。也就是说:两者构成的组合逻辑的输出结果,即nextstate信号在时钟clock的上升沿时刻,恰好也是din的下降沿时刻,din和presentstate组合逻辑的结果始终是s0,最终导致了状态机presentstate保持s0态!这也是很容易理解的。接着看它的时序仿真图,这下就有问题了!图4时序仿真图型很明显,用quartusII在进行时序仿真时,考虑了组合逻辑延迟,建立时间、保持时间等。可是我的疑惑在于,在图中50ns处,clock与din同时出现跳变。din与presentstate组合逻辑的结果(即nextstate)应该仍是s0状态,然后被同时刻出现的clock上跳沿采样,那么所得的结果应该还是s0才对呀。可图中却在一段时延后进入了s1态。这一点让我非常疑惑,百思不得其解。到底是怎么一回事了???
本文标题:关于状态机时序与功能仿真中存在的问题
链接地址:https://www.777doc.com/doc-2676623 .html