61 input out_ep_data_avail,
63 output out_ep_data_get,
64 input [7:0] out_ep_data,
73 input in_ep_data_free,
75 output in_ep_data_put,
76 output [7:0] in_ep_data,
77 output in_ep_data_done,
82 input [7:0] uart_in_data,
87 output [7:0] uart_out_data,
88 output uart_out_valid,
95 localparam TimeoutWidth = 3;
98 assign out_ep_stall = 1'b0;
99 assign in_ep_stall = 1'b0;
102 reg [7:0] uart_out_data_reg;
103 reg [7:0] uart_out_data_overflow_reg;
104 reg uart_out_valid_reg;
108 reg out_ep_data_get_reg;
111 reg [1:0] pipeline_out_state;
113 localparam PipelineOutState_Idle = 0;
114 localparam PipelineOutState_WaitData = 1;
115 localparam PipelineOutState_PushData = 2;
116 localparam PipelineOutState_WaitPipeline = 3;
119 assign uart_out_data = uart_out_data_reg;
120 assign uart_out_valid = uart_out_valid_reg;
124 assign out_ep_req = ( out_ep_req_reg || out_ep_data_avail );
126 wire out_granted_data_available;
128 assign out_granted_data_available = out_ep_req && out_ep_grant;
130 assign out_ep_data_get = ( uart_out_ready || ~uart_out_valid_reg ) && out_ep_data_get_reg;
132 reg [7:0] out_stall_data;
136 always @(posedge clk) begin
138 pipeline_out_state <= PipelineOutState_Idle;
139 uart_out_data_reg <= 0;
140 uart_out_valid_reg <= 0;
142 out_ep_data_get_reg <= 0;
144 out_stall_valid <= 0;
146 case( pipeline_out_state )
147 PipelineOutState_Idle: begin
149 if ( out_granted_data_available ) begin
151 out_ep_data_get_reg <= 1;
155 pipeline_out_state <= PipelineOutState_WaitData;
156 uart_out_valid_reg <= 0;
158 out_stall_valid <= 0;
161 PipelineOutState_WaitData: begin
164 if ( uart_out_ready || ~uart_out_valid_reg ) begin
167 if ( out_stall_valid ) begin
168 uart_out_data_reg <= out_stall_data;
169 uart_out_valid_reg <= 1;
171 out_stall_valid <= 0;
172 if ( out_ep_data_avail )
173 pipeline_out_state <= PipelineOutState_PushData;
175 pipeline_out_state <= PipelineOutState_WaitPipeline;
178 pipeline_out_state <= PipelineOutState_PushData;
182 PipelineOutState_PushData: begin
184 if ( uart_out_ready || ~uart_out_valid_reg ) begin
186 uart_out_data_reg <= out_ep_data;
187 uart_out_valid_reg <= 1;
188 if ( ~out_ep_data_avail ) begin
190 out_ep_data_get_reg <= 0;
191 pipeline_out_state <= PipelineOutState_WaitPipeline;
196 out_stall_data <= out_ep_data;
197 out_stall_valid <= 1;
198 pipeline_out_state <= PipelineOutState_WaitData;
199 if ( ~out_ep_data_avail )
200 out_ep_data_get_reg <= 0;
203 PipelineOutState_WaitPipeline: begin
206 if ( uart_out_ready ) begin
207 uart_out_valid_reg <= 0;
208 uart_out_data_reg <= 0;
209 pipeline_out_state <= PipelineOutState_Idle;
220 reg in_ep_data_done_reg;
223 reg [1:0] pipeline_in_state;
225 localparam PipelineInState_Idle = 0;
226 localparam PipelineInState_WaitData = 1;
227 localparam PipelineInState_CycleData = 2;
228 localparam PipelineInState_WaitEP = 3;
231 assign uart_in_ready = ( pipeline_in_state == PipelineInState_CycleData ) && in_ep_data_free;
237 assign in_ep_req = ( uart_in_valid && in_ep_data_free) || in_ep_req_reg;
240 wire in_granted_in_valid = in_ep_grant && uart_in_valid;
244 assign in_ep_data_put = ( pipeline_in_state == PipelineInState_CycleData ) && uart_in_valid && in_ep_data_free;
246 assign in_ep_data_done = in_ep_data_done_reg;
248 assign in_ep_data = uart_in_data;
253 reg [TimeoutWidth:0] in_ep_timeout;
256 always @(posedge clk) begin
258 pipeline_in_state <= PipelineInState_Idle;
260 in_ep_data_done_reg <= 0;
262 case( pipeline_in_state )
263 PipelineInState_Idle: begin
264 in_ep_data_done_reg <= 0;
265 if ( in_granted_in_valid && in_ep_data_free ) begin
269 pipeline_in_state <= PipelineInState_CycleData;
272 PipelineInState_CycleData: begin
273 if (uart_in_valid ) begin
274 if ( ~in_ep_data_free ) begin
276 pipeline_in_state <= PipelineInState_Idle;
284 pipeline_in_state <= PipelineInState_WaitData;
287 PipelineInState_WaitData: begin
288 in_ep_timeout <= in_ep_timeout + 1;
289 if ( uart_in_valid ) begin
290 pipeline_in_state <= PipelineInState_CycleData;
293 if ( in_ep_timeout[ TimeoutWidth ] ) begin
294 in_ep_data_done_reg <= 1;
295 pipeline_in_state <= PipelineInState_WaitEP;
300 PipelineInState_WaitEP: begin
302 in_ep_data_done_reg <= 0;
305 pipeline_in_state <= PipelineInState_Idle;
313 assign debug = { in_ep_data_free, in_ep_data_done, pipeline_in_state[ 1 ], pipeline_in_state[ 0 ] };
module usb_uart_bridge_ep(input clk, input reset, output out_ep_req, input out_ep_grant, input out_ep_data_avail, input out_ep_setup, output out_ep_data_get, input[8] out_ep_data, output out_ep_stall, input out_ep_acked, output in_ep_req, input in_ep_grant, input in_ep_data_free, output in_ep_data_put, output[8] in_ep_data, output in_ep_data_done, output in_ep_stall, input in_ep_acked, input[8] uart_in_data, input uart_in_valid, output uart_in_ready, output[8] uart_out_data, output uart_out_valid, input uart_out_ready, output[4] debug)