usb.sv 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // usb.sv
  3. //
  4. // For now, just instantiate a USB <-> serial bridge and attach it
  5. // to the output of the tty
  6. //
  7. module max80_usb (
  8. input rst_n,
  9. input clock48,
  10. output tty_rxd,
  11. output tty_rxd_break,
  12. input tty_txd,
  13. inout usb_dp, // Single ended D+
  14. inout usb_dn, // Single ended D-
  15. input usb_rx, // Differential input
  16. input usb_rx_ok, // Differential input available
  17. output usb_pu // Driver for 1.5 kohm pullup
  18. );
  19. //
  20. // UTMI interface to PHY
  21. //
  22. wire [7:0] utmi_data_out;
  23. wire [1:0] utmi_op_mode;
  24. wire [1:0] utmi_xcvrselect;
  25. wire utmi_termselect;
  26. wire utmi_dppulldown;
  27. wire utmi_dmpulldown;
  28. wire [7:0] utmi_data_in;
  29. wire utmi_txvalid;
  30. wire utmi_txready;
  31. wire utmi_rxvalid;
  32. wire utmi_rxactive;
  33. wire utmi_rxerror;
  34. wire [1:0] utmi_linestate;
  35. //
  36. // USB hardware interface to PHY
  37. //
  38. wire usb_rx_rcv = usb_rx_ok ? usb_rx : usb_dp & ~usb_dn;
  39. wire usb_rx_dp = usb_dp;
  40. wire usb_rx_dn = usb_dn;
  41. wire usb_tx_dp;
  42. wire usb_tx_dn;
  43. wire usb_tx_oen;
  44. wire usb_en;
  45. //
  46. // Reset and I/O pins
  47. //
  48. reg usb_rst_n;
  49. always @(negedge rst_n or posedge clock48)
  50. if (~rst_n)
  51. usb_rst_n <= 1'b0;
  52. else
  53. usb_rst_n <= 1'b1;
  54. assign usb_dp = ( usb_rst_n & ~usb_tx_oen ) ? usb_tx_dp : 1'bz;
  55. assign usb_dn = ( usb_rst_n & ~usb_tx_oen ) ? usb_tx_dn : 1'bz;
  56. assign usb_pu = ( usb_rst_n & usb_en ) ? 1'b1 : 1'bz;
  57. usb_fs_phy usb_phy (
  58. .clk_i ( clock48 ),
  59. .rst_i ( ~usb_rst_n ),
  60. .utmi_data_out_i ( utmi_data_out ),
  61. .utmi_txvalid_i ( utmi_txvalid ),
  62. .utmi_op_mode_i ( utmi_op_mode ),
  63. .utmi_xcvrselect_i ( utmi_xcvrselect ),
  64. .utmi_termselect_i ( utmi_termselect ),
  65. .utmi_dppulldown_i ( utmi_dppulldown ),
  66. .utmi_dmpulldown_i ( utmi_dmpulldown ),
  67. .usb_rx_rcv_i ( usb_rx_rcv ),
  68. .usb_rx_dp_i ( usb_rx_dp ),
  69. .usb_rx_dn_i ( usb_rx_dn ),
  70. .usb_reset_assert_i ( 1'b0 ),
  71. .utmi_data_in_o ( utmi_data_in ),
  72. .utmi_txready_o ( utmi_txready ),
  73. .utmi_rxvalid_o ( utmi_rxvalid ),
  74. .utmi_rxactive_o ( utmi_rxactive ),
  75. .utmi_rxerror_o ( utmi_rxerror ),
  76. .utmi_linestate_o ( utmi_linestate ),
  77. .usb_tx_dp_o ( usb_tx_dp ),
  78. .usb_tx_dn_o ( usb_tx_dn ),
  79. .usb_tx_oen_o ( usb_tx_oen ),
  80. .usb_reset_detect_o ( ),
  81. .usb_en_o ( usb_en )
  82. );
  83. usb_cdc_top #(.BAUDRATE(115200))
  84. usb_serial (
  85. .clk_i ( clock48 ),
  86. .rst_i ( ~usb_rst_n ),
  87. .utmi_data_out_o ( utmi_data_out ),
  88. .utmi_txvalid_o ( utmi_txvalid ),
  89. .utmi_op_mode_o ( utmi_op_mode ),
  90. .utmi_xcvrselect_o ( utmi_xcvrselect ),
  91. .utmi_termselect_o ( utmi_termselect ),
  92. .utmi_dppulldown_o ( utmi_dppulldown ),
  93. .utmi_dmpulldown_o ( utmi_dmpulldown ),
  94. .utmi_data_in_i ( utmi_data_in ),
  95. .utmi_txready_i ( utmi_txready ),
  96. .utmi_rxvalid_i ( utmi_rxvalid ),
  97. .utmi_rxactive_i ( utmi_rxactive ),
  98. .utmi_rxerror_i ( utmi_rxerror ),
  99. .utmi_linestate_i ( utmi_linestate ),
  100. .tx_i ( tty_txd ),
  101. .rx_o ( tty_rxd ),
  102. .rx_break_o ( tty_rxd_break )
  103. );
  104. endmodule // max80_usb