QuadSPIm.v 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: QuadSPIm
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description: This is module implements QuadSpi Master protocol. For more info refer
  12. // to the techincal reference manual.
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 1.0 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module QuadSPIm
  22. (
  23. input Clk_i,
  24. input Rst_i,
  25. input Start_i,
  26. input EmptyFlag_i,
  27. input ClockPhase_i,
  28. input [31:0] SpiData_i,
  29. input SelSt_i,
  30. input [1:0] WidthSel_i,
  31. input Lag_i,
  32. input Lead_i,
  33. input EndianSel_i,
  34. input [5:0] Stop_i,
  35. input PulsePol_i,
  36. output reg Mosi0_o,
  37. output reg Mosi1_o,
  38. output reg Mosi2_o,
  39. output reg Mosi3_o,
  40. output reg Sck_o,
  41. output reg Val_o,
  42. output Ss_o
  43. );
  44. //================================================================================
  45. // REG/WIRE
  46. //================================================================================
  47. reg startFlag;
  48. reg startR;
  49. reg [31:0] trCnt;
  50. reg valReg;
  51. reg lineBusy;
  52. reg [5:0] ssCnt;
  53. reg ss;
  54. reg ssR;
  55. reg oldDataFlag;
  56. reg [7:0] mosiReg0;
  57. reg [7:0] mosiReg1;
  58. reg [7:0] mosiReg2;
  59. reg [7:0] mosiReg3;
  60. reg [3:0] ssNum;
  61. reg [2:0] delayCnt;
  62. reg stopFlag;
  63. wire [31:0] txLenght = ssNum+Lag_i+Lead_i;
  64. //================================================================================
  65. // ASSIGNMENTS
  66. //================================================================================
  67. assign Ss_o = ss;
  68. //================================================================================
  69. // CODING
  70. //================================================================================
  71. always @(*) begin
  72. if (Start_i) begin
  73. Val_o = valReg;
  74. end
  75. else begin
  76. Val_o = 1'b0;
  77. end
  78. end
  79. always @(*) begin
  80. if (SelSt_i) begin
  81. if (!ss) begin
  82. lineBusy = 1'b1;
  83. end
  84. else begin
  85. lineBusy = 1'b0;
  86. end
  87. end
  88. else begin
  89. if (ss) begin
  90. lineBusy = 1'b1;
  91. end
  92. else begin
  93. lineBusy = 1'b0;
  94. end
  95. end
  96. end
  97. always @(negedge Clk_i) begin
  98. if (Rst_i) begin
  99. delayCnt <= 1'b0;
  100. end else begin
  101. if (stopFlag) begin
  102. delayCnt <= delayCnt + 1'b1;
  103. end else begin
  104. delayCnt <= 0;
  105. end
  106. end
  107. end
  108. always @(*) begin
  109. if (Rst_i) begin
  110. stopFlag = 1'b0;
  111. end
  112. else begin
  113. if (Stop_i != 0) begin
  114. if (SelSt_i) begin
  115. if (ss && !ssR) begin
  116. stopFlag = 1'b1;
  117. end
  118. else if (delayCnt == Stop_i-1) begin
  119. stopFlag = 1'b0;
  120. end
  121. end
  122. else begin
  123. if (!ss && ssR) begin
  124. stopFlag = 1'b1;
  125. end
  126. else if (delayCnt == Stop_i-1) begin
  127. stopFlag = 1'b0;
  128. end
  129. end
  130. end else begin
  131. stopFlag = 1'b0;
  132. end
  133. end
  134. end
  135. reg [2:0] clkCtrlReg;
  136. always @(*) begin
  137. if (Rst_i) begin
  138. clkCtrlReg = 0;
  139. end else begin
  140. clkCtrlReg = {SelSt_i,PulsePol_i,ClockPhase_i};
  141. end
  142. end
  143. always @(*) begin
  144. if (Rst_i) begin
  145. Sck_o = 0;
  146. end else begin
  147. if (Stop_i!=0) begin
  148. case (clkCtrlReg)
  149. 0: begin
  150. if (!Lag_i) begin
  151. if (!Lead_i) begin
  152. if (ss) begin
  153. Sck_o = Clk_i;
  154. end else begin
  155. Sck_o = 0;
  156. end
  157. end else begin
  158. if (ssCnt < txLenght-1) begin
  159. Sck_o = Clk_i;
  160. end else begin
  161. Sck_o = 0;
  162. end
  163. end
  164. end else begin
  165. if (!Lead_i) begin
  166. if (ssCnt > 0) begin
  167. Sck_o = Clk_i;
  168. end else begin
  169. Sck_o = 0;
  170. end
  171. end else begin
  172. if (ssCnt >0 && ssCnt < txLenght-1) begin
  173. Sck_o = Clk_i;
  174. end else begin
  175. Sck_o = 0;
  176. end
  177. end
  178. end
  179. end
  180. 1: begin
  181. if (!Lag_i) begin
  182. if (!Lead_i) begin
  183. if (ss) begin
  184. Sck_o = !Clk_i;
  185. end else begin
  186. Sck_o = 0;
  187. end
  188. end else begin
  189. if (ssCnt < txLenght-1) begin
  190. Sck_o = !Clk_i;
  191. end else begin
  192. Sck_o = 0;
  193. end
  194. end
  195. end else begin
  196. if (!Lead_i) begin
  197. if (ssCnt > 0) begin
  198. Sck_o = !Clk_i;
  199. end else begin
  200. Sck_o = 0;
  201. end
  202. end else begin
  203. if (ssCnt >0 && ssCnt < txLenght-1) begin
  204. Sck_o = !Clk_i;
  205. end else begin
  206. Sck_o = 0;
  207. end
  208. end
  209. end
  210. end
  211. 2: begin
  212. if (!Lag_i) begin
  213. if (!Lead_i) begin
  214. if (ss) begin
  215. Sck_o = !Clk_i;
  216. end else begin
  217. Sck_o = 0;
  218. end
  219. end else begin
  220. if (ssCnt < txLenght-1) begin
  221. Sck_o = !Clk_i;
  222. end else begin
  223. Sck_o = 0;
  224. end
  225. end
  226. end else begin
  227. if (!Lead_i) begin
  228. if (ssCnt > 0) begin
  229. Sck_o = !Clk_i;
  230. end else begin
  231. Sck_o = 0;
  232. end
  233. end else begin
  234. if (ssCnt >0 && ssCnt < txLenght-1) begin
  235. Sck_o = !Clk_i;
  236. end else begin
  237. Sck_o = 0;
  238. end
  239. end
  240. end
  241. end
  242. 3: begin
  243. if (!Lag_i) begin
  244. if (!Lead_i) begin
  245. if (ss) begin
  246. Sck_o = Clk_i;
  247. end else begin
  248. Sck_o = 0;
  249. end
  250. end else begin
  251. if (ssCnt < txLenght-1) begin
  252. Sck_o = Clk_i;
  253. end else begin
  254. Sck_o = 0;
  255. end
  256. end
  257. end else begin
  258. if (!Lead_i) begin
  259. if (ssCnt > 0) begin
  260. Sck_o = Clk_i;
  261. end else begin
  262. Sck_o = 0;
  263. end
  264. end else begin
  265. if (ssCnt >0 && ssCnt < txLenght-1) begin
  266. Sck_o = Clk_i;
  267. end else begin
  268. Sck_o = 0;
  269. end
  270. end
  271. end
  272. end
  273. 4: begin
  274. if (!Lag_i) begin
  275. if (!Lead_i) begin
  276. if (!ss) begin
  277. Sck_o = Clk_i;
  278. end else begin
  279. Sck_o = 0;
  280. end
  281. end else begin
  282. if (ssCnt < txLenght-1) begin
  283. Sck_o = Clk_i;
  284. end else begin
  285. Sck_o = 0;
  286. end
  287. end
  288. end else begin
  289. if (!Lead_i) begin
  290. if (ssCnt > 0) begin
  291. Sck_o = Clk_i;
  292. end else begin
  293. Sck_o = 0;
  294. end
  295. end else begin
  296. if (ssCnt >0 && ssCnt < txLenght-1) begin
  297. Sck_o = Clk_i;
  298. end else begin
  299. Sck_o = 0;
  300. end
  301. end
  302. end
  303. end
  304. 5: begin
  305. if (!Lag_i) begin
  306. if (!Lead_i) begin
  307. if (!ss) begin
  308. Sck_o = !Clk_i;
  309. end else begin
  310. Sck_o = 0;
  311. end
  312. end else begin
  313. if (ssCnt < txLenght-1) begin
  314. Sck_o = !Clk_i;
  315. end else begin
  316. Sck_o = 0;
  317. end
  318. end
  319. end else begin
  320. if (!Lead_i) begin
  321. if (ssCnt > 0) begin
  322. Sck_o = !Clk_i;
  323. end else begin
  324. Sck_o = 0;
  325. end
  326. end else begin
  327. if (ssCnt >0 && ssCnt < txLenght-1) begin
  328. Sck_o = !Clk_i;
  329. end else begin
  330. Sck_o = 0;
  331. end
  332. end
  333. end
  334. end
  335. 6: begin
  336. if (!Lag_i) begin
  337. if (!Lead_i) begin
  338. if (!ss) begin
  339. Sck_o = !Clk_i;
  340. end else begin
  341. Sck_o = 0;
  342. end
  343. end else begin
  344. if (ssCnt < txLenght-1) begin
  345. Sck_o = !Clk_i;
  346. end else begin
  347. Sck_o = 0;
  348. end
  349. end
  350. end else begin
  351. if (!Lead_i) begin
  352. if (ssCnt > 0) begin
  353. Sck_o = !Clk_i;
  354. end else begin
  355. Sck_o = 0;
  356. end
  357. end else begin
  358. if (ssCnt >0 && ssCnt < txLenght-1) begin
  359. Sck_o = !Clk_i;
  360. end else begin
  361. Sck_o = 0;
  362. end
  363. end
  364. end
  365. end
  366. 7: begin
  367. if (!Lag_i) begin
  368. if (!Lead_i) begin
  369. if (!ss) begin
  370. Sck_o = Clk_i;
  371. end else begin
  372. Sck_o = 0;
  373. end
  374. end else begin
  375. if (ssCnt < txLenght-1) begin
  376. Sck_o = Clk_i;
  377. end else begin
  378. Sck_o = 0;
  379. end
  380. end
  381. end else begin
  382. if (!Lead_i) begin
  383. if (ssCnt > 0) begin
  384. Sck_o = Clk_i;
  385. end else begin
  386. Sck_o = 0;
  387. end
  388. end else begin
  389. if (ssCnt >0 && ssCnt < txLenght-1) begin
  390. Sck_o = Clk_i;
  391. end else begin
  392. Sck_o = 0;
  393. end
  394. end
  395. end
  396. end
  397. endcase
  398. end else begin
  399. if (SelSt_i) begin
  400. if (!ss) begin
  401. if (PulsePol_i) begin
  402. if (ClockPhase_i) begin
  403. Sck_o = Clk_i;
  404. end
  405. else begin
  406. Sck_o = ~Clk_i;
  407. end
  408. end else begin
  409. if (ClockPhase_i) begin
  410. Sck_o = ~Clk_i;
  411. end
  412. else begin
  413. Sck_o = Clk_i;
  414. end
  415. end
  416. end else begin
  417. Sck_o = 1'b0;
  418. end
  419. end else begin
  420. if (ss) begin
  421. if (PulsePol_i) begin
  422. if (ClockPhase_i) begin
  423. Sck_o = Clk_i;
  424. end
  425. else begin
  426. Sck_o = ~Clk_i;
  427. end
  428. end else begin
  429. if (ClockPhase_i) begin
  430. Sck_o = ~Clk_i;
  431. end
  432. else begin
  433. Sck_o = Clk_i;
  434. end
  435. end
  436. end else begin
  437. Sck_o = 1'b0;
  438. end
  439. end
  440. end
  441. end
  442. end
  443. always @(*) begin
  444. if (SelSt_i) begin
  445. if (EndianSel_i) begin
  446. case (WidthSel_i)
  447. 0 : begin
  448. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  449. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  450. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  451. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  452. end
  453. 1 : begin
  454. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  455. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  456. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  457. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  458. end
  459. 2 : begin
  460. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  461. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  462. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  463. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  464. end
  465. 3 : begin
  466. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  467. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  468. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  469. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  470. end
  471. endcase
  472. end
  473. else begin
  474. case (WidthSel_i)
  475. 0 : begin
  476. Mosi0_o = (!ss)? (mosiReg0[1]):1'b0;
  477. Mosi1_o = (!ss)? (mosiReg1[1]):1'b0;
  478. Mosi2_o = (!ss)? (mosiReg2[1]):1'b0;
  479. Mosi3_o = (!ss)? (mosiReg3[1]):1'b0;
  480. end
  481. 1 : begin
  482. Mosi0_o = (!ss)? (mosiReg0[3]):1'b0;
  483. Mosi1_o = (!ss)? (mosiReg1[3]):1'b0;
  484. Mosi2_o = (!ss)? (mosiReg2[3]):1'b0;
  485. Mosi3_o = (!ss)? (mosiReg3[3]):1'b0;
  486. end
  487. 2 : begin
  488. Mosi0_o = (!ss)? (mosiReg0[5]):1'b0;
  489. Mosi1_o = (!ss)? (mosiReg1[5]):1'b0;
  490. Mosi2_o = (!ss)? (mosiReg2[5]):1'b0;
  491. Mosi3_o = (!ss)? (mosiReg3[5]):1'b0;
  492. end
  493. 3 : begin
  494. Mosi0_o = (!ss)? (mosiReg0[7]):1'b0;
  495. Mosi1_o = (!ss)? (mosiReg1[7]):1'b0;
  496. Mosi2_o = (!ss)? (mosiReg2[7]):1'b0;
  497. Mosi3_o = (!ss)? (mosiReg3[7]):1'b0;
  498. end
  499. endcase
  500. end
  501. end
  502. else begin
  503. if (EndianSel_i) begin
  504. case (WidthSel_i)
  505. 0 : begin
  506. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  507. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  508. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  509. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  510. end
  511. 1 : begin
  512. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  513. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  514. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  515. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  516. end
  517. 2 : begin
  518. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  519. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  520. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  521. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  522. end
  523. 3 : begin
  524. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  525. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  526. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  527. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  528. end
  529. endcase
  530. end
  531. else begin
  532. case (WidthSel_i)
  533. 0 : begin
  534. Mosi0_o = (ss)? (mosiReg0[1]):1'b0;
  535. Mosi1_o = (ss)? (mosiReg1[1]):1'b0;
  536. Mosi2_o = (ss)? (mosiReg2[1]):1'b0;
  537. Mosi3_o = (ss)? (mosiReg3[1]):1'b0;
  538. end
  539. 1 : begin
  540. Mosi0_o = (ss)? (mosiReg0[3]):1'b0;
  541. Mosi1_o = (ss)? (mosiReg1[3]):1'b0;
  542. Mosi2_o = (ss)? (mosiReg2[3]):1'b0;
  543. Mosi3_o = (ss)? (mosiReg3[3]):1'b0;
  544. end
  545. 2 : begin
  546. Mosi0_o = (ss)? (mosiReg0[5]):1'b0;
  547. Mosi1_o = (ss)? (mosiReg1[5]):1'b0;
  548. Mosi2_o = (ss)? (mosiReg2[5]):1'b0;
  549. Mosi3_o = (ss)? (mosiReg3[5]):1'b0;
  550. end
  551. 3 : begin
  552. Mosi0_o = (ss)? (mosiReg0[7]):1'b0;
  553. Mosi1_o = (ss)? (mosiReg1[7]):1'b0;
  554. Mosi2_o = (ss)? (mosiReg2[7]):1'b0;
  555. Mosi3_o = (ss)? (mosiReg3[7]):1'b0;
  556. end
  557. endcase
  558. end
  559. end
  560. end
  561. always @(posedge Clk_i) begin
  562. ssR <= ss;
  563. end
  564. always @(posedge Clk_i) begin
  565. if (Rst_i) begin
  566. valReg <= 0;
  567. end else begin
  568. if (ssCnt == txLenght-3) begin
  569. if (!valReg) begin
  570. valReg <= 1;
  571. end else begin
  572. valReg <= 0;
  573. end
  574. end else begin
  575. valReg <= 0;
  576. end
  577. end
  578. end
  579. always @(*) begin
  580. if (Rst_i) begin
  581. startFlag = 1'b0;
  582. end
  583. else begin
  584. if (Start_i && !stopFlag && !EmptyFlag_i ) begin
  585. startFlag = 1'b1;
  586. end
  587. else begin
  588. startFlag = 1'b0;
  589. end
  590. end
  591. end
  592. always @(*) begin
  593. if (Rst_i) begin
  594. ssNum = 1'b0;
  595. end
  596. else begin
  597. case (WidthSel_i)
  598. 0 : begin
  599. ssNum = 2;
  600. end
  601. 1 : begin
  602. ssNum = 4;
  603. end
  604. 2 : begin
  605. ssNum = 6;
  606. end
  607. 3 : begin
  608. ssNum = 8;
  609. end
  610. endcase
  611. end
  612. end
  613. always @(negedge Clk_i) begin
  614. if (Rst_i) begin
  615. ssCnt <= 0;
  616. end
  617. else begin
  618. if (SelSt_i) begin
  619. if (!ss) begin
  620. if (ssCnt != txLenght-1) begin
  621. ssCnt <= ssCnt + 1;
  622. end else begin
  623. ssCnt <= 0;
  624. end
  625. end else begin
  626. ssCnt <= 0;
  627. end
  628. end else begin
  629. if (ss) begin
  630. if (ssCnt != txLenght-1) begin
  631. ssCnt <= ssCnt + 1;
  632. end else begin
  633. ssCnt <= 0;
  634. end
  635. end else begin
  636. ssCnt <= 0;
  637. end
  638. end
  639. end
  640. end
  641. always @(negedge Clk_i) begin
  642. if (Rst_i) begin
  643. ss <= 1'b1;
  644. end else begin
  645. if (Stop_i != 0) begin
  646. if (startFlag) begin
  647. if (SelSt_i) begin
  648. if (ssCnt != txLenght-1) begin
  649. ss <= 1'b0;
  650. end
  651. else begin
  652. ss <= 1'b1;
  653. end
  654. end else begin
  655. if (ssCnt != txLenght-1) begin
  656. ss <= 1'b1;
  657. end
  658. else begin
  659. ss <= 1'b0;
  660. end
  661. end
  662. end else begin
  663. if (SelSt_i) begin
  664. ss <= 1'b1;
  665. end else begin
  666. ss <= 1'b0;
  667. end
  668. end
  669. end else begin
  670. if (startFlag) begin
  671. if (SelSt_i) begin
  672. ss <= 1'b0;
  673. end else begin
  674. ss <= 1'b1;
  675. end
  676. end else begin
  677. if (SelSt_i) begin
  678. ss <= 1'b1;
  679. end else begin
  680. ss <= 1'b0;
  681. end
  682. end
  683. end
  684. end
  685. end
  686. always @(negedge Clk_i) begin
  687. if (Rst_i) begin
  688. mosiReg3 <= SpiData_i[7:0];
  689. mosiReg2 <= SpiData_i[15:8];
  690. mosiReg1 <= SpiData_i[23:16];
  691. mosiReg0 <= SpiData_i[31:24];
  692. end
  693. else begin
  694. case (WidthSel_i)
  695. 3: begin
  696. if (!EndianSel_i) begin
  697. if (SelSt_i) begin
  698. if (Lag_i != 0) begin
  699. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  700. mosiReg3 <= {mosiReg3[6:0],1'b0};
  701. mosiReg2 <= {mosiReg2[6:0],1'b0};
  702. mosiReg1 <= {mosiReg1[6:0],1'b0};
  703. mosiReg0 <= {mosiReg0[6:0],1'b0};
  704. end
  705. else begin
  706. mosiReg3 <= SpiData_i[7:0];
  707. mosiReg2 <= SpiData_i[15:8];
  708. mosiReg1 <= SpiData_i[23:16];
  709. mosiReg0 <= SpiData_i[31:24];
  710. end
  711. end else begin
  712. if (!ss&& (ssCnt < txLenght-1)) begin
  713. mosiReg3 <= {mosiReg3[6:0],1'b0};
  714. mosiReg2 <= {mosiReg2[6:0],1'b0};
  715. mosiReg1 <= {mosiReg1[6:0],1'b0};
  716. mosiReg0 <= {mosiReg0[6:0],1'b0};
  717. end
  718. else begin
  719. mosiReg3 <= SpiData_i[7:0];
  720. mosiReg2 <= SpiData_i[15:8];
  721. mosiReg1 <= SpiData_i[23:16];
  722. mosiReg0 <= SpiData_i[31:24];
  723. end
  724. end
  725. end
  726. else begin
  727. if (Lag_i != 0) begin
  728. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  729. mosiReg3 <= {mosiReg3[6:0],1'b0};
  730. mosiReg2 <= {mosiReg2[6:0],1'b0};
  731. mosiReg1 <= {mosiReg1[6:0],1'b0};
  732. mosiReg0 <= {mosiReg0[6:0],1'b0};
  733. end
  734. else begin
  735. mosiReg3 <= SpiData_i[7:0];
  736. mosiReg2 <= SpiData_i[15:8];
  737. mosiReg1 <= SpiData_i[23:16];
  738. mosiReg0 <= SpiData_i[31:24];
  739. end
  740. end else begin
  741. if (!ss&& (ssCnt < txLenght-1)) begin
  742. mosiReg3 <= {mosiReg3[6:0],1'b0};
  743. mosiReg2 <= {mosiReg2[6:0],1'b0};
  744. mosiReg1 <= {mosiReg1[6:0],1'b0};
  745. mosiReg0 <= {mosiReg0[6:0],1'b0};
  746. end
  747. else begin
  748. mosiReg3 <= SpiData_i[7:0];
  749. mosiReg2 <= SpiData_i[15:8];
  750. mosiReg1 <= SpiData_i[23:16];
  751. mosiReg0 <= SpiData_i[31:24];
  752. end
  753. end
  754. end
  755. end
  756. else begin
  757. if (SelSt_i) begin
  758. if (Lag_i != 0) begin
  759. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  760. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  761. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  762. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  763. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  764. end
  765. else begin
  766. mosiReg3 <= SpiData_i[7:0];
  767. mosiReg2 <= SpiData_i[15:8];
  768. mosiReg1 <= SpiData_i[23:16];
  769. mosiReg0 <= SpiData_i[31:24];
  770. end
  771. end else begin
  772. if (!ss&& (ssCnt < txLenght-1)) begin
  773. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  774. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  775. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  776. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  777. end
  778. else begin
  779. mosiReg3 <= SpiData_i[7:0];
  780. mosiReg2 <= SpiData_i[15:8];
  781. mosiReg1 <= SpiData_i[23:16];
  782. mosiReg0 <= SpiData_i[31:24];
  783. end
  784. end
  785. end
  786. else begin
  787. if (Lag_i != 0) begin
  788. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  789. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  790. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  791. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  792. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  793. end
  794. else begin
  795. mosiReg3 <= SpiData_i[7:0];
  796. mosiReg2 <= SpiData_i[15:8];
  797. mosiReg1 <= SpiData_i[23:16];
  798. mosiReg0 <= SpiData_i[31:24];
  799. end
  800. end else begin
  801. if (!ss&& (ssCnt < txLenght-1)) begin
  802. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  803. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  804. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  805. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  806. end
  807. else begin
  808. mosiReg3 <= SpiData_i[7:0];
  809. mosiReg2 <= SpiData_i[15:8];
  810. mosiReg1 <= SpiData_i[23:16];
  811. mosiReg0 <= SpiData_i[31:24];
  812. end
  813. end
  814. end
  815. end
  816. end
  817. 2: begin
  818. if (!EndianSel_i) begin
  819. if (SelSt_i) begin
  820. if (Lag_i != 0) begin
  821. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  822. mosiReg3 <= mosiReg3 << 1;
  823. mosiReg2 <= mosiReg2 << 1;
  824. mosiReg1 <= mosiReg1 << 1;
  825. mosiReg0 <= mosiReg0 << 1;
  826. end
  827. else begin
  828. mosiReg3 <= SpiData_i[5:0];
  829. mosiReg2 <= SpiData_i[11:6];
  830. mosiReg1 <= SpiData_i[17:12];
  831. mosiReg0 <= SpiData_i[23:18];
  832. end
  833. end else begin
  834. if (!ss&& (ssCnt < txLenght-1)) begin
  835. mosiReg3 <= mosiReg3 << 1;
  836. mosiReg2 <= mosiReg2 << 1;
  837. mosiReg1 <= mosiReg1 << 1;
  838. mosiReg0 <= mosiReg0 << 1;
  839. end
  840. else begin
  841. mosiReg3 <= SpiData_i[5:0];
  842. mosiReg2 <= SpiData_i[11:6];
  843. mosiReg1 <= SpiData_i[17:12];
  844. mosiReg0 <= SpiData_i[23:18];
  845. end
  846. end
  847. end
  848. else begin
  849. if (Lag_i != 0) begin
  850. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  851. mosiReg3 <= mosiReg3 << 1;
  852. mosiReg2 <= mosiReg2 << 1;
  853. mosiReg1 <= mosiReg1 << 1;
  854. mosiReg0 <= mosiReg0 << 1;
  855. end
  856. else begin
  857. mosiReg3 <= SpiData_i[5:0];
  858. mosiReg2 <= SpiData_i[11:6];
  859. mosiReg1 <= SpiData_i[17:12];
  860. mosiReg0 <= SpiData_i[23:18];
  861. end
  862. end else begin
  863. if (!ss&& (ssCnt < txLenght-1)) begin
  864. mosiReg3 <= mosiReg3 << 1;
  865. mosiReg2 <= mosiReg2 << 1;
  866. mosiReg1 <= mosiReg1 << 1;
  867. mosiReg0 <= mosiReg0 << 1;
  868. end
  869. else begin
  870. mosiReg3 <= SpiData_i[5:0];
  871. mosiReg2 <= SpiData_i[11:6];
  872. mosiReg1 <= SpiData_i[17:12];
  873. mosiReg0 <= SpiData_i[23:18];
  874. end
  875. end
  876. end
  877. end
  878. else begin
  879. if (SelSt_i) begin
  880. if (Lag_i != 0) begin
  881. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  882. mosiReg3 <= mosiReg3 >> 1;
  883. mosiReg2 <= mosiReg2 >> 1;
  884. mosiReg1 <= mosiReg1 >> 1;
  885. mosiReg0 <= mosiReg0 >> 1;
  886. end
  887. else begin
  888. mosiReg3 <= SpiData_i[5:0];
  889. mosiReg2 <= SpiData_i[11:6];
  890. mosiReg1 <= SpiData_i[17:12];
  891. mosiReg0 <= SpiData_i[23:18];
  892. end
  893. end else begin
  894. if (!ss&& (ssCnt < txLenght-1)) begin
  895. mosiReg3 <= mosiReg3 >> 1;
  896. mosiReg2 <= mosiReg2 >> 1;
  897. mosiReg1 <= mosiReg1 >> 1;
  898. mosiReg0 <= mosiReg0 >> 1;
  899. end
  900. else begin
  901. mosiReg3 <= SpiData_i[5:0];
  902. mosiReg2 <= SpiData_i[11:6];
  903. mosiReg1 <= SpiData_i[17:12];
  904. mosiReg0 <= SpiData_i[23:18];
  905. end
  906. end
  907. end
  908. else begin
  909. if (Lag_i != 0) begin
  910. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  911. mosiReg3 <= mosiReg3 >> 1;
  912. mosiReg2 <= mosiReg2 >> 1;
  913. mosiReg1 <= mosiReg1 >> 1;
  914. mosiReg0 <= mosiReg0 >> 1;
  915. end
  916. else begin
  917. mosiReg3 <= SpiData_i[5:0];
  918. mosiReg2 <= SpiData_i[11:6];
  919. mosiReg1 <= SpiData_i[17:12];
  920. mosiReg0 <= SpiData_i[23:18];
  921. end
  922. end else begin
  923. if (!ss&& (ssCnt < txLenght-1)) begin
  924. mosiReg3 <= mosiReg3 >> 1;
  925. mosiReg2 <= mosiReg2 >> 1;
  926. mosiReg1 <= mosiReg1 >> 1;
  927. mosiReg0 <= mosiReg0 >> 1;
  928. end
  929. else begin
  930. mosiReg3 <= SpiData_i[5:0];
  931. mosiReg2 <= SpiData_i[11:6];
  932. mosiReg1 <= SpiData_i[17:12];
  933. mosiReg0 <= SpiData_i[23:18];
  934. end
  935. end
  936. end
  937. end
  938. end
  939. 1: begin
  940. if (!EndianSel_i) begin
  941. if (SelSt_i) begin
  942. if (Lag_i != 0) begin
  943. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  944. mosiReg3 <= mosiReg3 << 1;
  945. mosiReg2 <= mosiReg2 << 1;
  946. mosiReg1 <= mosiReg1 << 1;
  947. mosiReg0 <= mosiReg0 << 1;
  948. end
  949. else begin
  950. mosiReg3 <= SpiData_i[3:0];
  951. mosiReg2 <= SpiData_i[7:4];
  952. mosiReg1 <= SpiData_i[11:8];
  953. mosiReg0 <= SpiData_i[15:12];
  954. end
  955. end else begin
  956. if (!ss&& (ssCnt < txLenght-1)) begin
  957. mosiReg3 <= mosiReg3 << 1;
  958. mosiReg2 <= mosiReg2 << 1;
  959. mosiReg1 <= mosiReg1 << 1;
  960. mosiReg0 <= mosiReg0 << 1;
  961. end
  962. else begin
  963. mosiReg3 <= SpiData_i[3:0];
  964. mosiReg2 <= SpiData_i[7:4];
  965. mosiReg1 <= SpiData_i[11:8];
  966. mosiReg0 <= SpiData_i[15:12];
  967. end
  968. end
  969. end
  970. else begin
  971. if (Lag_i != 0) begin
  972. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  973. mosiReg3 <= mosiReg3 << 1;
  974. mosiReg2 <= mosiReg2 << 1;
  975. mosiReg1 <= mosiReg1 << 1;
  976. mosiReg0 <= mosiReg0 << 1;
  977. end
  978. else begin
  979. mosiReg3 <= SpiData_i[3:0];
  980. mosiReg2 <= SpiData_i[7:4];
  981. mosiReg1 <= SpiData_i[11:8];
  982. mosiReg0 <= SpiData_i[15:12];
  983. end
  984. end else begin
  985. if (!ss&& (ssCnt < txLenght-1)) begin
  986. mosiReg3 <= mosiReg3 << 1;
  987. mosiReg2 <= mosiReg2 << 1;
  988. mosiReg1 <= mosiReg1 << 1;
  989. mosiReg0 <= mosiReg0 << 1;
  990. end
  991. else begin
  992. mosiReg3 <= SpiData_i[3:0];
  993. mosiReg2 <= SpiData_i[7:4];
  994. mosiReg1 <= SpiData_i[11:8];
  995. mosiReg0 <= SpiData_i[15:12];
  996. end
  997. end
  998. end
  999. end
  1000. else begin
  1001. if (SelSt_i) begin
  1002. if (Lag_i != 0) begin
  1003. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1004. mosiReg3 <= mosiReg3 >> 1;
  1005. mosiReg2 <= mosiReg2 >> 1;
  1006. mosiReg1 <= mosiReg1 >> 1;
  1007. mosiReg0 <= mosiReg0 >> 1;
  1008. end
  1009. else begin
  1010. mosiReg3 <= SpiData_i[3:0];
  1011. mosiReg2 <= SpiData_i[7:4];
  1012. mosiReg1 <= SpiData_i[11:8];
  1013. mosiReg0 <= SpiData_i[15:12];
  1014. end
  1015. end else begin
  1016. if (!ss&& (ssCnt < txLenght-1)) begin
  1017. mosiReg3 <= mosiReg3 >> 1;
  1018. mosiReg2 <= mosiReg2 >> 1;
  1019. mosiReg1 <= mosiReg1 >> 1;
  1020. mosiReg0 <= mosiReg0 >> 1;
  1021. end
  1022. else begin
  1023. mosiReg3 <= SpiData_i[3:0];
  1024. mosiReg2 <= SpiData_i[7:4];
  1025. mosiReg1 <= SpiData_i[11:8];
  1026. mosiReg0 <= SpiData_i[15:12];
  1027. end
  1028. end
  1029. end
  1030. else begin
  1031. if (Lag_i != 0) begin
  1032. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1033. mosiReg3 <= mosiReg3 >> 1;
  1034. mosiReg2 <= mosiReg2 >> 1;
  1035. mosiReg1 <= mosiReg1 >> 1;
  1036. mosiReg0 <= mosiReg0 >> 1;
  1037. end
  1038. else begin
  1039. mosiReg3 <= SpiData_i[3:0];
  1040. mosiReg2 <= SpiData_i[7:4];
  1041. mosiReg1 <= SpiData_i[11:8];
  1042. mosiReg0 <= SpiData_i[15:12];
  1043. end
  1044. end else begin
  1045. if (!ss&& (ssCnt < txLenght-1)) begin
  1046. mosiReg3 <= mosiReg3 >> 1;
  1047. mosiReg2 <= mosiReg2 >> 1;
  1048. mosiReg1 <= mosiReg1 >> 1;
  1049. mosiReg0 <= mosiReg0 >> 1;
  1050. end
  1051. else begin
  1052. mosiReg3 <= SpiData_i[3:0];
  1053. mosiReg2 <= SpiData_i[7:4];
  1054. mosiReg1 <= SpiData_i[11:8];
  1055. mosiReg0 <= SpiData_i[15:12];
  1056. end
  1057. end
  1058. end
  1059. end
  1060. end
  1061. 0: begin
  1062. if (!EndianSel_i) begin
  1063. if (SelSt_i) begin
  1064. if (Lag_i != 0) begin
  1065. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1066. mosiReg3 <= mosiReg3 << 1;
  1067. mosiReg2 <= mosiReg2 << 1;
  1068. mosiReg1 <= mosiReg1 << 1;
  1069. mosiReg0 <= mosiReg0 << 1;
  1070. end
  1071. else begin
  1072. mosiReg3 <= SpiData_i[1:0];
  1073. mosiReg2 <= SpiData_i[3:2];
  1074. mosiReg1 <= SpiData_i[5:4];
  1075. mosiReg0 <= SpiData_i[7:6];
  1076. end
  1077. end else begin
  1078. if (!ss&& (ssCnt < txLenght-1)) begin
  1079. mosiReg3 <= mosiReg3 << 1;
  1080. mosiReg2 <= mosiReg2 << 1;
  1081. mosiReg1 <= mosiReg1 << 1;
  1082. mosiReg0 <= mosiReg0 << 1;
  1083. end
  1084. else begin
  1085. mosiReg3 <= SpiData_i[1:0];
  1086. mosiReg2 <= SpiData_i[3:2];
  1087. mosiReg1 <= SpiData_i[5:4];
  1088. mosiReg0 <= SpiData_i[7:6];
  1089. end
  1090. end
  1091. end
  1092. else begin
  1093. if (Lag_i != 0) begin
  1094. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1095. mosiReg3 <= mosiReg3 << 1;
  1096. mosiReg2 <= mosiReg2 << 1;
  1097. mosiReg1 <= mosiReg1 << 1;
  1098. mosiReg0 <= mosiReg0 << 1;
  1099. end
  1100. else begin
  1101. mosiReg3 <= SpiData_i[1:0];
  1102. mosiReg2 <= SpiData_i[3:2];
  1103. mosiReg1 <= SpiData_i[5:4];
  1104. mosiReg0 <= SpiData_i[7:6];
  1105. end
  1106. end else begin
  1107. if (!ss&& (ssCnt < txLenght-1)) begin
  1108. mosiReg3 <= mosiReg3 << 1;
  1109. mosiReg2 <= mosiReg2 << 1;
  1110. mosiReg1 <= mosiReg1 << 1;
  1111. mosiReg0 <= mosiReg0 << 1;
  1112. end
  1113. else begin
  1114. mosiReg3 <= SpiData_i[1:0];
  1115. mosiReg2 <= SpiData_i[3:2];
  1116. mosiReg1 <= SpiData_i[5:4];
  1117. mosiReg0 <= SpiData_i[7:6];
  1118. end
  1119. end
  1120. end
  1121. end
  1122. else begin
  1123. if (SelSt_i) begin
  1124. if (Lag_i != 0) begin
  1125. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1126. mosiReg3 <= mosiReg3 >> 1;
  1127. mosiReg2 <= mosiReg2 >> 1;
  1128. mosiReg1 <= mosiReg1 >> 1;
  1129. mosiReg0 <= mosiReg0 >> 1;
  1130. end
  1131. else begin
  1132. mosiReg3 <= SpiData_i[1:0];
  1133. mosiReg2 <= SpiData_i[3:2];
  1134. mosiReg1 <= SpiData_i[5:4];
  1135. mosiReg0 <= SpiData_i[7:6];
  1136. end
  1137. end else begin
  1138. if (!ss&& (ssCnt < txLenght-1)) begin
  1139. mosiReg3 <= mosiReg3 >> 1;
  1140. mosiReg2 <= mosiReg2 >> 1;
  1141. mosiReg1 <= mosiReg1 >> 1;
  1142. mosiReg0 <= mosiReg0 >> 1;
  1143. end
  1144. else begin
  1145. mosiReg3 <= SpiData_i[1:0];
  1146. mosiReg2 <= SpiData_i[3:2];
  1147. mosiReg1 <= SpiData_i[5:4];
  1148. mosiReg0 <= SpiData_i[7:6];
  1149. end
  1150. end
  1151. end
  1152. else begin
  1153. if (Lag_i != 0) begin
  1154. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1155. mosiReg3 <= mosiReg3 >> 1;
  1156. mosiReg2 <= mosiReg2 >> 1;
  1157. mosiReg1 <= mosiReg1 >> 1;
  1158. mosiReg0 <= mosiReg0 >> 1;
  1159. end
  1160. else begin
  1161. mosiReg3 <= SpiData_i[1:0];
  1162. mosiReg2 <= SpiData_i[3:2];
  1163. mosiReg1 <= SpiData_i[5:4];
  1164. mosiReg0 <= SpiData_i[7:6];
  1165. end
  1166. end else begin
  1167. if (!ss&& (ssCnt < txLenght-1)) begin
  1168. mosiReg3 <= mosiReg3 >> 1;
  1169. mosiReg2 <= mosiReg2 >> 1;
  1170. mosiReg1 <= mosiReg1 >> 1;
  1171. mosiReg0 <= mosiReg0 >> 1;
  1172. end
  1173. else begin
  1174. mosiReg3 <= SpiData_i[1:0];
  1175. mosiReg2 <= SpiData_i[3:2];
  1176. mosiReg1 <= SpiData_i[5:4];
  1177. mosiReg0 <= SpiData_i[7:6];
  1178. end
  1179. end
  1180. end
  1181. end
  1182. end
  1183. endcase
  1184. end
  1185. end
  1186. endmodule