三段式状态机实例

一直想学习下写状态机,最近刚好有时间。一开始不太会写,后来想想这有什么,随便写呗,只要最后仿真结果是自己想要的,然后是按照三段式来写的不就OK了吗?然后就一边写一边仿真分析,最后终于根据实际需求写出了一段三段式状态机代码。其实也就是逻辑上要理清楚,清楚没一个状态在哪一种条件下跳转到另外一个状态。有空再用这个例子写下两段式状态机!

module top(
input       I_clk,
input       I_rst,
input [9:0] I_yw_len,
input [9:0] I_yw_gap,
input       I_start,
output      O_yw_gt
    );

reg [7:0] S_rst_cnt;
reg       O_yw_gt  ;
    
reg [1:0] S_state     ;
reg [1:0] S_state_next;
reg [9:0] H_cnt       ;
reg [9:0] L_cnt       ;

parameter idle = 2'b00;
parameter gap = 2'b01;
parameter frame = 2'b10;

always @ (posedge I_clk or posedge I_rst)
begin
  if(I_rst)
      S_state <= idle;
  else 
      S_state <= S_state_next;
end

always @ (*)
begin
  case(S_state)
      idle:
        if(I_start)
        S_state_next <= frame;
      else 
        S_state_next <= idle;
      frame:
      if(~I_start)
          begin
          if(H_cnt==I_yw_len)     
               S_state_next <= gap;  
          else  
               S_state_next <= frame;
         end
      else 
          begin
            if(H_cnt==I_yw_len)
                 S_state_next <= gap;
             else 
                 S_state_next <= frame;
          end
      gap:
        if(~I_start)
        begin
          if(L_cnt==I_yw_gap)     
               S_state_next <= idle;  
          else  
               S_state_next <= gap;
        end
      else 
          begin
            if(L_cnt==I_yw_gap)
                 S_state_next <= frame;
             else 
                 S_state_next <= gap;
          end
    default:S_state_next <= idle;
  endcase
end

always @ (posedge I_clk or posedge I_rst)
begin
    if(I_rst)
        begin
            O_yw_gt <= 1;
            H_cnt <= 0;
            L_cnt <= 0;
        end
    else
      case(S_state_next)
          idle:begin O_yw_gt <= 1;H_cnt <= 0;L_cnt <= 0;end
      gap:begin O_yw_gt <= 1;H_cnt <= 0;L_cnt <= L_cnt + 1;end
      frame:begin O_yw_gt <= 0;H_cnt <= H_cnt + 1;L_cnt <= 0;end
      default:begin O_yw_gt <= O_yw_gt;H_cnt <= H_cnt + 1;L_cnt <= L_cnt + 1;end
    endcase
end

endmodule
 

发布了153 篇原创文章 · 获赞 152 · 访问量 80万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览