FPGA Introduction Course Training #08 – State Machines

YouTube-Channel-Art-Template.png


fpga introduction course training #8 - 1.PNG
– 회로를 설계하는 과정에서 실수의 여지가 많다. State machine을 구성하면 구조적으로 논리를 표현할 수 있다.
– Finite state machine은 내부적으로 크게 세 가지로 구성된다. 두 개의 combinational logic과 한 개의 sequential logic으로 구성된다. 첫 번째 combinational logic은 현재 상태와 입력값에 기반하여 다음 상태를 출력으로 내보낸다. Sequential logic은 현재 상태를 기억하기 위해 사용된다. 두 번째 combinational logic은 현재 상태 또는 입력과의 조합을 통해 출력을 결정한다.
– Mealy machine은 현재 상태와 입력을 사용해 출력을 결정한다. Moore machine은 현재 상태만을 사용해 출력을 결정한다. Mealy machine은 한 개의 상태가 더 빠르고, Moor machine은 구현이 쉽다.

fpga introduction course training #8 - 2.PNG
– MIT의 digital design 수업에서 가져온 state machine.
– 세 개의 상태를 가지며 L이 입력, P가 출력이다.

fpga introduction course training #8 - 3.PNG
– State encoding을 위해 one-hot을 사용한다. 더 많은 flip-flop을 사용하지만 FPGA 구현하기는 쉬움. 상태가 세 개라면 세 개의 비트를 사용해 encode한다.
– one-hot encoding으로 상태를 표현하는 것을 Xilinx에서 추천함.

//this code is provided by the development channel
//https://www.youtube.com/channel/UC1ptV25-NEHRIEnM1kXMCrQ
//thank you, Leonardo!
`timescale 1ns / 1ps

module fsm_level_to_pulse(
    input rst,
    input clk,
    input L,
    output P
    );
    
    // We're using one-hot to encode 3 states so we need 3 bits
    parameter NUM_BITS_ENCODE = 3;
    
    // Variables for the next and current state
    reg [NUM_BITS_ENCODE-1:0] current_state;
    reg [NUM_BITS_ENCODE-1:0] next_state;
    
    // Encode using one-hot our 3 states
    localparam 
        WAIT_RISE=3'b001,
        EDGE_DETECTED=3'b010,        
        WAIT_FALL=3'b100;
        
    
    // Next state part
    always @(*)
    begin
        // Always a good practice to have a default value on combinational always
        // Lets break everything (By using the non-blocking assignment here everything will collapse)
        // Basically we're scheduling next_state to receive WAIT_RISE on the end of the always block
        // Whatheaver we do bellow this line with this signal will be ignored;....
        next_state = WAIT_RISE; // Never mix assignments!
        
        case ( current_state )
            WAIT_RISE:
                begin
                    if (L==1)
                        next_state = EDGE_DETECTED;
                    else                           
                        next_state = WAIT_RISE;                                                  
                end            
            EDGE_DETECTED:
                begin
                    if (L==1)
                        next_state = WAIT_FALL;
                    else                           
                        next_state = WAIT_RISE;
                end            
            WAIT_FALL:
                begin
                    if (L==1)
                        next_state = WAIT_FALL;
                    else                           
                        next_state = WAIT_RISE; 
                end            
            default:  next_state = WAIT_RISE;                               
        endcase       
    end
    
    // Here we store the current state (Almost always like this...)
    always @(posedge clk)
    begin
        if (rst)
            current_state <= WAIT_RISE;
        else                
            current_state <= next_state;
    end        
    
    // Output logic, on this case we're doing a moore because the outputs depends
    // only on the current state
    assign P = (current_state == WAIT_RISE)? 0:
               (current_state == EDGE_DETECTED)? 1:
               (current_state == WAIT_FALL)? 0: 1'bx;
endmodule

– Combinational always에서는 blocking assignment, sequential always에서는 non-blocking assignment를 해야 함. Finite state machine의 combinational always에서 non-blocking assignment를 하면 제대로 동작하지 않음 (중요!).

Advertisements
Tagged with: , , , , , , , , ,
Posted in FPGA

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Recent Posts
누적 방문자 수
  • 146,251 hits
%d bloggers like this: