usb_desc.v 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  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 [8:0] usb_addr,
  8. output [7:0] usb_rdata,
  9. input cpu_clk,
  10. input [8: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:511];
  16. initial begin
  17. rom[9'h000] = 8'h1c;
  18. rom[9'h001] = 8'h03;
  19. rom[9'h002] = 8'h58;
  20. rom[9'h003] = 8'h00;
  21. rom[9'h004] = 8'h58;
  22. rom[9'h005] = 8'h00;
  23. rom[9'h006] = 8'h58;
  24. rom[9'h007] = 8'h00;
  25. rom[9'h008] = 8'h58;
  26. rom[9'h009] = 8'h00;
  27. rom[9'h00a] = 8'h58;
  28. rom[9'h00b] = 8'h00;
  29. rom[9'h00c] = 8'h58;
  30. rom[9'h00d] = 8'h00;
  31. rom[9'h00e] = 8'h2d;
  32. rom[9'h00f] = 8'h00;
  33. rom[9'h010] = 8'h58;
  34. rom[9'h011] = 8'h00;
  35. rom[9'h012] = 8'h58;
  36. rom[9'h013] = 8'h00;
  37. rom[9'h014] = 8'h58;
  38. rom[9'h015] = 8'h00;
  39. rom[9'h016] = 8'h58;
  40. rom[9'h017] = 8'h00;
  41. rom[9'h018] = 8'h58;
  42. rom[9'h019] = 8'h00;
  43. rom[9'h01a] = 8'h58;
  44. rom[9'h01b] = 8'h00;
  45. rom[9'h01c] = 8'h12;
  46. rom[9'h01d] = 8'h01;
  47. rom[9'h01e] = 8'h01;
  48. rom[9'h01f] = 8'h01;
  49. rom[9'h020] = 8'h00;
  50. rom[9'h021] = 8'h00;
  51. rom[9'h022] = 8'h00;
  52. rom[9'h023] = 8'h08;
  53. rom[9'h024] = 8'h80;
  54. rom[9'h025] = 8'h46;
  55. rom[9'h026] = 8'h81;
  56. rom[9'h027] = 8'h08;
  57. rom[9'h028] = 8'h00;
  58. rom[9'h029] = 8'h01;
  59. rom[9'h02a] = 8'h02;
  60. rom[9'h02b] = 8'h03;
  61. rom[9'h02c] = 8'h01;
  62. rom[9'h02d] = 8'h01;
  63. rom[9'h02e] = 8'h09;
  64. rom[9'h02f] = 8'h02;
  65. rom[9'h030] = 8'h8d;
  66. rom[9'h031] = 8'h00;
  67. rom[9'h032] = 8'h04;
  68. rom[9'h033] = 8'h01;
  69. rom[9'h034] = 8'h04;
  70. rom[9'h035] = 8'hc0;
  71. rom[9'h036] = 8'hfa;
  72. rom[9'h037] = 8'h08;
  73. rom[9'h038] = 8'h0b;
  74. rom[9'h039] = 8'h00;
  75. rom[9'h03a] = 8'h02;
  76. rom[9'h03b] = 8'h02;
  77. rom[9'h03c] = 8'h02;
  78. rom[9'h03d] = 8'h00;
  79. rom[9'h03e] = 8'h05;
  80. rom[9'h03f] = 8'h09;
  81. rom[9'h040] = 8'h04;
  82. rom[9'h041] = 8'h00;
  83. rom[9'h042] = 8'h00;
  84. rom[9'h043] = 8'h01;
  85. rom[9'h044] = 8'h02;
  86. rom[9'h045] = 8'h02;
  87. rom[9'h046] = 8'h00;
  88. rom[9'h047] = 8'h05;
  89. rom[9'h048] = 8'h05;
  90. rom[9'h049] = 8'h24;
  91. rom[9'h04a] = 8'h00;
  92. rom[9'h04b] = 8'h20;
  93. rom[9'h04c] = 8'h01;
  94. rom[9'h04d] = 8'h05;
  95. rom[9'h04e] = 8'h24;
  96. rom[9'h04f] = 8'h01;
  97. rom[9'h050] = 8'h03;
  98. rom[9'h051] = 8'h01;
  99. rom[9'h052] = 8'h04;
  100. rom[9'h053] = 8'h24;
  101. rom[9'h054] = 8'h02;
  102. rom[9'h055] = 8'h06;
  103. rom[9'h056] = 8'h05;
  104. rom[9'h057] = 8'h24;
  105. rom[9'h058] = 8'h06;
  106. rom[9'h059] = 8'h00;
  107. rom[9'h05a] = 8'h01;
  108. rom[9'h05b] = 8'h07;
  109. rom[9'h05c] = 8'h05;
  110. rom[9'h05d] = 8'h82;
  111. rom[9'h05e] = 8'h03;
  112. rom[9'h05f] = 8'h40;
  113. rom[9'h060] = 8'h00;
  114. rom[9'h061] = 8'h02;
  115. rom[9'h062] = 8'h09;
  116. rom[9'h063] = 8'h04;
  117. rom[9'h064] = 8'h01;
  118. rom[9'h065] = 8'h00;
  119. rom[9'h066] = 8'h02;
  120. rom[9'h067] = 8'h0a;
  121. rom[9'h068] = 8'h00;
  122. rom[9'h069] = 8'h00;
  123. rom[9'h06a] = 8'h04;
  124. rom[9'h06b] = 8'h07;
  125. rom[9'h06c] = 8'h05;
  126. rom[9'h06d] = 8'h81;
  127. rom[9'h06e] = 8'h02;
  128. rom[9'h06f] = 8'h40;
  129. rom[9'h070] = 8'h00;
  130. rom[9'h071] = 8'h00;
  131. rom[9'h072] = 8'h07;
  132. rom[9'h073] = 8'h05;
  133. rom[9'h074] = 8'h01;
  134. rom[9'h075] = 8'h02;
  135. rom[9'h076] = 8'h40;
  136. rom[9'h077] = 8'h00;
  137. rom[9'h078] = 8'h00;
  138. rom[9'h079] = 8'h08;
  139. rom[9'h07a] = 8'h0b;
  140. rom[9'h07b] = 8'h02;
  141. rom[9'h07c] = 8'h02;
  142. rom[9'h07d] = 8'h02;
  143. rom[9'h07e] = 8'h02;
  144. rom[9'h07f] = 8'h00;
  145. rom[9'h080] = 8'h06;
  146. rom[9'h081] = 8'h09;
  147. rom[9'h082] = 8'h04;
  148. rom[9'h083] = 8'h02;
  149. rom[9'h084] = 8'h00;
  150. rom[9'h085] = 8'h01;
  151. rom[9'h086] = 8'h02;
  152. rom[9'h087] = 8'h02;
  153. rom[9'h088] = 8'h00;
  154. rom[9'h089] = 8'h06;
  155. rom[9'h08a] = 8'h05;
  156. rom[9'h08b] = 8'h24;
  157. rom[9'h08c] = 8'h00;
  158. rom[9'h08d] = 8'h20;
  159. rom[9'h08e] = 8'h01;
  160. rom[9'h08f] = 8'h05;
  161. rom[9'h090] = 8'h24;
  162. rom[9'h091] = 8'h01;
  163. rom[9'h092] = 8'h03;
  164. rom[9'h093] = 8'h03;
  165. rom[9'h094] = 8'h04;
  166. rom[9'h095] = 8'h24;
  167. rom[9'h096] = 8'h02;
  168. rom[9'h097] = 8'h06;
  169. rom[9'h098] = 8'h05;
  170. rom[9'h099] = 8'h24;
  171. rom[9'h09a] = 8'h06;
  172. rom[9'h09b] = 8'h02;
  173. rom[9'h09c] = 8'h03;
  174. rom[9'h09d] = 8'h07;
  175. rom[9'h09e] = 8'h05;
  176. rom[9'h09f] = 8'h84;
  177. rom[9'h0a0] = 8'h03;
  178. rom[9'h0a1] = 8'h40;
  179. rom[9'h0a2] = 8'h00;
  180. rom[9'h0a3] = 8'h02;
  181. rom[9'h0a4] = 8'h09;
  182. rom[9'h0a5] = 8'h04;
  183. rom[9'h0a6] = 8'h03;
  184. rom[9'h0a7] = 8'h00;
  185. rom[9'h0a8] = 8'h02;
  186. rom[9'h0a9] = 8'h0a;
  187. rom[9'h0aa] = 8'h00;
  188. rom[9'h0ab] = 8'h00;
  189. rom[9'h0ac] = 8'h04;
  190. rom[9'h0ad] = 8'h07;
  191. rom[9'h0ae] = 8'h05;
  192. rom[9'h0af] = 8'h83;
  193. rom[9'h0b0] = 8'h02;
  194. rom[9'h0b1] = 8'h40;
  195. rom[9'h0b2] = 8'h00;
  196. rom[9'h0b3] = 8'h00;
  197. rom[9'h0b4] = 8'h07;
  198. rom[9'h0b5] = 8'h05;
  199. rom[9'h0b6] = 8'h03;
  200. rom[9'h0b7] = 8'h02;
  201. rom[9'h0b8] = 8'h40;
  202. rom[9'h0b9] = 8'h00;
  203. rom[9'h0ba] = 8'h00;
  204. rom[9'h0bb] = 8'h06;
  205. rom[9'h0bc] = 8'h03;
  206. rom[9'h0bd] = 8'h09;
  207. rom[9'h0be] = 8'h04;
  208. rom[9'h0bf] = 8'h1d;
  209. rom[9'h0c0] = 8'h04;
  210. rom[9'h0c1] = 8'h18;
  211. rom[9'h0c2] = 8'h03;
  212. rom[9'h0c3] = 8'h50;
  213. rom[9'h0c4] = 8'h00;
  214. rom[9'h0c5] = 8'h65;
  215. rom[9'h0c6] = 8'h00;
  216. rom[9'h0c7] = 8'h74;
  217. rom[9'h0c8] = 8'h00;
  218. rom[9'h0c9] = 8'h65;
  219. rom[9'h0ca] = 8'h00;
  220. rom[9'h0cb] = 8'h72;
  221. rom[9'h0cc] = 8'h00;
  222. rom[9'h0cd] = 8'h20;
  223. rom[9'h0ce] = 8'h00;
  224. rom[9'h0cf] = 8'h26;
  225. rom[9'h0d0] = 8'h00;
  226. rom[9'h0d1] = 8'h20;
  227. rom[9'h0d2] = 8'h00;
  228. rom[9'h0d3] = 8'h50;
  229. rom[9'h0d4] = 8'h00;
  230. rom[9'h0d5] = 8'h65;
  231. rom[9'h0d6] = 8'h00;
  232. rom[9'h0d7] = 8'h72;
  233. rom[9'h0d8] = 8'h00;
  234. rom[9'h0d9] = 8'h2e;
  235. rom[9'h0da] = 8'h03;
  236. rom[9'h0db] = 8'h4d;
  237. rom[9'h0dc] = 8'h00;
  238. rom[9'h0dd] = 8'h41;
  239. rom[9'h0de] = 8'h00;
  240. rom[9'h0df] = 8'h58;
  241. rom[9'h0e0] = 8'h00;
  242. rom[9'h0e1] = 8'h38;
  243. rom[9'h0e2] = 8'h00;
  244. rom[9'h0e3] = 8'h30;
  245. rom[9'h0e4] = 8'h00;
  246. rom[9'h0e5] = 8'h20;
  247. rom[9'h0e6] = 8'h00;
  248. rom[9'h0e7] = 8'h49;
  249. rom[9'h0e8] = 8'h00;
  250. rom[9'h0e9] = 8'h2f;
  251. rom[9'h0ea] = 8'h00;
  252. rom[9'h0eb] = 8'h4f;
  253. rom[9'h0ec] = 8'h00;
  254. rom[9'h0ed] = 8'h20;
  255. rom[9'h0ee] = 8'h00;
  256. rom[9'h0ef] = 8'h63;
  257. rom[9'h0f0] = 8'h00;
  258. rom[9'h0f1] = 8'h61;
  259. rom[9'h0f2] = 8'h00;
  260. rom[9'h0f3] = 8'h72;
  261. rom[9'h0f4] = 8'h00;
  262. rom[9'h0f5] = 8'h64;
  263. rom[9'h0f6] = 8'h00;
  264. rom[9'h0f7] = 8'h20;
  265. rom[9'h0f8] = 8'h00;
  266. rom[9'h0f9] = 8'h66;
  267. rom[9'h0fa] = 8'h00;
  268. rom[9'h0fb] = 8'h6f;
  269. rom[9'h0fc] = 8'h00;
  270. rom[9'h0fd] = 8'h72;
  271. rom[9'h0fe] = 8'h00;
  272. rom[9'h0ff] = 8'h20;
  273. rom[9'h100] = 8'h00;
  274. rom[9'h101] = 8'h41;
  275. rom[9'h102] = 8'h00;
  276. rom[9'h103] = 8'h42;
  277. rom[9'h104] = 8'h00;
  278. rom[9'h105] = 8'h43;
  279. rom[9'h106] = 8'h00;
  280. rom[9'h107] = 8'h02;
  281. rom[9'h108] = 8'h03;
  282. rom[9'h109] = 8'h1c;
  283. rom[9'h10a] = 8'h03;
  284. rom[9'h10b] = 8'h4d;
  285. rom[9'h10c] = 8'h00;
  286. rom[9'h10d] = 8'h41;
  287. rom[9'h10e] = 8'h00;
  288. rom[9'h10f] = 8'h58;
  289. rom[9'h110] = 8'h00;
  290. rom[9'h111] = 8'h38;
  291. rom[9'h112] = 8'h00;
  292. rom[9'h113] = 8'h30;
  293. rom[9'h114] = 8'h00;
  294. rom[9'h115] = 8'h20;
  295. rom[9'h116] = 8'h00;
  296. rom[9'h117] = 8'h63;
  297. rom[9'h118] = 8'h00;
  298. rom[9'h119] = 8'h6f;
  299. rom[9'h11a] = 8'h00;
  300. rom[9'h11b] = 8'h6e;
  301. rom[9'h11c] = 8'h00;
  302. rom[9'h11d] = 8'h73;
  303. rom[9'h11e] = 8'h00;
  304. rom[9'h11f] = 8'h6f;
  305. rom[9'h120] = 8'h00;
  306. rom[9'h121] = 8'h6c;
  307. rom[9'h122] = 8'h00;
  308. rom[9'h123] = 8'h65;
  309. rom[9'h124] = 8'h00;
  310. rom[9'h125] = 8'h1c;
  311. rom[9'h126] = 8'h03;
  312. rom[9'h127] = 8'h50;
  313. rom[9'h128] = 8'h00;
  314. rom[9'h129] = 8'h55;
  315. rom[9'h12a] = 8'h00;
  316. rom[9'h12b] = 8'h4e;
  317. rom[9'h12c] = 8'h00;
  318. rom[9'h12d] = 8'h38;
  319. rom[9'h12e] = 8'h00;
  320. rom[9'h12f] = 8'h30;
  321. rom[9'h130] = 8'h00;
  322. rom[9'h131] = 8'h20;
  323. rom[9'h132] = 8'h00;
  324. rom[9'h133] = 8'h6e;
  325. rom[9'h134] = 8'h00;
  326. rom[9'h135] = 8'h65;
  327. rom[9'h136] = 8'h00;
  328. rom[9'h137] = 8'h74;
  329. rom[9'h138] = 8'h00;
  330. rom[9'h139] = 8'h77;
  331. rom[9'h13a] = 8'h00;
  332. rom[9'h13b] = 8'h6f;
  333. rom[9'h13c] = 8'h00;
  334. rom[9'h13d] = 8'h72;
  335. rom[9'h13e] = 8'h00;
  336. rom[9'h13f] = 8'h6b;
  337. rom[9'h140] = 8'h00;
  338. rom[9'h141] = 8'h00;
  339. rom[9'h142] = 8'h96;
  340. rom[9'h143] = 8'h00;
  341. rom[9'h144] = 8'h00;
  342. rom[9'h145] = 8'h00;
  343. rom[9'h146] = 8'h00;
  344. rom[9'h147] = 8'h08;
  345. end
  346. always @(posedge clk) begin
  347. usb_rdata <= rom[usb_addr];
  348. end
  349. always @(posedge cpu_clk) begin
  350. cpu_rdata <= rom[cpu_addr];
  351. if (cpu_wren)
  352. rom[cpu_addr] <= cpu_wdata;
  353. end
  354. endmodule
  355. module usb_desc_index (
  356. input [7:0] dtype,
  357. input [7:0] dindex,
  358. input [15:0] windex,
  359. input additional,
  360. output reg [8:0] addr,
  361. output reg [8:0] len
  362. );
  363. always @(*)
  364. if (additional)
  365. {addr,len} = {9'h141,9'h007};
  366. else priority casez ({windex,dindex,dtype})
  367. 32'b??????00_00011101_00000010_00000011: {addr,len} = {9'h0c1,9'h018};
  368. 32'b??????00_00011101_00000011_00000011: {addr,len} = {9'h0d9,9'h02e};
  369. 32'b??????00_00011101_00000100_00000011: {addr,len} = {9'h107,9'h002};
  370. 32'b??????00_00011101_00000101_00000011: {addr,len} = {9'h109,9'h01c};
  371. 32'b??????00_00011101_00000110_00000011: {addr,len} = {9'h125,9'h01c};
  372. 32'b????????_????????_00000000_00000010: {addr,len} = {9'h02e,9'h08d};
  373. 32'b????????_????????_00000000_00000011: {addr,len} = {9'h0bb,9'h006};
  374. 32'b????????_????????_00000001_00000011: {addr,len} = {9'h000,9'h01c};
  375. 32'b????????_????????_00000010_00000011: {addr,len} = {9'h0c1,9'h018};
  376. 32'b????????_????????_00000011_00000011: {addr,len} = {9'h0d9,9'h02e};
  377. 32'b????????_????????_00000100_00000011: {addr,len} = {9'h107,9'h002};
  378. 32'b????????_????????_00000101_00000011: {addr,len} = {9'h109,9'h01c};
  379. 32'b????????_????????_00000110_00000011: {addr,len} = {9'h125,9'h01c};
  380. 32'b????????_????????_????????_00000001: {addr,len} = {9'h01c,9'h012};
  381. 32'b????????_????????_????????_????????: {addr,len} = {9'hxxx,9'h000};
  382. endcase
  383. endmodule