在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4683|回复: 6

[求助] 嵌套 状态机

[复制链接]
发表于 2010-9-8 18:37:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

                               
登录/注册后可看大图

请教高手,如图所述波形如何用嵌套状态机实现(VHDL)
要求:1. Signal1 用主状态机产生,Signal2用从状态机产生
         2. 采用扁平式代码结构,即主从状态机分别处于不同的Process语块中。

PS: 嵌套状态机的编码风格 扁平式是否要比内嵌式(主从状态机处在同一个Process语块中)用得更频繁
发表于 2010-9-9 08:25:34 | 显示全部楼层
根据时钟计数,然后以计数值作为状态划分的依据。用一个状态机与用两个状态机原理上是没有区别的,只是如果只用一个状态机时,其状态划分要复杂一点点的。
发表于 2010-9-9 08:55:30 | 显示全部楼层
我觉得用一个状态机反而好一些。一个是7分频,一个是4分频。用一个计数器分出来省资源
 楼主| 发表于 2010-9-9 10:34:17 | 显示全部楼层
2# qlengyu

这是我写的一段内嵌式的代码:
------------------------- Main Part ------------------------------------
  process (clk, rst)
  begin
     if (rst = '0') then
        main_state <= MST0;
        sub_state <= SST0;

        cnt_clk <= 0;
        flag <= 0;
   
elsif (rising_edge(clk))  then
    case main_state is
        when MST0 =>
            if (cnt_clk < 2) then
               main_state <= MST0;
               cnt_clk <= cnt_clk + 1;
            else
               main_state <= MST1;
               cnt_clk <= 0;
            end if;

        when MST1 =>
            if (cnt_clk < 2) then
               main_state <= MST1;
               cnt_clk <= cnt_clk + 1;
            else
               main_state <= MST2;
               cnt_clk <= 0;
            end if;

        when MST2 =>
            case sub_state is
               when SST0 =>
                   sub_state <= SST1;
               
                when SST1 =>
                   sub_state <= SST2;
         
                when SST2 =>
                   if (flag < 1) then
                      sub_state <= SST1;
                      flag <= flag + 1;
                   else
                      sub_state <= SST0;
                      main_state <= MST1;
                      flag <= 0;
                   end if;

                end case;
              end case;
           end if;
  end process;

process (rst, main_state, sub_state)
begin
   if (rst = '0') then
     sig1 <= '0';
     sig2 <= '0';

   else
     case main_state is
        when MST0 =>
            sig1 <= '0';
            sig2 <= '0';

        when MST1 =>
            sig1 <= '1';
            sig2 <= '0';
  
        when MST2 =>
            sig1 <= '0';
            case sub_state is
               when SST0 =>
                   sig2 <= '0';
               when SST1 =>
                   sig2 <= '1';
               when SST2 =>
                   sig2 <= '0';
            end case;
        end case;
     end if;
end process;
--------------------------------------------------------------------------
如果我想把 "case sub_state is" 单独拎出来,写在另外一个Process语块中,这样阅读就比较清晰。

请问如何实现?谢谢!
发表于 2010-9-13 04:17:37 | 显示全部楼层
信号给复杂化了   用不着这么多状态机

signal1  完全可以作为一个复位信号给到 产生signal2 的模块
发表于 2010-9-13 04:29:49 | 显示全部楼层
你这时面试题吧,要不这个用状态机嵌套来实现,也夸张了
 楼主| 发表于 2010-9-13 20:59:38 | 显示全部楼层
5# zhang2000
我只是举了一个简单例子,实际波形很复杂,宜用嵌套状态机。
不要只关注这个例子本身,我希望能得到有关嵌套状态机的正解,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-28 03:45 , Processed in 0.020409 second(s), 9 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表