找回密码
 注册
搜索
查看: 1190|回复: 6

[讨论] 状态机的困扰,请大侠指教

[复制链接]
发表于 2007-8-28 23:00:18 | 显示全部楼层 |阅读模式
本人是新手且初来乍到,请各位大侠多多指点,在此谢过。
最近在学习状态机,我用的是vhdl,用一个或两个process实现都可以。假如我用两个process,其中有一个是逻辑组合电路部分,但在这部分里有些信号是依赖于别的时钟的,我可以用其他的时钟来控制信号么?我想知道状态机的那个组合逻辑进程是必须不含时序逻辑电路么?如果要用能实现么?会有什么样的问题呢?因为我暂时实现不了。
可能我语言表达的不是很清楚,大概写一下我的轮廓:
process(state)
begin
case state is
       when st1 =>if rising_edge(clk)  then   --这种描述被允许么?但是我确实需要
                                cn:=cn+1;
                                if cn=5 then
                                        nxt_state<=st2;  
                                 end if;
                         end if;
       when st2 => flag<=1;
                           nxt_state<=st3;  
                           . ...................
       when st3 => flag<=0;
                           .......................
       when others=>null;
end process;

process(sys_clk)
begin
       if rising_edge(sys_clk) then
             state<=nxt_state;
       end if;
end process;
我不知道这个问题时不时涉及到双时钟问题,不知道怎么解决,请大侠指点。谢谢;》
发表于 2007-8-29 18:05:29 | 显示全部楼层
你用的是双进程状态机;
一般情况下,第一个进程应该有复位信号的.
而且,在其他状态的时候最好是回到初始状态,也就是用程序实现如下:
    when others=>  nxt_state<=st0
点评回复

使用道具 举报

发表于 2007-8-29 18:07:13 | 显示全部楼层
状态机不够稳定,工程大了会有跑飞的危险,本人曾经深受其害!
后来导师建议把所有的状态机全部咔嚓了.
点评回复

使用道具 举报

发表于 2007-8-31 19:06:41 | 显示全部楼层
我感觉你把逻辑“揉”到一块去了,case译码中要用到的状态是应该在别的进程中得到的,不要放在一起。[em01]
点评回复

使用道具 举报

 楼主| 发表于 2007-9-1 12:40:13 | 显示全部楼层
首先本人谢谢大家的回答。不过有几个问题我还不太明白。
       4楼的仁兄,你能再解释一下么?我不太明白“case译码中要用到的状态是应该在别的进程中得到的”是什么意思?谢谢了。
       还有3楼的仁兄,你说把全部的状态机都去掉了?难道不能用么?那你是通过什么方法实现状态机的呢?
点评回复

使用道具 举报

发表于 2007-9-1 18:51:20 | 显示全部楼层
可以通过一个计数器实现各个状态的操作!
状态机有触发状态的条件,就用这个条件产生一个所需要的计数器,然后采用该计数器的计数值跟各个状态对应.
点评回复

使用道具 举报

发表于 2007-11-16 08:17:49 | 显示全部楼层
process(sys_clk)
begin
       if rising_edge(sys_clk) then
             case state is    when st1 =>if rising_edge(clk)  then  
                                cn:=cn+1;
                                if cn=5 then
                                        nxt_state<=st2;
                                 end if;
                         end if;
       when st2 => flag<=1;
                           nxt_state<=st3;
                           . ...................
       when st3 => flag<=0;
                           .......................
       when others=>null;
             state<=nxt_state;
       end if;
end process;
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-9-30 04:31 , Processed in 0.046448 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表