usb.v 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. /*
  2. * usb.v
  3. *
  4. * vim: ts=4 sw=4
  5. *
  6. * Copyright (C) 2019 Sylvain Munaut
  7. * All rights reserved.
  8. *
  9. * LGPL v3+, see LICENSE.lgpl3
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU Lesser General Public
  13. * License as published by the Free Software Foundation; either
  14. * version 3 of the License, or (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * Lesser General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public License
  22. * along with this program; if not, write to the Free Software Foundation,
  23. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  24. */
  25. `default_nettype none
  26. module usb #(
  27. parameter TARGET = "ICE40",
  28. parameter integer EPDW = 16,
  29. parameter integer EVT_DEPTH = 0,
  30. /* Auto-set */
  31. parameter integer EPAW = 11 - $clog2(EPDW / 8)
  32. )(
  33. // Pads
  34. inout wire pad_dp,
  35. inout wire pad_dn,
  36. output reg pad_pu,
  37. // EP buffer interface
  38. input wire [EPAW-1:0] ep_tx_addr_0,
  39. input wire [EPDW-1:0] ep_tx_data_0,
  40. input wire ep_tx_we_0,
  41. input wire [EPAW-1:0] ep_rx_addr_0,
  42. output wire [EPDW-1:0] ep_rx_data_1,
  43. input wire ep_rx_re_0,
  44. input wire ep_clk,
  45. // Bus interface
  46. input wire [11:0] bus_addr,
  47. input wire [15:0] bus_din,
  48. output wire [15:0] bus_dout,
  49. input wire bus_cyc,
  50. input wire bus_we,
  51. output wire bus_ack,
  52. // IRQ
  53. output wire irq,
  54. // SOF indication
  55. output wire sof,
  56. // Common
  57. input wire clk,
  58. input wire rst
  59. );
  60. // Signals
  61. // -------
  62. // PHY
  63. wire phy_rx_dp;
  64. wire phy_rx_dn;
  65. wire phy_rx_chg;
  66. wire phy_tx_dp;
  67. wire phy_tx_dn;
  68. wire phy_tx_en;
  69. // TX Low-Level
  70. wire txll_start;
  71. wire txll_bit;
  72. wire txll_last;
  73. wire txll_ack;
  74. // TX Packet
  75. wire txpkt_start;
  76. wire txpkt_done;
  77. wire [3:0] txpkt_pid;
  78. wire [9:0] txpkt_len;
  79. wire [7:0] txpkt_data;
  80. wire txpkt_data_ack;
  81. // RX Low-Level
  82. wire [1:0] rxll_sym;
  83. wire rxll_bit;
  84. wire rxll_valid;
  85. wire rxll_eop;
  86. wire rxll_sync;
  87. wire rxll_bs_skip;
  88. wire rxll_bs_err;
  89. // RX Packet
  90. wire rxpkt_start;
  91. wire rxpkt_done_ok;
  92. wire rxpkt_done_err;
  93. wire [ 3:0] rxpkt_pid;
  94. wire rxpkt_is_sof;
  95. wire rxpkt_is_token;
  96. wire rxpkt_is_data;
  97. wire rxpkt_is_handshake;
  98. wire [10:0] rxpkt_frameno;
  99. wire [ 6:0] rxpkt_addr;
  100. wire [ 3:0] rxpkt_endp;
  101. wire [ 7:0] rxpkt_data;
  102. wire rxpkt_data_stb;
  103. // EP Buffers
  104. wire [10:0] buf_tx_addr_0;
  105. wire [ 7:0] buf_tx_data_1;
  106. wire buf_tx_rden_0;
  107. wire [10:0] buf_rx_addr_0;
  108. wire [ 7:0] buf_rx_data_0;
  109. wire buf_rx_wren_0;
  110. // EP Status
  111. wire eps_read_0;
  112. wire eps_zero_0;
  113. wire eps_write_0;
  114. wire [ 7:0] eps_addr_0;
  115. wire [15:0] eps_wrdata_0;
  116. wire [15:0] eps_rddata_3;
  117. wire eps_bus_ready;
  118. reg eps_bus_read;
  119. wire eps_bus_zero;
  120. reg eps_bus_write;
  121. wire [15:0] eps_bus_dout;
  122. // Config / Status registers
  123. reg cr_pu_ena;
  124. reg cr_cel_ena;
  125. reg cr_addr_chk;
  126. reg [ 6:0] cr_addr;
  127. wire cel_state;
  128. reg cel_rel;
  129. // Bus interface
  130. reg csr_bus_req;
  131. wire csr_bus_clear;
  132. wire csr_bus_ack;
  133. reg [15:0] csr_bus_dout;
  134. wire [15:0] csr_readout;
  135. reg cr_bus_we;
  136. reg eps_bus_req;
  137. wire eps_bus_clear;
  138. reg eps_bus_ack_wait;
  139. wire eps_bus_req_ok;
  140. reg [2:0] eps_bus_req_ok_dly;
  141. wire [15:0] evt_rd_data;
  142. wire evt_rd_rdy;
  143. reg evt_rd_ack;
  144. // Events
  145. wire [11:0] evt_data;
  146. wire evt_stb;
  147. // Out-of-band conditions
  148. wire oob_se0;
  149. wire oob_sof;
  150. reg [19:0] timeout_suspend; // 3 ms with no activity
  151. reg [19:0] timeout_reset; // 10 ms SE0
  152. wire usb_suspend;
  153. wire usb_reset;
  154. reg rst_pending;
  155. reg rst_clear;
  156. // Start-Of-Frame indication
  157. reg sof_ind;
  158. reg sof_pending;
  159. reg sof_clear;
  160. // PHY
  161. // ---
  162. usb_phy #(
  163. .TARGET(TARGET)
  164. ) phy_I (
  165. .pad_dp(pad_dp),
  166. .pad_dn(pad_dn),
  167. .rx_dp(phy_rx_dp),
  168. .rx_dn(phy_rx_dn),
  169. .rx_chg(phy_rx_chg),
  170. .tx_dp(phy_tx_dp),
  171. .tx_dn(phy_tx_dn),
  172. `ifdef SIM
  173. .tx_en(1'b0),
  174. `else
  175. .tx_en(phy_tx_en),
  176. `endif
  177. .clk(clk),
  178. .rst(rst)
  179. );
  180. // TX
  181. // --
  182. usb_tx_ll tx_ll_I (
  183. .phy_tx_dp(phy_tx_dp),
  184. .phy_tx_dn(phy_tx_dn),
  185. .phy_tx_en(phy_tx_en),
  186. .ll_start(txll_start),
  187. .ll_bit(txll_bit),
  188. .ll_last(txll_last),
  189. .ll_ack(txll_ack),
  190. .clk(clk),
  191. .rst(rst)
  192. );
  193. usb_tx_pkt tx_pkt_I (
  194. .ll_start(txll_start),
  195. .ll_bit(txll_bit),
  196. .ll_last(txll_last),
  197. .ll_ack(txll_ack),
  198. .pkt_start(txpkt_start),
  199. .pkt_done(txpkt_done),
  200. .pkt_pid(txpkt_pid),
  201. .pkt_len(txpkt_len),
  202. .pkt_data(txpkt_data),
  203. .pkt_data_ack(txpkt_data_ack),
  204. .clk(clk),
  205. .rst(rst)
  206. );
  207. // RX
  208. // --
  209. usb_rx_ll rx_ll_I (
  210. .phy_rx_dp(phy_rx_dp),
  211. .phy_rx_dn(phy_rx_dn),
  212. .phy_rx_chg(phy_rx_chg),
  213. .ll_sym(rxll_sym),
  214. .ll_bit(rxll_bit),
  215. .ll_valid(rxll_valid),
  216. .ll_eop(rxll_eop),
  217. .ll_sync(rxll_sync),
  218. .ll_bs_skip(rxll_bs_skip),
  219. .ll_bs_err(rxll_bs_err),
  220. .clk(clk),
  221. .rst(rst)
  222. );
  223. usb_rx_pkt rx_pkt_I (
  224. .ll_sym(rxll_sym),
  225. .ll_bit(rxll_bit),
  226. .ll_valid(rxll_valid),
  227. .ll_eop(rxll_eop),
  228. .ll_sync(rxll_sync),
  229. .ll_bs_skip(rxll_bs_skip),
  230. .ll_bs_err(rxll_bs_err),
  231. .pkt_start(rxpkt_start),
  232. .pkt_done_ok(rxpkt_done_ok),
  233. .pkt_done_err(rxpkt_done_err),
  234. .pkt_pid(rxpkt_pid),
  235. .pkt_is_sof(rxpkt_is_sof),
  236. .pkt_is_token(rxpkt_is_token),
  237. .pkt_is_data(rxpkt_is_data),
  238. .pkt_is_handshake(rxpkt_is_handshake),
  239. .pkt_frameno(rxpkt_frameno),
  240. .pkt_addr(rxpkt_addr),
  241. .pkt_endp(rxpkt_endp),
  242. .pkt_data(rxpkt_data),
  243. .pkt_data_stb(rxpkt_data_stb),
  244. .inhibit(phy_tx_en),
  245. .clk(clk),
  246. .rst(rst)
  247. );
  248. // Transaction control
  249. // -------------------
  250. usb_trans trans_I (
  251. .txpkt_start(txpkt_start),
  252. .txpkt_done(txpkt_done),
  253. .txpkt_pid(txpkt_pid),
  254. .txpkt_len(txpkt_len),
  255. .txpkt_data(txpkt_data),
  256. .txpkt_data_ack(txpkt_data_ack),
  257. .rxpkt_start(rxpkt_start),
  258. .rxpkt_done_ok(rxpkt_done_ok),
  259. .rxpkt_done_err(rxpkt_done_err),
  260. .rxpkt_pid(rxpkt_pid),
  261. .rxpkt_is_sof(rxpkt_is_sof),
  262. .rxpkt_is_token(rxpkt_is_token),
  263. .rxpkt_is_data(rxpkt_is_data),
  264. .rxpkt_is_handshake(rxpkt_is_handshake),
  265. .rxpkt_frameno(rxpkt_frameno),
  266. .rxpkt_addr(rxpkt_addr),
  267. .rxpkt_endp(rxpkt_endp),
  268. .rxpkt_data(rxpkt_data),
  269. .rxpkt_data_stb(rxpkt_data_stb),
  270. .buf_tx_addr_0(buf_tx_addr_0),
  271. .buf_tx_data_1(buf_tx_data_1),
  272. .buf_tx_rden_0(buf_tx_rden_0),
  273. .buf_rx_addr_0(buf_rx_addr_0),
  274. .buf_rx_data_0(buf_rx_data_0),
  275. .buf_rx_wren_0(buf_rx_wren_0),
  276. .eps_read_0(eps_read_0),
  277. .eps_zero_0(eps_zero_0),
  278. .eps_write_0(eps_write_0),
  279. .eps_addr_0(eps_addr_0),
  280. .eps_wrdata_0(eps_wrdata_0),
  281. .eps_rddata_3(eps_rddata_3),
  282. .cr_addr_chk(cr_addr_chk),
  283. .cr_addr(cr_addr),
  284. .evt_data(evt_data),
  285. .evt_stb(evt_stb),
  286. .cel_state(cel_state),
  287. .cel_rel(cel_rel),
  288. .cel_ena(cr_cel_ena),
  289. .clk(clk),
  290. .rst(rst)
  291. );
  292. // EP buffers
  293. // ----------
  294. usb_ep_buf #(
  295. .TARGET(TARGET),
  296. .RWIDTH(8),
  297. .WWIDTH(EPDW)
  298. ) tx_buf_I (
  299. .rd_addr_0(buf_tx_addr_0),
  300. .rd_data_1(buf_tx_data_1),
  301. .rd_en_0(buf_tx_rden_0),
  302. .rd_clk(clk),
  303. .wr_addr_0(ep_tx_addr_0),
  304. .wr_data_0(ep_tx_data_0),
  305. .wr_en_0(ep_tx_we_0),
  306. .wr_clk(ep_clk)
  307. );
  308. usb_ep_buf #(
  309. .TARGET(TARGET),
  310. .RWIDTH(EPDW),
  311. .WWIDTH(8)
  312. ) rx_buf_I (
  313. .rd_addr_0(ep_rx_addr_0),
  314. .rd_data_1(ep_rx_data_1),
  315. .rd_en_0(ep_rx_re_0),
  316. .rd_clk(ep_clk),
  317. .wr_addr_0(buf_rx_addr_0),
  318. .wr_data_0(buf_rx_data_0),
  319. .wr_en_0(buf_rx_wren_0),
  320. .wr_clk(clk)
  321. );
  322. // EP Status / Buffer Descriptors
  323. // ------------------------------
  324. usb_ep_status ep_status_I (
  325. .p_addr_0(eps_addr_0),
  326. .p_read_0(eps_read_0),
  327. .p_zero_0(eps_zero_0),
  328. .p_write_0(eps_write_0),
  329. .p_din_0(eps_wrdata_0),
  330. .p_dout_3(eps_rddata_3),
  331. .s_addr_0(bus_addr[7:0]),
  332. .s_read_0(eps_bus_ready),
  333. .s_zero_0(eps_bus_zero),
  334. .s_write_0(eps_bus_write),
  335. .s_din_0(bus_din),
  336. .s_dout_3(eps_bus_dout),
  337. .s_ready_0(eps_bus_ready),
  338. .clk(clk),
  339. .rst(rst)
  340. );
  341. // CSR & Bus Interface
  342. // -------------------
  343. // Request lines for registers and strobes for actions
  344. always @(posedge clk)
  345. if (csr_bus_clear) begin
  346. csr_bus_req <= 1'b0;
  347. cr_bus_we <= 1'b0;
  348. cel_rel <= 1'b0;
  349. rst_clear <= 1'b0;
  350. sof_clear <= 1'b0;
  351. evt_rd_ack <= 1'b0;
  352. end else begin
  353. csr_bus_req <= 1'b1;
  354. cr_bus_we <= (bus_addr[1:0] == 2'b00) & bus_we;
  355. cel_rel <= (bus_addr[1:0] == 2'b01) & bus_we & bus_din[13];
  356. rst_clear <= (bus_addr[1:0] == 2'b01) & bus_we & bus_din[ 9];
  357. sof_clear <= (bus_addr[1:0] == 2'b01) & bus_we & bus_din[ 8];
  358. evt_rd_ack <= (bus_addr[1:0] == 2'b10) & ~bus_we & evt_rd_rdy;
  359. end
  360. // Read mux for CSR
  361. assign csr_readout = {
  362. cr_pu_ena,
  363. irq,
  364. cel_state,
  365. cr_cel_ena,
  366. usb_suspend,
  367. usb_reset,
  368. rst_pending,
  369. sof_pending,
  370. cr_addr_chk,
  371. cr_addr
  372. };
  373. always @(*)
  374. if (csr_bus_ack)
  375. case (bus_addr[1:0])
  376. 2'b00: csr_bus_dout = csr_readout;
  377. 2'b10: csr_bus_dout = evt_rd_data;
  378. default: csr_bus_dout = 16'h0000;
  379. endcase
  380. else
  381. csr_bus_dout = 16'h0000;
  382. // CSR Clear/Ack
  383. assign csr_bus_ack = csr_bus_req;
  384. assign csr_bus_clear = ~bus_cyc | csr_bus_ack | bus_addr[11];
  385. // Write regs
  386. always @(posedge clk)
  387. if (cr_bus_we) begin
  388. cr_pu_ena <= bus_din[15];
  389. cr_cel_ena <= bus_din[12];
  390. cr_addr_chk<= bus_din[7];
  391. cr_addr <= bus_din[6:0];
  392. end
  393. // Request lines for EP Status access
  394. always @(posedge clk)
  395. if (eps_bus_clear) begin
  396. eps_bus_read <= 1'b0;
  397. eps_bus_write <= 1'b0;
  398. eps_bus_req <= 1'b0;
  399. end else begin
  400. eps_bus_read <= bus_addr[11] & ~bus_we;
  401. eps_bus_write <= bus_addr[11] & bus_we;
  402. eps_bus_req <= bus_addr[11];
  403. end
  404. assign eps_bus_zero = ~eps_bus_read;
  405. // EPS Clear
  406. assign eps_bus_clear = ~bus_cyc | eps_bus_ack_wait | (eps_bus_req & eps_bus_ready);
  407. // Track when request are accepted by the RAM
  408. assign eps_bus_req_ok = (eps_bus_req & eps_bus_ready);
  409. always @(posedge clk)
  410. eps_bus_req_ok_dly <= { eps_bus_req_ok_dly[1:0], eps_bus_req_ok & ~bus_we };
  411. // ACK wait state tracking
  412. always @(posedge clk or posedge rst)
  413. if (rst)
  414. eps_bus_ack_wait <= 1'b0;
  415. else
  416. eps_bus_ack_wait <= ((eps_bus_ack_wait & ~bus_we) | eps_bus_req_ok) & ~eps_bus_req_ok_dly[2];
  417. // Bus Ack
  418. assign bus_ack = csr_bus_ack | (eps_bus_ack_wait & (bus_we | eps_bus_req_ok_dly[2]));
  419. // Output is simply the OR of all local units since we force them to zero if
  420. // they're not accessed
  421. assign bus_dout = csr_bus_dout | eps_bus_dout;
  422. // Event handling
  423. // --------------
  424. generate
  425. if (EVT_DEPTH == 0) begin
  426. // We just save the # of notify since last read
  427. reg [3:0] evt_cnt;
  428. always @(posedge clk or posedge rst)
  429. if (rst)
  430. evt_cnt <= 4'h0;
  431. else
  432. evt_cnt <= evt_rd_ack ? { 3'b000, evt_stb } : (evt_cnt + evt_stb);
  433. assign evt_rd_rdy = 1'b1;
  434. assign evt_rd_data = { evt_cnt, 12'h000 };
  435. assign irq = (evt_cnt != 4'h0);
  436. end else if (EVT_DEPTH == 1) begin
  437. // Save the latest value and # of notify since last read
  438. reg [11:0] evt_last;
  439. reg [ 3:0] evt_cnt;
  440. always @(posedge clk or posedge rst)
  441. if (rst)
  442. evt_cnt <= 4'h0;
  443. else
  444. evt_cnt <= evt_rd_ack ? { 3'b000, evt_stb } : (evt_cnt + evt_stb);
  445. always @(posedge clk)
  446. if (evt_stb)
  447. evt_last <= evt_data;
  448. assign evt_rd_rdy = 1'b1;
  449. assign evt_rd_data = { evt_cnt, evt_last };
  450. assign irq = (evt_cnt != 4'h0);
  451. end else if (EVT_DEPTH > 1) begin
  452. // Small shift-reg FIFO
  453. wire [11:0] ef_wdata;
  454. wire [11:0] ef_rdata;
  455. wire ef_wren;
  456. wire ef_full;
  457. wire ef_rden;
  458. wire ef_empty;
  459. reg ef_overflow;
  460. assign ef_wdata = evt_data;
  461. assign ef_wren = evt_stb & ~ef_full;
  462. always @(posedge clk or posedge rst)
  463. if (rst)
  464. ef_overflow <= 1'b0;
  465. else
  466. ef_overflow <= (ef_overflow & ~evt_rd_ack) | (evt_stb & ef_full);
  467. assign evt_rd_rdy = ~ef_empty;
  468. assign evt_rd_data = { ~ef_empty, ef_overflow, 2'b00, ef_rdata };
  469. assign ef_rden = evt_rd_ack;
  470. assign irq = ~ef_rden;
  471. fifo_sync_shift #(
  472. .DEPTH(EVT_DEPTH),
  473. .WIDTH(12)
  474. ) evt_fifo_I (
  475. .wr_data(ef_wdata),
  476. .wr_ena(ef_wren),
  477. .wr_full(ef_full),
  478. .rd_data(ef_rdata),
  479. .rd_ena(ef_rden),
  480. .rd_empty(ef_empty),
  481. .clk(clk),
  482. .rst(rst)
  483. );
  484. end
  485. endgenerate
  486. // USB reset/suspend
  487. // -----------------
  488. // Detect some conditions for triggers
  489. assign oob_se0 = ~phy_rx_dp & ~phy_rx_dn;
  490. assign oob_sof = rxpkt_start & rxpkt_is_sof;
  491. // Suspend timeout counter
  492. always @(posedge clk)
  493. if (oob_sof | usb_reset)
  494. timeout_suspend <= 20'hdcd80; // 3 ms
  495. else
  496. timeout_suspend <= timeout_suspend + timeout_suspend[19];
  497. assign usb_suspend = ~timeout_suspend[19];
  498. // Reset timeout counter
  499. always @(posedge clk)
  500. if (~oob_se0)
  501. timeout_reset <= 20'h8ad00;
  502. else
  503. timeout_reset <= timeout_reset + timeout_reset[19];
  504. assign usb_reset = ~timeout_reset[19];
  505. always @(posedge clk or posedge rst)
  506. if (rst)
  507. rst_pending <= 1'b1;
  508. else
  509. rst_pending <= (rst_pending & ~rst_clear) | usb_reset;
  510. // Detection pin
  511. always @(posedge clk)
  512. if (rst)
  513. pad_pu <= 1'b0;
  514. else
  515. pad_pu <= cr_pu_ena;
  516. // Misc
  517. // ----
  518. always @(posedge clk)
  519. sof_ind <= rxpkt_start & rxpkt_is_sof;
  520. always @(posedge clk)
  521. sof_pending <= (sof_pending & ~sof_clear) | (rxpkt_start & rxpkt_is_sof);
  522. assign sof = sof_ind;
  523. endmodule // usb