OpenCores
URL https://opencores.org/ocsvn/spacewiresystemc/spacewiresystemc/trunk

Subversion Repositories spacewiresystemc

[/] [spacewiresystemc/] [trunk/] [rtl/] [RTL_VB/] [fsm_spw.v] - Diff between revs 37 and 40

Only display areas with differences | Details | Blame | View Log

Rev 37 Rev 40
//+FHDR------------------------------------------------------------------------
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//FILE NAME      :
//FILE NAME      :
//DEPARTMENT     : IC Design / Verification
//DEPARTMENT     : IC Design / Verification
//AUTHOR         : Felipe Fernandes da Costa
//AUTHOR         : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//PURPOSE  : ECSS_E_ST_50_12C_31_july_2008
//PURPOSE  : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAMETERS
//PARAM NAME            RANGE   : DESCRIPTION : DEFAULT : UNITS
//PARAM NAME            RANGE   : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH        [32,16] : width of the data : 32:
//e.g.DATA_WIDTH        [32,16] : width of the data : 32:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//REUSE ISSUES
//REUSE ISSUES
//Reset Strategy        :
//Reset Strategy        :
//Clock Domains         :
//Clock Domains         :
//Critical Timing       :
//Critical Timing       :
//Test Features         :
//Test Features         :
//Asynchronous I/F      :
//Asynchronous I/F      :
//Scan Methodology      :
//Scan Methodology      :
//Instantiations        :
//Instantiations        :
//Synthesizable (y/n)   :
//Synthesizable (y/n)   :
//Other                 :
//Other                 :
//-FHDR------------------------------------------------------------------------
//-FHDR------------------------------------------------------------------------
 
 
`timescale 1ns/1ns
`timescale 1ns/1ns
 
 
module FSM_SPW (
module FSM_SPW (
                input  pclk,
                input  pclk,
                input  resetn,
                input  resetn,
 
 
                //fsm status control
                //fsm status control
                input  auto_start,
                input  auto_start,
                input  link_start,
                input  link_start,
                input  link_disable,
                input  link_disable,
 
 
                //rx status input control
                //rx status input control
                input  rx_error,
                input  rx_error,
                input  rx_credit_error,
                input  rx_credit_error,
                input  rx_got_bit,
                input  rx_got_bit,
                input  rx_got_null,
                input  rx_got_null,
                input  rx_got_nchar,
                input  rx_got_nchar,
                input  rx_got_time_code,
                input  rx_got_time_code,
                input  rx_got_fct,
                input  rx_got_fct,
                output reg rx_resetn,
                output reg rx_resetn,
 
 
                //tx status control
                //tx status control
                output reg enable_tx,
                output reg enable_tx,
                output reg send_null_tx,
                output reg send_null_tx,
                output reg send_fct_tx,
                output reg send_fct_tx,
 
 
                output [5:0] fsm_state
                output [5:0] fsm_state
 
 
              );
              );
 
 
localparam [5:0]  error_reset   = 6'b00_0000,
localparam [5:0]  error_reset   = 6'b00_0000,
                  error_wait    = 6'b00_0001,
                  error_wait    = 6'b00_0001,
                  ready         = 6'b00_0010,
                  ready         = 6'b00_0010,
                  started       = 6'b00_0100,
                  started       = 6'b00_0100,
                  connecting    = 6'b00_1000,
                  connecting    = 6'b00_1000,
                  run           = 6'b01_0000;
                  run           = 6'b01_0000;
 
 
        reg [5:0] state_fsm;
        reg [5:0] state_fsm;
        reg [5:0] next_state_fsm;
        reg [5:0] next_state_fsm;
 
 
        reg [11:0] after128us;
        reg [11:0] after128us;
        reg [11:0] after64us;
        reg [11:0] after64us;
        reg [11:0] after850ns;
        reg [11:0] after850ns;
 
 
        reg got_bit_internal;
        reg got_bit_internal;
 
 
 
        reg get_rx_got_fct_a, get_rx_got_fct_b;
 
        reg get_rx_error_a, get_rx_error_b;
 
        reg get_rx_got_null_a, get_rx_got_null_b;
 
 
 
        reg get_rx_got_nchar_a, get_rx_got_nchar_b;
 
        reg get_rx_got_time_code_a, get_rx_got_time_code_b;
 
        reg get_rx_credit_error_a, get_rx_credit_error_b;
 
 
