//+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 rx_resetn,
|
output rx_resetn,
|
|
|
//tx status control
|
//tx status control
|
output enable_tx,
|
output enable_tx,
|
output send_null_tx,
|
output send_null_tx,
|
output send_fct_tx,
|
output 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;
|
|
|
//
|
//
|
assign enable_tx = (!resetn | state_fsm == error_reset | state_fsm == error_wait)?1'b0:1'b1;
|
assign enable_tx = (!resetn | state_fsm == error_reset | state_fsm == error_wait)?1'b0:1'b1;
|
|
|
//
|
//
|
assign rx_resetn = (state_fsm == error_reset)?1'b0:1'b1;
|
assign rx_resetn = (state_fsm == error_reset)?1'b0:1'b1;
|
|
|
//
|
//
|
assign send_null_tx = (state_fsm == started | state_fsm == connecting | state_fsm == run)?1'b1:1'b0;
|
assign send_null_tx = (state_fsm == started | state_fsm == connecting | state_fsm == run)?1'b1:1'b0;
|
|
|
//
|
//
|
assign send_fct_tx = (state_fsm == connecting | state_fsm == run)?1'b1:1'b0;
|
assign send_fct_tx = (state_fsm == connecting | state_fsm == run)?1'b1:1'b0;
|
|
|
//
|
//
|
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(rx_error | rx_got_fct | rx_got_nchar | 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(rx_error | rx_got_fct | rx_got_nchar | rx_got_time_code)
|
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)))
|
else if((!link_disable) && (link_start |(auto_start && rx_got_null)))
|
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(rx_error | rx_got_fct | rx_got_nchar | rx_got_time_code | 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)
|
else if(rx_got_null && rx_got_bit)
|
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(rx_error | rx_got_nchar | rx_got_time_code | after128us == 12'd1279 )
|
begin
|
begin
|
next_state_fsm = error_reset;
|
next_state_fsm = error_reset;
|
end
|
end
|
else if(rx_got_fct)
|
else if(rx_got_fct)
|
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(rx_error | rx_credit_error | 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)
|
always@(posedge pclk)
|
begin
|
begin
|
if(!resetn)
|
if(!resetn)
|
begin
|
begin
|
state_fsm <= error_reset;
|
state_fsm <= error_reset;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
|
|
state_fsm <= next_state_fsm;
|
state_fsm <= next_state_fsm;
|
|
|
case(state_fsm)
|
case(state_fsm)
|
error_reset:
|
error_reset:
|
begin
|
begin
|
end
|
end
|
error_wait:
|
error_wait:
|
begin
|
begin
|
end
|
end
|
ready:
|
ready:
|
begin
|
begin
|
end
|
end
|
started:
|
started:
|
begin
|
begin
|
end
|
end
|
connecting:
|
connecting:
|
begin
|
begin
|
end
|
end
|
run:
|
run:
|
begin
|
begin
|
end
|
end
|
endcase
|
endcase
|
end
|
end
|
end
|
end
|
|
|
always@(posedge pclk)
|
always@(posedge pclk)
|
begin
|
begin
|
|
|
if(!resetn)
|
if(!resetn)
|
begin
|
begin
|
after128us <= 12'd0;
|
after128us <= 12'd0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
if(state_fsm == error_wait | state_fsm == started | state_fsm == connecting)
|
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 | rx_got_bit)
|
if(!resetn)
|
|
begin
|
|
after850ns <= 12'd0;
|
|
end
|
|
else
|
|
begin
|
|
if(rx_got_bit)
|
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 <= 12'd0;
|
after850ns <= 12'd0;
|
end
|
end
|
|
end
|
|
|
end
|
end
|
|
|
endmodule
|
endmodule
|
|
|