2
0

usb_desc.v 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*
  2. * Call it a ROM even through it can be optionally written to.
  3. * Trust the tools to figure out if we don't need part of the whole thing.
  4. */
  5. module usb_desc_rom (
  6. input clk,
  7. input [7:0] usb_addr,
  8. output [7:0] usb_rdata,
  9. input cpu_clk,
  10. input [7:0] cpu_addr,
  11. output [7:0] cpu_rdata,
  12. input [7:0] cpu_wdata,
  13. input cpu_wren
  14. );
  15. reg [7:0] rom [0:255];
  16. initial begin
  17. rom[8'h00] = 8'h1a;
  18. rom[8'h01] = 8'h03;
  19. rom[8'h02] = 8'h5f;
  20. rom[8'h03] = 8'h00;
  21. rom[8'h04] = 8'h73;
  22. rom[8'h05] = 8'h00;
  23. rom[8'h06] = 8'h65;
  24. rom[8'h07] = 8'h00;
  25. rom[8'h08] = 8'h72;
  26. rom[8'h09] = 8'h00;
  27. rom[8'h0a] = 8'h69;
  28. rom[8'h0b] = 8'h00;
  29. rom[8'h0c] = 8'h61;
  30. rom[8'h0d] = 8'h00;
  31. rom[8'h0e] = 8'h6c;
  32. rom[8'h0f] = 8'h00;
  33. rom[8'h10] = 8'h5f;
  34. rom[8'h11] = 8'h00;
  35. rom[8'h12] = 8'h73;
  36. rom[8'h13] = 8'h00;
  37. rom[8'h14] = 8'h74;
  38. rom[8'h15] = 8'h00;
  39. rom[8'h16] = 8'h72;
  40. rom[8'h17] = 8'h00;
  41. rom[8'h18] = 8'h5f;
  42. rom[8'h19] = 8'h00;
  43. rom[8'h1a] = 8'h12;
  44. rom[8'h1b] = 8'h01;
  45. rom[8'h1c] = 8'h01;
  46. rom[8'h1d] = 8'h01;
  47. rom[8'h1e] = 8'h00;
  48. rom[8'h1f] = 8'h00;
  49. rom[8'h20] = 8'h00;
  50. rom[8'h21] = 8'h08;
  51. rom[8'h22] = 8'h50;
  52. rom[8'h23] = 8'h1d;
  53. rom[8'h24] = 8'h49;
  54. rom[8'h25] = 8'h61;
  55. rom[8'h26] = 8'h00;
  56. rom[8'h27] = 8'h01;
  57. rom[8'h28] = 8'h02;
  58. rom[8'h29] = 8'h03;
  59. rom[8'h2a] = 8'h01;
  60. rom[8'h2b] = 8'h01;
  61. rom[8'h2c] = 8'h09;
  62. rom[8'h2d] = 8'h02;
  63. rom[8'h2e] = 8'h4b;
  64. rom[8'h2f] = 8'h00;
  65. rom[8'h30] = 8'h02;
  66. rom[8'h31] = 8'h01;
  67. rom[8'h32] = 8'h04;
  68. rom[8'h33] = 8'hc0;
  69. rom[8'h34] = 8'hfa;
  70. rom[8'h35] = 8'h08;
  71. rom[8'h36] = 8'h0b;
  72. rom[8'h37] = 8'h00;
  73. rom[8'h38] = 8'h02;
  74. rom[8'h39] = 8'h02;
  75. rom[8'h3a] = 8'h02;
  76. rom[8'h3b] = 8'h01;
  77. rom[8'h3c] = 8'h04;
  78. rom[8'h3d] = 8'h09;
  79. rom[8'h3e] = 8'h04;
  80. rom[8'h3f] = 8'h00;
  81. rom[8'h40] = 8'h00;
  82. rom[8'h41] = 8'h01;
  83. rom[8'h42] = 8'h02;
  84. rom[8'h43] = 8'h02;
  85. rom[8'h44] = 8'h01;
  86. rom[8'h45] = 8'h04;
  87. rom[8'h46] = 8'h05;
  88. rom[8'h47] = 8'h24;
  89. rom[8'h48] = 8'h00;
  90. rom[8'h49] = 8'h20;
  91. rom[8'h4a] = 8'h01;
  92. rom[8'h4b] = 8'h05;
  93. rom[8'h4c] = 8'h24;
  94. rom[8'h4d] = 8'h01;
  95. rom[8'h4e] = 8'h03;
  96. rom[8'h4f] = 8'h01;
  97. rom[8'h50] = 8'h04;
  98. rom[8'h51] = 8'h24;
  99. rom[8'h52] = 8'h02;
  100. rom[8'h53] = 8'h04;
  101. rom[8'h54] = 8'h05;
  102. rom[8'h55] = 8'h24;
  103. rom[8'h56] = 8'h06;
  104. rom[8'h57] = 8'h00;
  105. rom[8'h58] = 8'h01;
  106. rom[8'h59] = 8'h07;
  107. rom[8'h5a] = 8'h05;
  108. rom[8'h5b] = 8'h82;
  109. rom[8'h5c] = 8'h03;
  110. rom[8'h5d] = 8'h40;
  111. rom[8'h5e] = 8'h00;
  112. rom[8'h5f] = 8'h02;
  113. rom[8'h60] = 8'h09;
  114. rom[8'h61] = 8'h04;
  115. rom[8'h62] = 8'h01;
  116. rom[8'h63] = 8'h00;
  117. rom[8'h64] = 8'h02;
  118. rom[8'h65] = 8'h0a;
  119. rom[8'h66] = 8'h00;
  120. rom[8'h67] = 8'h00;
  121. rom[8'h68] = 8'h04;
  122. rom[8'h69] = 8'h07;
  123. rom[8'h6a] = 8'h05;
  124. rom[8'h6b] = 8'h81;
  125. rom[8'h6c] = 8'h02;
  126. rom[8'h6d] = 8'h40;
  127. rom[8'h6e] = 8'h00;
  128. rom[8'h6f] = 8'h00;
  129. rom[8'h70] = 8'h07;
  130. rom[8'h71] = 8'h05;
  131. rom[8'h72] = 8'h01;
  132. rom[8'h73] = 8'h02;
  133. rom[8'h74] = 8'h40;
  134. rom[8'h75] = 8'h00;
  135. rom[8'h76] = 8'h00;
  136. rom[8'h77] = 8'h06;
  137. rom[8'h78] = 8'h03;
  138. rom[8'h79] = 8'h09;
  139. rom[8'h7a] = 8'h04;
  140. rom[8'h7b] = 8'h1d;
  141. rom[8'h7c] = 8'h04;
  142. rom[8'h7d] = 8'h18;
  143. rom[8'h7e] = 8'h03;
  144. rom[8'h7f] = 8'h50;
  145. rom[8'h80] = 8'h00;
  146. rom[8'h81] = 8'h65;
  147. rom[8'h82] = 8'h00;
  148. rom[8'h83] = 8'h74;
  149. rom[8'h84] = 8'h00;
  150. rom[8'h85] = 8'h65;
  151. rom[8'h86] = 8'h00;
  152. rom[8'h87] = 8'h72;
  153. rom[8'h88] = 8'h00;
  154. rom[8'h89] = 8'h20;
  155. rom[8'h8a] = 8'h00;
  156. rom[8'h8b] = 8'h26;
  157. rom[8'h8c] = 8'h00;
  158. rom[8'h8d] = 8'h20;
  159. rom[8'h8e] = 8'h00;
  160. rom[8'h8f] = 8'h50;
  161. rom[8'h90] = 8'h00;
  162. rom[8'h91] = 8'h65;
  163. rom[8'h92] = 8'h00;
  164. rom[8'h93] = 8'h72;
  165. rom[8'h94] = 8'h00;
  166. rom[8'h95] = 8'h2e;
  167. rom[8'h96] = 8'h03;
  168. rom[8'h97] = 8'h4d;
  169. rom[8'h98] = 8'h00;
  170. rom[8'h99] = 8'h41;
  171. rom[8'h9a] = 8'h00;
  172. rom[8'h9b] = 8'h58;
  173. rom[8'h9c] = 8'h00;
  174. rom[8'h9d] = 8'h38;
  175. rom[8'h9e] = 8'h00;
  176. rom[8'h9f] = 8'h30;
  177. rom[8'ha0] = 8'h00;
  178. rom[8'ha1] = 8'h20;
  179. rom[8'ha2] = 8'h00;
  180. rom[8'ha3] = 8'h49;
  181. rom[8'ha4] = 8'h00;
  182. rom[8'ha5] = 8'h2f;
  183. rom[8'ha6] = 8'h00;
  184. rom[8'ha7] = 8'h4f;
  185. rom[8'ha8] = 8'h00;
  186. rom[8'ha9] = 8'h20;
  187. rom[8'haa] = 8'h00;
  188. rom[8'hab] = 8'h63;
  189. rom[8'hac] = 8'h00;
  190. rom[8'had] = 8'h61;
  191. rom[8'hae] = 8'h00;
  192. rom[8'haf] = 8'h72;
  193. rom[8'hb0] = 8'h00;
  194. rom[8'hb1] = 8'h64;
  195. rom[8'hb2] = 8'h00;
  196. rom[8'hb3] = 8'h20;
  197. rom[8'hb4] = 8'h00;
  198. rom[8'hb5] = 8'h66;
  199. rom[8'hb6] = 8'h00;
  200. rom[8'hb7] = 8'h6f;
  201. rom[8'hb8] = 8'h00;
  202. rom[8'hb9] = 8'h72;
  203. rom[8'hba] = 8'h00;
  204. rom[8'hbb] = 8'h20;
  205. rom[8'hbc] = 8'h00;
  206. rom[8'hbd] = 8'h41;
  207. rom[8'hbe] = 8'h00;
  208. rom[8'hbf] = 8'h42;
  209. rom[8'hc0] = 8'h00;
  210. rom[8'hc1] = 8'h43;
  211. rom[8'hc2] = 8'h00;
  212. rom[8'hc3] = 8'h02;
  213. rom[8'hc4] = 8'h03;
  214. rom[8'hc5] = 8'h00;
  215. rom[8'hc6] = 8'hc2;
  216. rom[8'hc7] = 8'h01;
  217. rom[8'hc8] = 8'h00;
  218. rom[8'hc9] = 8'h00;
  219. rom[8'hca] = 8'h00;
  220. rom[8'hcb] = 8'h08;
  221. end
  222. always @(posedge clk) begin
  223. usb_rdata <= rom[usb_addr];
  224. end
  225. always @(posedge cpu_clk) begin
  226. cpu_rdata <= rom[cpu_addr];
  227. if (cpu_wren)
  228. rom[cpu_addr] <= cpu_wdata;
  229. end
  230. endmodule
  231. module usb_desc_index (
  232. input [7:0] dtype,
  233. input [7:0] dindex,
  234. input [15:0] windex,
  235. input additional,
  236. output reg [7:0] addr,
  237. output reg [7:0] len
  238. );
  239. always @(*)
  240. if (additional)
  241. {addr,len} = {8'hc5,8'h07};
  242. else priority casez ({windex,dindex,dtype})
  243. 32'b??????00_00011101_00000010_00000011: {addr,len} = {8'h7d,8'h18};
  244. 32'b??????00_00011101_00000011_00000011: {addr,len} = {8'h95,8'h2e};
  245. 32'b??????00_00011101_00000100_00000011: {addr,len} = {8'hc3,8'h02};
  246. 32'b????????_????????_00000000_00000010: {addr,len} = {8'h2c,8'h4b};
  247. 32'b????????_????????_00000000_00000011: {addr,len} = {8'h77,8'h06};
  248. 32'b????????_????????_00000001_00000011: {addr,len} = {8'h00,8'h1a};
  249. 32'b????????_????????_00000010_00000011: {addr,len} = {8'h7d,8'h18};
  250. 32'b????????_????????_00000011_00000011: {addr,len} = {8'h95,8'h2e};
  251. 32'b????????_????????_00000100_00000011: {addr,len} = {8'hc3,8'h02};
  252. 32'b????????_????????_????????_00000001: {addr,len} = {8'h1a,8'h12};
  253. 32'b????????_????????_????????_????????: {addr,len} = {8'hxx,8'h00};
  254. endcase
  255. endmodule