//
//
assign fsm_state    = state_fsm;
assign fsm_state    = state_fsm;
 
 
always@(*)
always@(*)
begin
begin
 
 
        next_state_fsm = state_fsm;
        next_state_fsm = state_fsm;
 
 
        case(state_fsm)
        case(state_fsm)
        error_reset:
        error_reset:
        begin
        begin
 
 
                if(after64us == 12'd639)
                if(after64us == 12'd639)
                begin
                begin
                        next_state_fsm = error_wait;
                        next_state_fsm = error_wait;
                end
                end
                else
                else
                begin
                begin
                        next_state_fsm = error_reset;
                        next_state_fsm = error_reset;
                end
                end
 
 
        end
        end
        error_wait:
        error_wait:
        begin
        begin
 
 
                if(after128us == 12'd1279)
                if(after128us == 12'd1279)
                begin
                begin
                        next_state_fsm = ready;
                        next_state_fsm = ready;
                end
                end
                else if(rx_error | rx_got_fct | rx_got_nchar | rx_got_time_code)
                else if(get_rx_error_a | get_rx_got_fct_a | get_rx_got_nchar_a | rx_got_time_code)
                begin
                begin
                        next_state_fsm = error_reset;
                        next_state_fsm = error_reset;
                end
                end
 
 
        end
        end
        ready:
        ready:
        begin
        begin
 
 
                if(rx_error | rx_got_fct | rx_got_nchar | rx_got_time_code)
                if(get_rx_error_a | get_rx_got_fct_a | get_rx_got_nchar_a | get_rx_got_time_code_a)
                begin
                begin
                        next_state_fsm = error_reset;
                        next_state_fsm = error_reset;
                end
                end
                else if(((!link_disable) & (link_start |(auto_start & rx_got_null)))==1'b1)
                else if(((!link_disable) & (link_start |(auto_start & get_rx_got_null_a)))==1'b1)
                begin
                begin
                        next_state_fsm = started;
                        next_state_fsm = started;
                end
                end
 
 
        end
        end
        started:
        started:
        begin
        begin
 
 
                if(rx_error | rx_got_fct | rx_got_nchar | rx_got_time_code | after128us == 12'd1279)
                if(get_rx_error_a | get_rx_got_fct_a | get_rx_got_nchar_a | get_rx_got_time_code_a | after128us == 12'd1279)
                begin
                begin
                        next_state_fsm = error_reset;
                        next_state_fsm = error_reset;
                end
                end
                else if((rx_got_null & rx_got_bit)== 1'b1)
                else if((get_rx_got_null_a & rx_got_bit)== 1'b1)
                begin
                begin
                        next_state_fsm = connecting;
                        next_state_fsm = connecting;
                end
                end
 
 
        end
        end
        connecting:
        connecting:
        begin
        begin
 
 
                if(rx_error | rx_got_nchar | rx_got_time_code | after128us == 12'd1279)
                if(get_rx_error_a | get_rx_got_nchar_a | get_rx_got_time_code_a | after128us == 12'd1279)
                begin
                begin
                        next_state_fsm = error_reset;
                        next_state_fsm = error_reset;
                end
                end
                else if(rx_got_fct)
                else if(get_rx_got_fct_a)
                begin
                begin
                        next_state_fsm = run;
                        next_state_fsm = run;
                end
                end
 
 
        end
        end
        run:
        run:
        begin
        begin
 
 
                if(rx_error | rx_credit_error | link_disable  | after850ns == 12'd85)
                if(get_rx_error_a | get_rx_credit_error_a | link_disable  | after850ns == 12'd85)
                begin
                begin
                        next_state_fsm = error_reset;
                        next_state_fsm = error_reset;
                end
                end
                else
                else
                begin
                begin
                        next_state_fsm = run;
                        next_state_fsm = run;
                end
                end
 
 
        end
        end
        endcase
        endcase
end
end
 
 
always@(posedge pclk or negedge resetn)
always@(posedge pclk or negedge resetn)
begin
begin
        if(!resetn)
        if(!resetn)
        begin
        begin
                state_fsm <= error_reset;
                state_fsm <= error_reset;
 
 
                rx_resetn <= 1'b0;
                rx_resetn <= 1'b0;
 
 
                enable_tx<= 1'b0;
                enable_tx    <= 1'b0;
                send_null_tx<= 1'b0;
                send_null_tx <= 1'b0;
                send_fct_tx<= 1'b0;
                send_fct_tx<= 1'b0;
 
 
 
                get_rx_got_fct_a  <= 1'b0;
 
                get_rx_got_fct_b  <= 1'b0;
 
                get_rx_error_a    <= 1'b0;
 
                get_rx_error_b    <= 1'b0;
 
                get_rx_got_null_a <= 1'b0;
 
                get_rx_got_null_b <= 1'b0;
 
 
 
 
 
                get_rx_got_nchar_a     <= 1'b0;
 
                get_rx_got_nchar_b     <= 1'b0;
 
                get_rx_got_time_code_a <= 1'b0;
 
                get_rx_got_time_code_b <= 1'b0;
 
                get_rx_credit_error_a  <= 1'b0;
 
                get_rx_credit_error_b  <= 1'b0;
 
 
        end
        end
        else
        else
        begin
        begin
 
 
 
                get_rx_got_fct_b <= rx_got_fct;
 
                get_rx_got_fct_a <= get_rx_got_fct_b;
 
 
 
                get_rx_error_b <= rx_error;
 
                get_rx_error_a <= get_rx_error_b;
 
 
 
                get_rx_got_null_b <= rx_got_null;
 
                get_rx_got_null_a <= get_rx_got_null_b;
 
 
 
                get_rx_got_nchar_b <= rx_got_nchar;
 
                get_rx_got_nchar_a <= get_rx_got_nchar_b;
 
 
 
                get_rx_got_time_code_b <= rx_got_time_code;
 
                get_rx_got_time_code_a <= get_rx_got_time_code_b;
 
 
 
                get_rx_credit_error_b <= rx_credit_error;
 
                get_rx_credit_error_a <= get_rx_credit_error_b;
 
 
                state_fsm <= next_state_fsm;
                state_fsm <= next_state_fsm;
 
 
                case(state_fsm)
                case(state_fsm)
                error_reset:
                error_reset:
                begin
                begin
                        enable_tx<= 1'b0;
                        enable_tx<= 1'b0;
                        send_null_tx<= 1'b0;
                        send_null_tx<= 1'b0;
                        send_fct_tx<= 1'b0;
                        send_fct_tx<= 1'b0;
 
 
                        if(after64us == 12'd639)
                        if(after64us == 12'd639)
                                rx_resetn <= 1'b1;
                                rx_resetn <= 1'b1;
                        else
                        else
                                rx_resetn <= 1'b0;
                                rx_resetn <= 1'b0;
                end
                end
                error_wait:
                error_wait:
                begin
                begin
                        rx_resetn <= 1'b1;
                        rx_resetn <= 1'b1;
                        enable_tx<= 1'b0;
                        enable_tx<= 1'b0;
                        send_null_tx<= 1'b0;
                        send_null_tx<= 1'b0;
                        send_fct_tx<= 1'b0;
                        send_fct_tx<= 1'b0;
                end
                end
                ready:
                ready:
                begin
                begin
                        rx_resetn <= 1'b1;
                        rx_resetn <= 1'b1;
                        enable_tx<= 1'b1;
                        enable_tx<= 1'b1;
                        send_null_tx<= 1'b0;
                        send_null_tx<= 1'b0;
                        send_fct_tx<= 1'b0;
                        send_fct_tx<= 1'b0;
                end
                end
                started:
                started:
                begin
                begin
                        rx_resetn <= 1'b1;
                        rx_resetn <= 1'b1;
                        enable_tx<= 1'b1;
                        enable_tx<= 1'b1;
                        send_null_tx<= 1'b1;
                        send_null_tx<= 1'b1;
                        send_fct_tx<= 1'b0;
                        send_fct_tx<= 1'b0;
                end
                end
                connecting:
                connecting:
                begin
                begin
                        rx_resetn <= 1'b1;
                        rx_resetn <= 1'b1;
                        enable_tx<= 1'b1;
                        enable_tx<= 1'b1;
                        send_null_tx<= 1'b1;
                        send_null_tx<= 1'b1;
                        send_fct_tx<= 1'b1;
                        send_fct_tx<= 1'b1;
                end
                end
                run:
                run:
                begin
                begin
                        rx_resetn <= 1'b1;
                        rx_resetn <= 1'b1;
                        enable_tx<= 1'b1;
                        enable_tx<= 1'b1;
                        send_null_tx<= 1'b1;
                        send_null_tx<= 1'b1;
                        send_fct_tx<= 1'b1;
                        send_fct_tx<= 1'b1;
                end
                end
                endcase
                endcase
 
 
        end
        end
end
end
 
 
always@(posedge pclk)
always@(posedge pclk)
begin
begin
 
 
        if(!resetn || state_fsm == error_reset)
        if(!resetn || state_fsm == error_reset)
        begin
        begin
                after128us <= 12'd0;
                after128us <= 12'd0;
        end
        end
        else
        else
        begin
        begin
 
 
                if(next_state_fsm == connecting && state_fsm == started)
                if(next_state_fsm == connecting && state_fsm == started)
                begin
                begin
                        after128us <= 12'd0;
                        after128us <= 12'd0;
                end
                end
                else if(state_fsm == error_wait || state_fsm == started || state_fsm == connecting)
                else if(state_fsm == error_wait || state_fsm == started || state_fsm == connecting)
                begin
                begin
                        if(after128us < 12'd1279)
                        if(after128us < 12'd1279)
                                after128us <= after128us + 12'd1;
                                after128us <= after128us + 12'd1;
                        else
                        else
                                after128us <= 12'd0;
                                after128us <= 12'd0;
                end
                end
                else
                else
                begin
                begin
                                after128us <= 12'd0;
                                after128us <= 12'd0;
                end
                end
        end
        end
 
 
end
end
 
 
always@(posedge pclk)
always@(posedge pclk)
begin
begin
 
 
        if(!resetn)
        if(!resetn)
        begin
        begin
                after64us <= 12'd0;
                after64us <= 12'd0;
        end
        end
        else
        else
        begin
        begin
                if(state_fsm == error_reset && (auto_start | link_start))
                if(state_fsm == error_reset && (auto_start | link_start))
                begin
                begin
                        if(after64us < 12'd639)
                        if(after64us < 12'd639)
                                after64us <= after64us + 12'd1;
                                after64us <= after64us + 12'd1;
                        else
                        else
                                after64us <= 12'd0;
                                after64us <= 12'd0;
                end
                end
                else
                else
                begin
                begin
                        after64us <= 12'd0;
                        after64us <= 12'd0;
                end
                end
        end
        end
 
 
end
end
 
 
always@(posedge pclk)
always@(posedge pclk)
begin
begin
        if(!resetn)
        if(!resetn)
        begin
        begin
                got_bit_internal <= 1'b0;
                got_bit_internal <= 1'b0;
        end
        end
        else
        else
        begin
        begin
                if(rx_got_bit)
                if(rx_got_bit)
                        got_bit_internal <= 1'b1;
                        got_bit_internal <= 1'b1;
                else
                else
                        got_bit_internal <= 1'b0;
                        got_bit_internal <= 1'b0;
        end
        end
end
end
 
 
always@(posedge pclk)
always@(posedge pclk)
begin
begin
 
 
        if(!resetn | got_bit_internal)
        if(!resetn | got_bit_internal)
        begin
        begin
                after850ns <= 12'd0;
                after850ns <= 12'd0;
        end
        end
        else
        else
        begin
        begin
                if(state_fsm != run)
                if(state_fsm != run)
                begin
                begin
                        after850ns <= 12'd0;
                        after850ns <= 12'd0;
                end
                end
                else
                else
                begin
                begin
                        if(after850ns < 12'd85 && state_fsm == run)
                        if(after850ns < 12'd85 && state_fsm == run)
                                after850ns <= after850ns + 12'd1;
                                after850ns <= after850ns + 12'd1;
                        else
                        else
                                after850ns <= after850ns;
                                after850ns <= after850ns;
 
 
                end
                end
        end
        end
 
 
end
end
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.