x393  1.0
FPGAcodeforElphelNC393camera
oob_ctrl.v
Go to the documentation of this file.
1 
39 //`include "oob.v"
40 module oob_ctrl #(
41  parameter DATA_BYTE_WIDTH = 4,
42  parameter CLK_SPEED_GRADE = 1 // 1 - 75 Mhz, 2 - 150Mhz, 4 - 300Mhz
43 )
44 (
45  input wire clk, // input wire // sata clk = usrclk2
46  input wire rst, // input wire // reset oob
47  input wire gtx_ready, // input wire // gtx is ready = all resets are done
48  output wire [11:0] debug, // output[11:0] wire
49  input wire rxcominitdet_in,// input wire // oob responses
50  input wire rxcomwakedet_in,// input wire // oob responses
51  input wire rxelecidle_in, // input wire // oob responses
52  output wire txcominit, // output wire // oob issues
53  output wire txcomwake, // output wire // oob issues
54  output wire txelecidle, // output wire // oob issues
55  output wire txpcsreset_req, // output wire // partial tx reset
56  input wire recal_tx_done, // input wire
57  output wire rxreset_req, // output wire // rx reset (after rxelecidle -> 0)
58  input wire rxreset_ack, // input wire
59  // Andrey: adding new signal and state - after RX is operational try re-align clock
60  output wire clk_phase_align_req, // Request GTX to align SIPO parallel clock and user- provided RXUSRCLK
61  input wire clk_phase_align_ack, // GTX aligned clock phase (DEBUG - not always clear when it works or not)
62 
63  input wire [DATA_BYTE_WIDTH*8 - 1:0] txdata_in, // output[31:0] wire // input data stream (if any data during OOB setting => ignored)
64  input wire [DATA_BYTE_WIDTH - 1:0] txcharisk_in, // output[3:0] wire // input data stream (if any data during OOB setting => ignored)
65  output wire [DATA_BYTE_WIDTH*8 - 1:0] txdata_out, // output[31:0] wire // output data stream to gtx
66  output wire [DATA_BYTE_WIDTH - 1:0] txcharisk_out, // output[3:0] wire // output data stream to gtx
67  input wire [DATA_BYTE_WIDTH*8 - 1:0] rxdata_in, // input[31:0] wire // input data from gtx
68  input wire [DATA_BYTE_WIDTH - 1:0] rxcharisk_in, // input[3:0] wire // input data from gtx
69  output wire [DATA_BYTE_WIDTH*8 - 1:0] rxdata_out, // output[31:0] wire // bypassed data from gtx
70  output wire [DATA_BYTE_WIDTH - 1:0] rxcharisk_out, // output[3:0] wire // bypassed data from gtx
71  input wire rxbyteisaligned,// input wire // obvious
72  output wire phy_ready, // output wire // shows if channel is ready
73  input set_offline, // input wire // electrically idle // From
74  input comreset_send, // input wire // Not possible yet? // From
75  output reg re_aligned // re-aligned after alignment loss
77 );
78 
79 // oob sequence needs to be issued
80 wire oob_start;
81 // connection established, all further data is valid
82 wire oob_done;
83 
84 // doc p265, link is established after 3back-to-back non-ALIGNp
85 wire link_up;
86 wire link_down;
87 
88 // the device itself sends cominit
90 // allow to respond to cominit
92 
93 // status information to handle by a control block if any exists
94 // incompatible host-device speed grades (host cannot lock to alignp)
95 wire oob_incompatible; // TODO
96 // timeout in an unexpected place
97 wire oob_error;
98 // noone responds to our cominits
100 // obvious
101 wire oob_busy;
102 
103 // 1 - link is up and running, 0 - probably not
105 // 1 - connection is being established OR already established, 0 - is not
107 
108 // Andrey: Force offline from AHCI
109 reg force_offline_r; // AHCI conrol need setting offline/sending comreset
110 always @ (posedge clk) begin
111  if (rst || comreset_send) force_offline_r <= 0;
112  else if (set_offline) force_offline_r <= 1;
113 end
114 
115 
116 // Andrey: Make phy ready not go inactive during re-aligning
117 ///assign phy_ready = link_state & gtx_ready & rxbyteisaligned;
120 always @ (posedge clk) begin
121  if (!(link_state & gtx_ready)) phy_ready_r <= 0;
122  else if (rxbyteisaligned) phy_ready_r <= 1;
123 
125 
127 end
128 assign phy_ready = phy_ready_r;
129 
130 always @ (posedge clk)
132 
133 always @ (posedge clk)
135 
136 // decide when to issue oob: always when gtx is ready
137 //assign oob_start = gtx_ready & ~oob_state & ~oob_busy;
139 
140 // set line to idle state before if we're waiting for a device to answer AND while oob sequence
142 //assign txelecidle = /*~oob_state |*/ txelecidle_inner ;
143 assign txelecidle = /*~oob_state |**/ txelecidle_inner || force_offline_r;
144 
145 // let devices always begin oob sequence, if only it's not a glitch
147 
148 oob #(
151 )
152 oob
153 (
154  .debug (debug), // output [11:0] reg
155  .clk (clk), // input wire // sata clk = usrclk2
156  .rst (rst), // input wire // reset oob
157  .rxcominitdet_in (rxcominitdet_in), // input wire // oob responses
158  .rxcomwakedet_in (rxcomwakedet_in), // input wire // oob responses
159  .rxelecidle_in (rxelecidle_in), // input wire // oob responses
160  .txcominit (txcominit), // output wire // oob issues
161  .txcomwake (txcomwake), // output wire // oob issues
162  .txelecidle (txelecidle_inner),// output wire // oob issues
163  .txpcsreset_req (txpcsreset_req), // output wire
164  .recal_tx_done (recal_tx_done), // input wire
165  .rxreset_req (rxreset_req), // output wire
166  .rxreset_ack (rxreset_ack), // input wire
167  .clk_phase_align_req (clk_phase_align_req), // output wire
168  .clk_phase_align_ack (clk_phase_align_ack), // input wire
169  .txdata_in (txdata_in), // input [31:0] wire // input data stream (if any data during OOB setting => ignored)
170  .txcharisk_in (txcharisk_in), // input [3:0] wire // input data stream (if any data during OOB setting => ignored)
171  .txdata_out (txdata_out), // output [31:0] wire // output data stream to gtx
172  .txcharisk_out (txcharisk_out), // output [3:0] wire// output data stream to gtx
173  .rxdata_in (rxdata_in), // input [31:0] wire // input data from gtx
174  .rxcharisk_in (rxcharisk_in), // input [3:0] wire // input data from gtx
175  .rxdata_out (rxdata_out), // output [31:0] wire // bypassed data from gtx
176  .rxcharisk_out (rxcharisk_out), // output [3:0] wire // bypassed data from gtx
177  .oob_start (oob_start), // input wire // oob sequence needs to be issued
178  .oob_done (oob_done), // output wire // connection established, all further data is valid
179  .oob_busy (oob_busy), // output wire // oob can't handle new start request
180  .link_up (link_up), // output wire // doc p265, link is established after 3back-to-back non-ALIGNp
181  .link_down (link_down), // output wire
182  .cominit_req (cominit_req), // output wire // the device itself sends cominit
183  .cominit_allow (cominit_allow), // input wire // allow to respond to cominit
184  // status information to handle by a control block if any exists
185  .oob_incompatible (oob_incompatible),// output wire // incompatible host-device speed grades (host cannot lock to alignp)
186  .oob_error (oob_error), // output wire // timeout in an unexpected place
187  .oob_silence (oob_silence) // output wire // noone responds to our cominits
189 );
190 
191 
192 endmodule
wire 15320oob_incompatible
Definition: oob.v:92
wire 15401rst
Definition: oob_ctrl.v:46
15435cominit_allowwire
Definition: oob_ctrl.v:91
15439oob_busywire
Definition: oob_ctrl.v:101
15430oob_startwire
Definition: oob_ctrl.v:80
wire 15321oob_error
Definition: oob.v:93
wire 15314oob_done
Definition: oob.v:83
15441oob_statereg
Definition: oob_ctrl.v:106
15429debug_detected_alignp
Definition: oob_ctrl.v:76
reg 15428re_aligned
Definition: oob_ctrl.v:75
wire 15408txcomwake
Definition: oob_ctrl.v:53
wire 15301rxreset_req
Definition: oob.v:63
wire 15300recal_tx_done
Definition: oob.v:62
wire 15406rxelecidle_in
Definition: oob_ctrl.v:51
wire 15315oob_busy
Definition: oob.v:84
15427comreset_send
Definition: oob_ctrl.v:74
wire 15400clk
Definition: oob_ctrl.v:45
wire 15404rxcominitdet_in
Definition: oob_ctrl.v:49
wire 15316link_up
Definition: oob.v:85
wire [DATA_BYTE_WIDTH*8 - 1:0] 15422rxdata_out
Definition: oob_ctrl.v:69
15426set_offline
Definition: oob_ctrl.v:73
wire 15322oob_silence
Definition: oob.v:94
15399CLK_SPEED_GRADE1
Definition: oob_ctrl.v:42
wire 15298txelecidle
Definition: oob.v:60
wire 15411recal_tx_done
Definition: oob_ctrl.v:56
wire 15302rxreset_ack
Definition: oob.v:64
wire [DATA_BYTE_WIDTH*8 - 1:0] 15307txdata_out
Definition: oob.v:73
15432link_upwire
Definition: oob_ctrl.v:85
wire 15425phy_ready
Definition: oob_ctrl.v:72
15444was_aligned_rreg
Definition: oob_ctrl.v:119
wire [DATA_BYTE_WIDTH*8 - 1:0] 15416txdata_in
Definition: oob_ctrl.v:63
wire 15299txpcsreset_req
Definition: oob.v:61
wire 15412rxreset_req
Definition: oob_ctrl.v:57
oob oob
Definition: oob_ctrl.v:148
15438oob_silencewire
Definition: oob_ctrl.v:99
wire [DATA_BYTE_WIDTH - 1:0] 15312rxcharisk_out
Definition: oob.v:80
wire [DATA_BYTE_WIDTH*8 - 1:0] 15305txdata_in
Definition: oob.v:70
wire 15317link_down
Definition: oob.v:86
wire 15405rxcomwakedet_in
Definition: oob_ctrl.v:50
reg [11:0] 15290debug
Definition: oob.v:50
wire [DATA_BYTE_WIDTH - 1:0] 15310rxcharisk_in
Definition: oob.v:77
wire [DATA_BYTE_WIDTH - 1:0] 15421rxcharisk_in
Definition: oob_ctrl.v:68
wire 15414clk_phase_align_req
Definition: oob_ctrl.v:60
wire 15293rxcominitdet_in
Definition: oob.v:54
wire [DATA_BYTE_WIDTH - 1:0] 15423rxcharisk_out
Definition: oob_ctrl.v:70
15437oob_errorwire
Definition: oob_ctrl.v:97
15434cominit_reqwire
Definition: oob_ctrl.v:89
wire 15413rxreset_ack
Definition: oob_ctrl.v:58
wire 15313oob_start
Definition: oob.v:82
15442force_offline_rreg
Definition: oob_ctrl.v:109
wire [DATA_BYTE_WIDTH*8 - 1:0] 15309rxdata_in
Definition: oob.v:76
wire [DATA_BYTE_WIDTH*8 - 1:0] 15418txdata_out
Definition: oob_ctrl.v:65
wire 15295rxelecidle_in
Definition: oob.v:56
wire 15292rst
Definition: oob.v:52
wire 15304clk_phase_align_ack
Definition: oob.v:68
wire 15297txcomwake
Definition: oob.v:59
15440link_statereg
Definition: oob_ctrl.v:104
wire 15402gtx_ready
Definition: oob_ctrl.v:47
15436oob_incompatiblewire
Definition: oob_ctrl.v:95
wire 15294rxcomwakedet_in
Definition: oob.v:55
wire 15303clk_phase_align_req
Definition: oob.v:67
15445txelecidle_innerwire
Definition: oob_ctrl.v:141
wire 15291clk
Definition: oob.v:51
wire [DATA_BYTE_WIDTH - 1:0] 15419txcharisk_out
Definition: oob_ctrl.v:66
wire 15296txcominit
Definition: oob.v:58
wire [DATA_BYTE_WIDTH - 1:0] 15417txcharisk_in
Definition: oob_ctrl.v:64
15323debug_detected_alignp
Definition: oob.v:96
wire 15415clk_phase_align_ack
Definition: oob_ctrl.v:61
15433link_downwire
Definition: oob_ctrl.v:86
15431oob_donewire
Definition: oob_ctrl.v:82
wire 15410txpcsreset_req
Definition: oob_ctrl.v:55
wire 15409txelecidle
Definition: oob_ctrl.v:54
wire 15318cominit_req
Definition: oob.v:87
15398DATA_BYTE_WIDTH4
Definition: oob_ctrl.v:41
wire 15319cominit_allow
Definition: oob.v:88
wire [11:0] 15403debug
Definition: oob_ctrl.v:48
15443phy_ready_rreg
Definition: oob_ctrl.v:118
wire [DATA_BYTE_WIDTH*8 - 1:0] 15311rxdata_out
Definition: oob.v:79
wire [DATA_BYTE_WIDTH - 1:0] 15308txcharisk_out
Definition: oob.v:74
wire 15407txcominit
Definition: oob_ctrl.v:52
wire [DATA_BYTE_WIDTH*8 - 1:0] 15420rxdata_in
Definition: oob_ctrl.v:67
wire 15424rxbyteisaligned
Definition: oob_ctrl.v:71
wire [DATA_BYTE_WIDTH - 1:0] 15306txcharisk_in
Definition: oob.v:71