QuadSPIs.v 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  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. if (ssReg && !ssRegR) begin
  154. DebugData_o <= {shiftReg0Debug,shiftReg1Debug, shiftReg2Debug,shiftReg3Debug};
  155. end
  156. end
  157. end
  158. always @(posedge Sck_i or posedge Rst_i) begin
  159. if (Rst_i) begin
  160. shiftReg0Debug <= 48'h0;
  161. end
  162. else begin
  163. if (!Ss_i) begin
  164. shiftReg0Debug <= {shiftReg0Debug[46:0], Mosi0_i};
  165. end
  166. else begin
  167. shiftReg0Debug <= 48'h0;
  168. end
  169. end
  170. end
  171. always @(posedge Sck_i or posedge Rst_i) begin
  172. if (Rst_i) begin
  173. shiftReg1Debug <= 48'h0;
  174. end
  175. else begin
  176. if (!Ss_i) begin
  177. shiftReg1Debug <= {shiftReg1Debug[46:0], Mosi1_i};
  178. end
  179. else begin
  180. shiftReg1Debug <= 48'h0;
  181. end
  182. end
  183. end
  184. always @(posedge Sck_i or posedge Rst_i) begin
  185. if (Rst_i) begin
  186. shiftReg2Debug <= 48'h0;
  187. end
  188. else begin
  189. if (!Ss_i) begin
  190. shiftReg2Debug <= {shiftReg2Debug[46:0], Mosi2_i};
  191. end
  192. else begin
  193. shiftReg2Debug <= 48'h0;
  194. end
  195. end
  196. end
  197. always @(posedge Sck_i or posedge Rst_i) begin
  198. if (Rst_i) begin
  199. shiftReg3Debug <= 48'h0;
  200. end
  201. else begin
  202. if (!Ss_i) begin
  203. shiftReg3Debug <= {shiftReg3Debug[46:0], Mosi3_i};
  204. end
  205. else begin
  206. shiftReg3Debug <= 48'h0;
  207. end
  208. end
  209. end
  210. always @(posedge Clk_i) begin
  211. if (Rst_i) begin
  212. Addr_o <= 8'h0;
  213. end
  214. else begin
  215. if (SELST_i) begin
  216. if (ssReg && !ssRegR) begin
  217. Addr_o <= addrRegM;
  218. end
  219. end
  220. else begin
  221. if (!ssReg && ssRegR) begin
  222. Addr_o <= addrRegM;
  223. end
  224. end
  225. end
  226. end
  227. always @(posedge Sck_i) begin
  228. if (Rst_i) begin
  229. shiftReg0 <= 8'h0;
  230. end
  231. else begin
  232. if (SELST_i) begin
  233. if (!Ss_i) begin
  234. shiftReg0 <= {shiftReg0[6:0], Mosi1_i};
  235. end
  236. else begin
  237. shiftReg0 <= 8'h0;
  238. end
  239. end
  240. else begin
  241. if (Ss_i) begin
  242. shiftReg0 <= {shiftReg0[6:0], Mosi1_i};
  243. end
  244. else begin
  245. shiftReg0<= 8'h0;
  246. end
  247. end
  248. end
  249. end
  250. always @(posedge Sck_i ) begin
  251. if (Rst_i) begin
  252. shiftReg1 <= 8'h0;
  253. end
  254. else begin
  255. if (SELST_i) begin
  256. if (!Ss_i) begin
  257. shiftReg1 <= {shiftReg1[6:0], Mosi2_i};
  258. end
  259. else begin
  260. shiftReg1 <= 8'h0;
  261. end
  262. end
  263. else begin
  264. if (Ss_i) begin
  265. shiftReg1 <= {shiftReg1[6:0], Mosi2_i};
  266. end
  267. else begin
  268. shiftReg1 <= 8'h0;
  269. end
  270. end
  271. end
  272. end
  273. always @(posedge Sck_i ) begin
  274. if (Rst_i) begin
  275. shiftReg2 <= 8'h0;
  276. end
  277. else begin
  278. if (SELST_i) begin
  279. if (!Ss_i) begin
  280. shiftReg2 <= {shiftReg2[6:0], Mosi3_i};
  281. end
  282. else begin
  283. shiftReg2 <= 8'h0;
  284. end
  285. end
  286. else begin
  287. if (Ss_i) begin
  288. shiftReg2 <= {shiftReg2[6:0], Mosi3_i};
  289. end
  290. else begin
  291. shiftReg2 <= 8'h0;
  292. end
  293. end
  294. end
  295. end
  296. always @(posedge Sck_i or posedge Rst_i ) begin
  297. if (Rst_i) begin
  298. addrReg <= 8'h0;
  299. end
  300. else begin
  301. if (SELST_i) begin
  302. if (!Ss_i) begin
  303. addrReg <={addrReg[6:0], Mosi0_i};
  304. end
  305. else begin
  306. addrReg <= 8'h0;
  307. end
  308. end
  309. else begin
  310. if (Ss_i) begin
  311. addrReg <= {addrReg[6:0], Mosi0_i};
  312. end
  313. else begin
  314. addrReg <= 8'h0;
  315. end
  316. end
  317. end
  318. end
  319. always @(posedge Sck_i or posedge Rst_i) begin
  320. if (Rst_i) begin
  321. addrRegLSB <= 8'h0;
  322. end
  323. else begin
  324. if (SELST_i) begin
  325. if (!Ss_i) begin
  326. addrRegLSB <= {Mosi3_i, addrRegLSB[7:1]};
  327. end
  328. else begin
  329. addrRegLSB <= 8'h0;
  330. end
  331. end
  332. else begin
  333. if (Ss_i) begin
  334. addrRegLSB <= {Mosi3_i, addrRegLSB[7:1]};
  335. end
  336. else begin
  337. addrRegLSB <= 8'h0;
  338. end
  339. end
  340. end
  341. end
  342. always @(posedge Sck_i or posedge Rst_i) begin
  343. if (Rst_i) begin
  344. shiftReg0LSB <= 8'h0;
  345. end
  346. else begin
  347. if (SELST_i) begin
  348. if (!Ss_i) begin
  349. shiftReg0LSB <= {Mosi0_i, shiftReg0LSB[7:1]};
  350. end
  351. else begin
  352. shiftReg0LSB <= 8'h0;
  353. end
  354. end
  355. else begin
  356. if (Ss_i) begin
  357. shiftReg0LSB <= {Mosi0_i, shiftReg0LSB[7:1]};
  358. end
  359. else begin
  360. shiftReg0LSB <= 8'h0;
  361. end
  362. end
  363. end
  364. end
  365. always @(posedge Sck_i or posedge Rst_i) begin
  366. if (Rst_i) begin
  367. shiftReg1LSB <= 8'h0;
  368. end
  369. else begin
  370. if (SELST_i) begin
  371. if (!Ss_i) begin
  372. shiftReg1LSB <= {Mosi1_i, shiftReg1LSB[7:1]};
  373. end
  374. else begin
  375. shiftReg1LSB <= 8'h0;
  376. end
  377. end
  378. else begin
  379. if (Ss_i) begin
  380. shiftReg1LSB <= {Mosi1_i, shiftReg1LSB[7:1]};
  381. end
  382. else begin
  383. shiftReg1LSB <= 8'h0;
  384. end
  385. end
  386. end
  387. end
  388. always @(posedge Sck_i or posedge Rst_i) begin
  389. if (Rst_i) begin
  390. shiftReg2LSB <= 8'h0;
  391. end
  392. else begin
  393. if (SELST_i) begin
  394. if (!Ss_i) begin
  395. shiftReg2LSB <= {Mosi2_i, shiftReg2LSB[7:1]};
  396. end
  397. else begin
  398. shiftReg2LSB <= 8'h0;
  399. end
  400. end
  401. else begin
  402. if (Ss_i) begin
  403. shiftReg2LSB <= {Mosi2_i, shiftReg2LSB[7:1]};
  404. end
  405. else begin
  406. shiftReg2LSB <= 8'h0;
  407. end
  408. end
  409. end
  410. end
  411. always @(posedge Clk_i) begin
  412. if (SELST_i) begin
  413. if (ssReg && !ssRegR) begin
  414. Val_o <= 1'b1;
  415. end
  416. else begin
  417. Val_o <= 1'b0;
  418. end
  419. end
  420. else begin
  421. if (!ssReg&& ssRegR) begin
  422. Val_o <= 1'b1;
  423. end
  424. else begin
  425. Val_o <= 1'b0;
  426. end
  427. end
  428. end
  429. endmodule