vt52-fpga  1.0.0 Initial
vt52-fpga is a serial terminal implemented on a FPGA
usb_fs_pe.v
Go to the documentation of this file.
1 module usb_fs_pe #(
2  parameter [4:0] NUM_OUT_EPS = 1,
3  parameter [4:0] NUM_IN_EPS = 1
4 ) (
5  input clk,
6  input [6:0] dev_addr,
7 
8 
9  ////////////////////////////////////////////////////////////////////////////////
10  ////////////////////////////////////////////////////////////////////////////////
11  /// USB Endpoint Interface
12  ////////////////////////////////////////////////////////////////////////////////
13  ////////////////////////////////////////////////////////////////////////////////
14 
15  ////////////////////
16  // global endpoint interface
17  ////////////////////
18  input reset,
19 
20 
21  ////////////////////
22  // out endpoint interfaces
23  ////////////////////
24  input [NUM_OUT_EPS-1:0] out_ep_req,
25  output [NUM_OUT_EPS-1:0] out_ep_grant,
26  output [NUM_OUT_EPS-1:0] out_ep_data_avail,
27  output [NUM_OUT_EPS-1:0] out_ep_setup,
28  input [NUM_OUT_EPS-1:0] out_ep_data_get,
29  output [7:0] out_ep_data,
30  input [NUM_OUT_EPS-1:0] out_ep_stall,
31  output [NUM_OUT_EPS-1:0] out_ep_acked,
32 
33 
34  ////////////////////
35  // in endpoint interfaces
36  ////////////////////
37  input [NUM_IN_EPS-1:0] in_ep_req,
38  output [NUM_IN_EPS-1:0] in_ep_grant,
39  output [NUM_IN_EPS-1:0] in_ep_data_free,
40  input [NUM_IN_EPS-1:0] in_ep_data_put,
41  input [(NUM_IN_EPS*8)-1:0] in_ep_data,
42  input [NUM_IN_EPS-1:0] in_ep_data_done,
43  input [NUM_IN_EPS-1:0] in_ep_stall,
44  output [NUM_IN_EPS-1:0] in_ep_acked,
45 
46 
47  ////////////////////
48  // sof interface
49  ////////////////////
50  output sof_valid,
51  output [10:0] frame_index,
52 
53 
54 
55  ////////////////////////////////////////////////////////////////////////////////
56  ////////////////////////////////////////////////////////////////////////////////
57  /// USB TX/RX Interface
58  ////////////////////////////////////////////////////////////////////////////////
59  ////////////////////////////////////////////////////////////////////////////////
60  output usb_p_tx,
61  output usb_n_tx,
62 
63  input usb_p_rx,
64  input usb_n_rx,
65 
66  output usb_tx_en,
67 
68  output [7:0] debug
69 );
70  // in pe interface
71  wire [7:0] arb_in_ep_data;
72 
73  // rx interface
74  wire bit_strobe;
75  wire rx_pkt_start;
76  wire rx_pkt_end;
77  wire [3:0] rx_pid;
78  wire [6:0] rx_addr;
79  wire [3:0] rx_endp;
80  wire [10:0] rx_frame_num;
81  wire rx_data_put;
82  wire [7:0] rx_data;
83  wire rx_pkt_valid;
84 
85  // tx mux
86  wire in_tx_pkt_start;
87  wire [3:0] in_tx_pid;
88  wire out_tx_pkt_start;
89  wire [3:0] out_tx_pid;
90 
91  // tx interface
92  wire tx_pkt_start;
93  wire tx_pkt_end;
94  wire [3:0] tx_pid;
95  wire tx_data_avail;
96  wire tx_data_get;
97  wire [7:0] tx_data;
98 
99  // sof interface
100  assign sof_valid = rx_pkt_end && rx_pkt_valid && rx_pid == 4'b0101;
101  assign frame_index = rx_frame_num;
102 
103 
104  usb_fs_in_arb #(
105  .NUM_IN_EPS(NUM_IN_EPS)
106  ) usb_fs_in_arb_inst (
107  // endpoint interface
108  .in_ep_req(in_ep_req),
109  .in_ep_grant(in_ep_grant),
110  .in_ep_data(in_ep_data),
111 
112  // protocol engine interface
113  .arb_in_ep_data(arb_in_ep_data)
114  );
115 
116  usb_fs_out_arb #(
117  .NUM_OUT_EPS(NUM_OUT_EPS)
118  ) usb_fs_out_arb_inst (
119  // endpoint interface
120  .out_ep_req(out_ep_req),
121  .out_ep_grant(out_ep_grant)
122  );
123 
124  usb_fs_in_pe #(
125  .NUM_IN_EPS(NUM_IN_EPS)
126  ) usb_fs_in_pe_inst (
127  .clk(clk),
128  .reset(reset),
129  .reset_ep({NUM_IN_EPS{1'b0}}),
130  .dev_addr(dev_addr),
131 
132  // endpoint interface
133  .in_ep_data_free(in_ep_data_free),
134  .in_ep_data_put(in_ep_data_put),
135  .in_ep_data(arb_in_ep_data),
136  .in_ep_data_done(in_ep_data_done),
137  .in_ep_stall(in_ep_stall),
138  .in_ep_acked(in_ep_acked),
139 
140  // rx path
141  .rx_pkt_start(rx_pkt_start),
142  .rx_pkt_end(rx_pkt_end),
143  .rx_pkt_valid(rx_pkt_valid),
144  .rx_pid(rx_pid),
145  .rx_addr(rx_addr),
146  .rx_endp(rx_endp),
147  .rx_frame_num(rx_frame_num),
148 
149  // tx path
150  .tx_pkt_start(in_tx_pkt_start),
151  .tx_pkt_end(tx_pkt_end),
152  .tx_pid(in_tx_pid),
153  .tx_data_avail(tx_data_avail),
154  .tx_data_get(tx_data_get),
155  .tx_data(tx_data),
156 
157  .debug(debug)
158  );
159 
160  usb_fs_out_pe #(
161  .NUM_OUT_EPS(NUM_OUT_EPS)
162  ) usb_fs_out_pe_inst (
163  .clk(clk),
164  .reset(reset),
165  .reset_ep({NUM_OUT_EPS{1'b0}}),
166  .dev_addr(dev_addr),
167 
168  // endpoint interface
169  .out_ep_data_avail(out_ep_data_avail),
170  .out_ep_data_get(out_ep_data_get),
171  .out_ep_data(out_ep_data),
172  .out_ep_setup(out_ep_setup),
173  .out_ep_stall(out_ep_stall),
174  .out_ep_acked(out_ep_acked),
175  .out_ep_grant(out_ep_grant),
176 
177  // rx path
178  .rx_pkt_start(rx_pkt_start),
179  .rx_pkt_end(rx_pkt_end),
180  .rx_pkt_valid(rx_pkt_valid),
181  .rx_pid(rx_pid),
182  .rx_addr(rx_addr),
183  .rx_endp(rx_endp),
184  .rx_frame_num(rx_frame_num),
185  .rx_data_put(rx_data_put),
186  .rx_data(rx_data),
187 
188  // tx path
189  .tx_pkt_start(out_tx_pkt_start),
190  .tx_pkt_end(tx_pkt_end),
191  .tx_pid(out_tx_pid)
192  );
193 
194  usb_fs_rx usb_fs_rx_inst (
195  .clk_48mhz(clk),
196  .reset(reset),
197  .dp(usb_p_rx),
198  .dn(usb_n_rx),
199  .bit_strobe(bit_strobe),
200  .pkt_start(rx_pkt_start),
201  .pkt_end(rx_pkt_end),
202  .pid(rx_pid),
203  .addr(rx_addr),
204  .endp(rx_endp),
205  .frame_num(rx_frame_num),
206  .rx_data_put(rx_data_put),
207  .rx_data(rx_data),
208  .valid_packet(rx_pkt_valid)
209  );
210 
211  usb_fs_tx_mux usb_fs_tx_mux_inst (
212  // interface to IN Protocol Engine
213  .in_tx_pkt_start(in_tx_pkt_start),
214  .in_tx_pid(in_tx_pid),
215 
216  // interface to OUT Protocol Engine
217  .out_tx_pkt_start(out_tx_pkt_start),
218  .out_tx_pid(out_tx_pid),
219 
220  // interface to tx module
221  .tx_pkt_start(tx_pkt_start),
222  .tx_pid(tx_pid)
223  );
224 
225  usb_fs_tx usb_fs_tx_inst (
226  .clk_48mhz(clk),
227  .reset(reset),
228  .bit_strobe(bit_strobe),
229  .oe(usb_tx_en),
230  .dp(usb_p_tx),
231  .dn(usb_n_tx),
232  .pkt_start(tx_pkt_start),
233  .pkt_end(tx_pkt_end),
234  .pid(tx_pid),
235  .tx_data_avail(tx_data_avail),
236  .tx_data_get(tx_data_get),
237  .tx_data(tx_data)
238  );
239 endmodule
module usb_fs_tx(input clk_48mhz, input reset, input bit_strobe, output reg oe=0, output reg dp=0, output reg dn=0, input pkt_start, output pkt_end, input[4] pid, input tx_data_avail, output reg tx_data_get=0, input[8] tx_data)
Definition: usb_fs_tx.v:1
module usb_fs_in_pe(input clk, input reset, input[NUM_IN_EPS-1:0] reset_ep, input[7] dev_addr, output reg< NUM_IN_EPS-1:0 > in_ep_data_free=0, input[NUM_IN_EPS-1:0] in_ep_data_put, input[8] in_ep_data, input[NUM_IN_EPS-1:0] in_ep_data_done, input[NUM_IN_EPS-1:0] in_ep_stall, output reg< NUM_IN_EPS-1:0 > in_ep_acked=0, input rx_pkt_start, input rx_pkt_end, input rx_pkt_valid, input[4] rx_pid, input[7] rx_addr, input[4] rx_endp, input[10:0] rx_frame_num, output reg tx_pkt_start=0, input tx_pkt_end, output reg< 3:0 > tx_pid=0, output tx_data_avail, input tx_data_get, output reg< 7:0 > tx_data, output[8] debug)
Definition: usb_fs_in_pe.v:5
module usb_fs_rx(input clk_48mhz, input reset, input dp, input dn, output bit_strobe, output pkt_start, output pkt_end, output[4] pid, output reg< 6:0 > addr=0, output reg< 3:0 > endp=0, output reg< 10:0 > frame_num=0, output rx_data_put, output[8] rx_data, output valid_packet)
Definition: usb_fs_rx.v:1
module usb_fs_in_arb(input[NUM_IN_EPS-1:0] in_ep_req, output reg< NUM_IN_EPS-1:0 > in_ep_grant, input[(NUM_IN_EPS *8) -1:0] in_ep_data, output reg< 7:0 > arb_in_ep_data)
Definition: usb_fs_in_arb.v:3
module usb_fs_out_pe(input clk, input reset, input[NUM_OUT_EPS-1:0] reset_ep, input[7] dev_addr, output[NUM_OUT_EPS-1:0] out_ep_data_avail, output reg< NUM_OUT_EPS-1:0 > out_ep_setup=0, input[NUM_OUT_EPS-1:0] out_ep_data_get, output reg< 7:0 > out_ep_data, input[NUM_OUT_EPS-1:0] out_ep_stall, output reg< NUM_OUT_EPS-1:0 > out_ep_acked=0, input[NUM_OUT_EPS-1:0] out_ep_grant, input rx_pkt_start, input rx_pkt_end, input rx_pkt_valid, input[4] rx_pid, input[7] rx_addr, input[4] rx_endp, input[10:0] rx_frame_num, input rx_data_put, input[8] rx_data, output reg tx_pkt_start=0, input tx_pkt_end, output reg< 3:0 > tx_pid=0)
Definition: usb_fs_out_pe.v:5
module usb_fs_tx_mux(input in_tx_pkt_start, input[4] in_tx_pid, input out_tx_pkt_start, input[4] out_tx_pid, output tx_pkt_start, output[4] tx_pid)
Definition: usb_fs_tx_mux.v:1
module usb_fs_out_arb(input[NUM_OUT_EPS-1:0] out_ep_req, output reg< NUM_OUT_EPS-1:0 > out_ep_grant)
Definition: usb_fs_out_arb.v:3
module usb_fs_pe(input clk, input[7] dev_addr, input reset, input[NUM_OUT_EPS-1:0] out_ep_req, output[NUM_OUT_EPS-1:0] out_ep_grant, output[NUM_OUT_EPS-1:0] out_ep_data_avail, output[NUM_OUT_EPS-1:0] out_ep_setup, input[NUM_OUT_EPS-1:0] out_ep_data_get, output[8] out_ep_data, input[NUM_OUT_EPS-1:0] out_ep_stall, output[NUM_OUT_EPS-1:0] out_ep_acked, input[NUM_IN_EPS-1:0] in_ep_req, output[NUM_IN_EPS-1:0] in_ep_grant, output[NUM_IN_EPS-1:0] in_ep_data_free, input[NUM_IN_EPS-1:0] in_ep_data_put, input[(NUM_IN_EPS *8) -1:0] in_ep_data, input[NUM_IN_EPS-1:0] in_ep_data_done, input[NUM_IN_EPS-1:0] in_ep_stall, output[NUM_IN_EPS-1:0] in_ep_acked, output sof_valid, output[10:0] frame_index, output usb_p_tx, output usb_n_tx, input usb_p_rx, input usb_n_rx, output usb_tx_en, output[8] debug)
Definition: usb_fs_pe.v:4