三段式状态机和一段式状态机

状态机感觉总写不好,可能写的太少了吧,没有领悟到关键点。下面是同一功能的三段式状态机和一段式状态机,欢迎大家批评指正。

三段式状态机:

reg [1:0] S_state;
reg [1:0] S_state_next;
parameter idle = 2'b00;
parameter start = 2'b01;
parameter send = 2'b10; 
parameter stop = 2'b11; 
always @ (posedge I_156p25m or negedge I_rst_n)
begin
 if(~I_rst_n)
   S_state <= idle;
 else
   S_state <= S_state_next;
end

always @ (*)
begin
  if(~I_rst_n)
      S_state_next  = idle;
  else 
      case(S_state)
        idle:
          if(I_start_flag)
              S_state_next = start;
          else 
              S_state_next = idle;
        start:
        if(~lvds_send_fifo_empty)
            S_state_next = send;
        else
            S_state_next = idle;
      send: 
        if(bit_cnt==BIT_CNT -1)
          S_state_next = send; 
        else 
            S_state_next = stop;                         
        stop:
        if(send_data_length == 167)
              S_state_next = idle;  
          else if(bit_cnt==BIT_CNT -1)
              S_state_next = send; 
          else 
              S_state_next = stop;                           
        default: S_state_next = idle;
       endcase
end

always @ (posedge I_156p25m or negedge I_rst_n)
begin
    if(~I_rst_n)
      lvds_send_fifo_rden <= 0;
    else 
        case(S_state_next)
            idle:lvds_send_fifo_rden <= 0;
            start:lvds_send_fifo_rden <= 0;
            send:lvds_send_fifo_rden <= 1;
            stop:lvds_send_fifo_rden <= 0;
            default:lvds_send_fifo_rden <= 0;
        endcase
end

一段式状态机:

always @ (posedge I_156p25m or negedge I_rst_n)
begin
  if(~I_rst_n)
    begin
      lvds_send_fifo_rden <= 0;
      tx_state <= 0;
    end
  else 
      case(tx_state)
          2'd0:
            begin                   
                if(I_start_flag)
                  tx_state <= 1;
                else           
                  tx_state <= 0;                                   
            end
      2'd1:
        begin
            if(~lvds_send_fifo_empty)
                begin
                tx_state <= 2;
                lvds_send_fifo_rden <= 1;
              end
            else
                begin 
                  tx_state <= 0; 
                  lvds_send_fifo_rden <= 0;
              end      
        end                       
      2'd2:
        begin
          lvds_send_fifo_rden <= 0;
          if(send_data_length == 167)
            tx_state <= 0; 
          else 
              tx_state <= 3;
        end
      2'd3:
        begin
          if(bit_cnt==BIT_CNT-1)
              begin
                tx_state <= 2;
                lvds_send_fifo_rden <= 1;
              end
          else 
              begin
                tx_state <= 3;
                lvds_send_fifo_rden <= 0;                  
                  
            end
        end      
      default:
        begin
          lvds_send_fifo_rden <= 0;
          tx_state <= 0;               
        end
      endcase
end    

你可能感兴趣的:(FPGA)