微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 嵌套 状态机

嵌套 状态机

时间:10-02 整理:3721RD 点击:


请教高手,如图所述波形如何用嵌套状态机实现(VHDL)
要求:1. Signal1 用主状态机产生,Signal2用从状态机产生
         2. 采用扁平式代码结构,即主从状态机分别处于不同的Process语块中。
PS: 嵌套状态机的编码风格 扁平式是否要比内嵌式(主从状态机处在同一个Process语块中)用得更频繁

根据时钟计数,然后以计数值作为状态划分的依据。用一个状态机与用两个状态机原理上是没有区别的,只是如果只用一个状态机时,其状态划分要复杂一点点的。

我觉得用一个状态机反而好一些。一个是7分频,一个是4分频。用一个计数器分出来省资源

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语块中,这样阅读就比较清晰。
请问如何实现?谢谢!

信号给复杂化了   用不着这么多状态机
signal1  完全可以作为一个复位信号给到 产生signal2 的模块

你这时面试题吧,要不这个用状态机嵌套来实现,也夸张了

5# zhang2000
我只是举了一个简单例子,实际波形很复杂,宜用嵌套状态机。
不要只关注这个例子本身,我希望能得到有关嵌套状态机的正解,谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top