QuadSPIs.v 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. module QuadSPIs (
  2. input Clk_i,
  3. input Rst_i,
  4. input Sck_i,
  5. input Ss_i,
  6. input Mosi0_i,
  7. input Mosi1_i,
  8. input Mosi2_i,
  9. input Mosi3_i,
  10. input [1:0] WidthSel_i,
  11. input SELST_i,
  12. input EndianSel_i,
  13. output reg [23:0] Data_o,
  14. output reg [7:0] Addr_o,
  15. output [31:0] DataToRxFifo_o,
  16. output reg [191:0] DebugData_o,
  17. output reg Val_o
  18. );
  19. //================================================================================
  20. // REG/WIRE
  21. //================================================================================
  22. reg ssReg;
  23. reg ssRegR;
  24. reg SckReg;
  25. reg [7:0] addrReg;
  26. reg [7:0] shiftReg0;
  27. reg [7:0] shiftReg1;
  28. reg [7:0] shiftReg2;
  29. reg [7:0] addrRegLSB;
  30. reg [7:0] shiftReg0LSB;
  31. reg [7:0] shiftReg1LSB;
  32. reg [7:0] shiftReg2LSB;
  33. reg [7:0] shiftReg0M;
  34. reg [7:0] shiftReg1M;
  35. reg [7:0] shiftReg2M;
  36. reg [7:0] addrRegM;
  37. reg [47:0] shiftReg0Debug;
  38. reg [47:0] shiftReg1Debug;
  39. reg [47:0] shiftReg2Debug;
  40. reg [47:0] shiftReg3Debug;
  41. //===============================================================================
  42. // ASSIGNMENTS
  43. assign DataToRxFifo_o = {Addr_o, Data_o};
  44. //================================================================================
  45. // CODING
  46. //================================================================================
  47. always @(posedge Clk_i) begin
  48. ssReg <= Ss_i;
  49. ssRegR <= ssReg;
  50. end
  51. always @(*) begin
  52. if (Rst_i) begin
  53. addrRegM = 8'h0;
  54. shiftReg0M = 8'h0;
  55. shiftReg1M = 8'h0;
  56. shiftReg2M = 8'h0;
  57. end
  58. else begin
  59. if (!EndianSel_i) begin
  60. case(WidthSel_i)
  61. 0: begin
  62. addrRegM = addrReg [1:0];
  63. shiftReg0M = shiftReg0[1:0];
  64. shiftReg1M = shiftReg1[1:0];
  65. shiftReg2M = shiftReg2[1:0];
  66. end
  67. 1: begin
  68. addrRegM = addrReg [3:0];
  69. shiftReg0M = shiftReg0[3:0];
  70. shiftReg1M = shiftReg1[3:0];
  71. shiftReg2M = shiftReg2[3:0];
  72. end
  73. 2: begin
  74. addrRegM = addrReg [5:0];
  75. shiftReg0M = shiftReg0[5:0];
  76. shiftReg1M = shiftReg1[5:0];
  77. shiftReg2M = shiftReg2[5:0];
  78. end
  79. 3: begin
  80. addrRegM = addrReg [7:0];
  81. shiftReg0M = shiftReg0[7:0];
  82. shiftReg1M = shiftReg1[7:0];
  83. shiftReg2M = shiftReg2[7:0];
  84. end
  85. endcase
  86. end
  87. else begin
  88. case(WidthSel_i)
  89. 0: begin
  90. addrRegM = addrRegLSB[1:0];
  91. shiftReg0M = shiftReg0LSB[1:0];
  92. shiftReg1M = shiftReg1LSB[1:0];
  93. shiftReg2M = shiftReg2LSB[1:0];
  94. end
  95. 1: begin
  96. addrRegM = addrRegLSB[3:0];
  97. shiftReg0M = shiftReg0LSB[3:0];
  98. shiftReg1M = shiftReg1LSB[3:0];
  99. shiftReg2M = shiftReg2LSB[3:0];
  100. end
  101. 2: begin
  102. addrRegM = addrRegLSB[5:0];
  103. shiftReg0M = shiftReg0LSB[5:0];
  104. shiftReg1M = shiftReg1LSB[5:0];
  105. shiftReg2M = shiftReg2LSB[5:0];
  106. end
  107. 3: begin
  108. addrRegM = addrRegLSB[7:0];
  109. shiftReg0M = shiftReg0LSB[7:0];
  110. shiftReg1M = shiftReg1LSB[7:0];
  111. shiftReg2M = shiftReg2LSB[7:0];
  112. end
  113. endcase
  114. end
  115. end
  116. end
  117. always @(posedge Clk_i) begin
  118. if (Rst_i) begin
  119. Data_o <= 24'h0;
  120. end
  121. else begin
  122. if (!EndianSel_i) begin
  123. if (SELST_i) begin
  124. if (ssReg && !ssRegR) begin
  125. Data_o <= {shiftReg0M, shiftReg1M, shiftReg2M};
  126. end
  127. end
  128. else begin
  129. if (!ssReg && ssRegR) begin
  130. Data_o <= {shiftReg0M, shiftReg1M, shiftReg2M};
  131. end
  132. end
  133. end
  134. else begin
  135. if (SELST_i) begin
  136. if (ssReg && !ssRegR) begin
  137. Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
  138. end
  139. end
  140. else begin
  141. if (!ssReg && ssRegR) begin
  142. Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
  143. end
  144. end
  145. end
  146. end
  147. end
  148. always @(posedge Clk_i) begin
  149. if (Rst_i) begin
  150. DebugData_o <= 192'h0;
  151. end
  152. else begin
  153. DebugData_o <= {shiftReg0Debug,shiftReg1Debug, shiftReg2Debug,shiftReg3Debug};
  154. end
  155. end
  156. always @(posedge Sck_i or posedge Rst_i) begin
  157. if (Rst_i) begin
  158. shiftReg0Debug <= 48'h0;
  159. end
  160. else begin
  161. if (!Ss_i) begin
  162. shiftReg0Debug <= {shiftReg0Debug[46:0], Mosi0_i};
  163. end
  164. else begin
  165. shiftReg0Debug <= 48'h0;
  166. end
  167. end
  168. end
  169. always @(posedge Sck_i or posedge Rst_i) begin
  170. if (Rst_i) begin
  171. shiftReg1Debug <= 48'h0;
  172. end
  173. else begin
  174. if (!Ss_i) begin
  175. shiftReg1Debug <= {shiftReg1Debug[46:0], Mosi1_i};
  176. end
  177. else begin
  178. shiftReg1Debug <= 48'h0;
  179. end
  180. end
  181. end
  182. always @(posedge Sck_i or posedge Rst_i) begin
  183. if (Rst_i) begin
  184. shiftReg2Debug <= 48'h0;
  185. end
  186. else begin
  187. if (!Ss_i) begin
  188. shiftReg2Debug <= {shiftReg2Debug[46:0], Mosi2_i};
  189. end
  190. else begin
  191. shiftReg2Debug <= 48'h0;
  192. end
  193. end
  194. end
  195. always @(posedge Sck_i or posedge Rst_i) begin
  196. if (Rst_i) begin
  197. shiftReg3Debug <= 48'h0;
  198. end
  199. else begin
  200. if (!Ss_i) begin
  201. shiftReg3Debug <= {shiftReg3Debug[46:0], Mosi3_i};
  202. end
  203. else begin
  204. shiftReg3Debug <= 48'h0;
  205. end
  206. end
  207. end
  208. always @(posedge Clk_i) begin
  209. if (Rst_i) begin
  210. Addr_o <= 8'h0;
  211. end
  212. else begin
  213. if (SELST_i) begin
  214. if (ssReg && !ssRegR) begin
  215. Addr_o <= addrRegM;
  216. end
  217. end
  218. else begin
  219. if (!ssReg && ssRegR) begin
  220. Addr_o <= addrRegM;
  221. end
  222. end
  223. end
  224. end
  225. always @(posedge Sck_i) begin
  226. if (Rst_i) begin
  227. shiftReg0 <= 8'h0;
  228. end
  229. else begin
  230. if (SELST_i) begin
  231. if (!Ss_i) begin
  232. shiftReg0 <= {shiftReg0[6:0], Mosi1_i};
  233. end
  234. else begin
  235. shiftReg0 <= 8'h0;
  236. end
  237. end
  238. else begin
  239. if (Ss_i) begin
  240. shiftReg0 <= {shiftReg0[6:0], Mosi1_i};
  241. end
  242. else begin
  243. shiftReg0<= 8'h0;
  244. end
  245. end
  246. end
  247. end
  248. always @(posedge Sck_i ) begin
  249. if (Rst_i) begin
  250. shiftReg1 <= 8'h0;
  251. end
  252. else begin
  253. if (SELST_i) begin
  254. if (!Ss_i) begin
  255. shiftReg1 <= {shiftReg1[6:0], Mosi2_i};
  256. end
  257. else begin
  258. shiftReg1 <= 8'h0;
  259. end
  260. end
  261. else begin
  262. if (Ss_i) begin
  263. shiftReg1 <= {shiftReg1[6:0], Mosi2_i};
  264. end
  265. else begin
  266. shiftReg1 <= 8'h0;
  267. end
  268. end
  269. end
  270. end
  271. always @(posedge Sck_i ) begin
  272. if (Rst_i) begin
  273. shiftReg2 <= 8'h0;
  274. end
  275. else begin
  276. if (SELST_i) begin
  277. if (!Ss_i) begin
  278. shiftReg2 <= {shiftReg2[6:0], Mosi3_i};
  279. end
  280. else begin
  281. shiftReg2 <= 8'h0;
  282. end
  283. end
  284. else begin
  285. if (Ss_i) begin
  286. shiftReg2 <= {shiftReg2[6:0], Mosi3_i};
  287. end
  288. else begin
  289. shiftReg2 <= 8'h0;
  290. end
  291. end
  292. end
  293. end
  294. always @(posedge Sck_i or posedge Rst_i ) begin
  295. if (Rst_i) begin
  296. addrReg <= 8'h0;
  297. end
  298. else begin
  299. if (SELST_i) begin
  300. if (!Ss_i) begin
  301. addrReg <={addrReg[6:0], Mosi0_i};
  302. end
  303. else begin
  304. addrReg <= 8'h0;
  305. end
  306. end
  307. else begin
  308. if (Ss_i) begin
  309. addrReg <= {addrReg[6:0], Mosi0_i};
  310. end
  311. else begin
  312. addrReg <= 8'h0;
  313. end
  314. end
  315. end
  316. end
  317. always @(posedge Sck_i or posedge Rst_i) begin
  318. if (Rst_i) begin
  319. addrRegLSB <= 8'h0;
  320. end
  321. else begin
  322. if (SELST_i) begin
  323. if (!Ss_i) begin
  324. addrRegLSB <= {Mosi3_i, addrRegLSB[7:1]};
  325. end
  326. else begin
  327. addrRegLSB <= 8'h0;
  328. end
  329. end
  330. else begin
  331. if (Ss_i) begin
  332. addrRegLSB <= {Mosi3_i, addrRegLSB[7:1]};
  333. end
  334. else begin
  335. addrRegLSB <= 8'h0;
  336. end
  337. end
  338. end
  339. end
  340. always @(posedge Sck_i or posedge Rst_i) begin
  341. if (Rst_i) begin
  342. shiftReg0LSB <= 8'h0;
  343. end
  344. else begin
  345. if (SELST_i) begin
  346. if (!Ss_i) begin
  347. shiftReg0LSB <= {Mosi0_i, shiftReg0LSB[7:1]};
  348. end
  349. else begin
  350. shiftReg0LSB <= 8'h0;
  351. end
  352. end
  353. else begin
  354. if (Ss_i) begin
  355. shiftReg0LSB <= {Mosi0_i, shiftReg0LSB[7:1]};
  356. end
  357. else begin
  358. shiftReg0LSB <= 8'h0;
  359. end
  360. end
  361. end
  362. end
  363. always @(posedge Sck_i or posedge Rst_i) begin
  364. if (Rst_i) begin
  365. shiftReg1LSB <= 8'h0;
  366. end
  367. else begin
  368. if (SELST_i) begin
  369. if (!Ss_i) begin
  370. shiftReg1LSB <= {Mosi1_i, shiftReg1LSB[7:1]};
  371. end
  372. else begin
  373. shiftReg1LSB <= 8'h0;
  374. end
  375. end
  376. else begin
  377. if (Ss_i) begin
  378. shiftReg1LSB <= {Mosi1_i, shiftReg1LSB[7:1]};
  379. end
  380. else begin
  381. shiftReg1LSB <= 8'h0;
  382. end
  383. end
  384. end
  385. end
  386. always @(posedge Sck_i or posedge Rst_i) begin
  387. if (Rst_i) begin
  388. shiftReg2LSB <= 8'h0;
  389. end
  390. else begin
  391. if (SELST_i) begin
  392. if (!Ss_i) begin
  393. shiftReg2LSB <= {Mosi2_i, shiftReg2LSB[7:1]};
  394. end
  395. else begin
  396. shiftReg2LSB <= 8'h0;
  397. end
  398. end
  399. else begin
  400. if (Ss_i) begin
  401. shiftReg2LSB <= {Mosi2_i, shiftReg2LSB[7:1]};
  402. end
  403. else begin
  404. shiftReg2LSB <= 8'h0;
  405. end
  406. end
  407. end
  408. end
  409. always @(posedge Clk_i) begin
  410. if (SELST_i) begin
  411. if (ssReg && !ssRegR) begin
  412. Val_o <= 1'b1;
  413. end
  414. else begin
  415. Val_o <= 1'b0;
  416. end
  417. end
  418. else begin
  419. if (!ssReg&& ssRegR) begin
  420. Val_o <= 1'b1;
  421. end
  422. else begin
  423. Val_o <= 1'b0;
  424. end
  425. end
  426. end
  427. endmodule