QuadSPIm.v 32 KB

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